Uefi Application小游戏开发之推箱子
小游戏之推箱子
推箱子(Pushbox)是一个经典的益智游戏,其C语言实现需要设计一个游戏循环,处理用户输入,并更新游戏状态
- 创建地图 game_map[20][20]
- While{} 循环检测按键输入,gST->ConIn->ReadKeyStroke(gST->ConIn,&key)读取按键信息
- 初始人物的位置为S 位置为 game_map [1][2],X=1 ,Y=2
- 处理上下左右按键,处理按键上下左右,更新地图信息,上X-1,如果 game_map[x-1][y]==' ',那么就替换 game_map[x-1][y]和game_map[x][y],如果下一格对应到(game_map[x-1][y]=='O')那就要考虑game_map[x-2][y]是什么 如果为 ' '那就是S 和 O 一起走一步,如果无法走就不执行,其他的方向操作原理相同,然后更新打印
UEFI模拟器可直接运行
/** @file
This sample application bases on HelloWorld PCD setting
to print "UEFI Hello World!" to the UEFI Console.
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Library/DebugLib.h>
#include <string.h>
#include <stdlib.h>
#include <Library/ShellCommandLib.h>
#include <Protocol/ShellParameters.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/GraphicsOutput.h>
char game_map[20][20]={"##########",
"##S ###",
"##O### #",
"# O O #",
"# **# O ##",
"##**# ##",
"##########"};
int cnt=0;
int x=1,y=2;
//
void PrintGameMap() {
gST->ConOut->ClearScreen (gST->ConOut);
Print(L"Sokoban game\n");
for (int i = 0; i < 6; i++) {
Print (L"%a", (UINTN)game_map[i]);
Print(L"\n");
}
Print(L"You are S you can move with down up left right,Please let O in *\n");
}
//
void HandleInput() {
EFI_INPUT_KEY key;
while (TRUE) {
if (gST->ConIn->ReadKeyStroke(gST->ConIn,&key) == EFI_SUCCESS) {
if (key.ScanCode == SCAN_DOWN) {
if(game_map[x+1][y]==' ')
{
game_map[x][y]=' ';
x++;
game_map[x][y]='S';
}
else if(game_map[x+1][y]=='O')
{
if(game_map[x+2][y]==' ')
{
game_map[x][y]=' ';
x++;
game_map[x][y]='S';
game_map[x+1][y]='O';
}
else if(game_map[x+2][y]=='*')
{
game_map[x][y]=' ';
x++;
game_map[x][y]='S';
game_map[x+1][y]=' ';
cnt++;
}
}
PrintGameMap();
} else if (key.ScanCode == SCAN_UP) {
if(game_map[x-1][y]==' ')
{
game_map[x][y]=' ';
x--;
game_map[x][y]='S';
}
else if(game_map[x-1][y]=='O')
{
if(game_map[x-2][y]==' ')
{
game_map[x][y]=' ';
x--;
game_map[x][y]='S';
game_map[x-1][y]='O';
}
else if(game_map[x-2][y]=='*')
{
game_map[x][y]=' ';
x--;
game_map[x][y]='S';
game_map[x-1][y]=' ';
cnt++;
}
}
PrintGameMap();
} else if (key.ScanCode == SCAN_RIGHT) {
if(game_map[x][y+1]==' ')
{
game_map[x][y]=' ';
y++;
game_map[x][y]='S';
}
else if(game_map[x][y+1]=='O')
{
if(game_map[x][y+2]==' ')
{
game_map[x][y]=' ';
y++;
game_map[x][y]='S';
game_map[x][y+1]='O';
}
else if(game_map[x][y+2]=='*')
{
game_map[x][y]=' ';
y++;
game_map[x][y]='S';
game_map[x][y+1]=' ';
cnt++;
}
}
PrintGameMap();
}
else if (key.ScanCode == SCAN_LEFT) {
if(game_map[x][y-1]==' ')
{
game_map[x][y]=' ';
y--;
game_map[x][y]='S';
}
else if(game_map[x][y-1]=='O')
{
if(game_map[x][y-2]==' ')
{
game_map[x][y]=' ';
y--;
game_map[x][y]='S';
game_map[x][y-1]='O';
}
else if(game_map[x][y-2]=='*')
{
game_map[x][y]=' ';
y--;
game_map[x][y]='S';
game_map[x][y-1]=' ';
cnt++;
}
}
PrintGameMap();
} else {
break;
}
} else {
MicroSecondDelay(100);
}
if(cnt==4)
break;
}
Print(L"You Successed\n");
}
EFI_STATUS
EFIAPI
GameInit(EFI_HANDLE imageHandle, EFI_SYSTEM_TABLE *systemTable){
PrintGameMap();
HandleInput();
return EFI_SUCCESS;
}