Uefi Application小游戏开发之贪吃蛇

这段代码是一个 UEFI 应用程序,它实现了一个简单的贪吃蛇游戏。

#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <stdio.h>
#include <Library/TimerLib.h>
#include <Library/DebugLib.h>
#define A 1664525
#define C 1013904223
#define M 4294967296UL 
static unsigned seed = 1;
BOOLEAN GameoverFlag=FALSE;
#define N 48
#define L 24
char Map[N][L];
typedef struct Position {int x, y;
} Position;
Position snake[4000000], food, next;
int head,tail,lenght,speed,grade;   
char dirction,dirbef;              
int score=0;                        
int order,wall,order_type;         
int rank[5]={0};                    char first[20]={"1."};char second[20]={"2."};char thirst[20]={"3."};char forth[20]={"4."};char fifth[20]={"5."};
void SetFood(){food.x=my_rand()%20 ;food.y=my_rand()%42 ;food.x= my_abs(food.x)+2;food.y=my_abs(food.y)+2;Map[food.x][food.y]='*';DEBUG((DEBUG_INFO, "food.x:%d ,food.y: %d\n", food.x , food.y));xy(food.x,food.y);Print(L"*");
}
// void xy(int y,int x) 
// { 
// 	 gST->ConOut->SetCursorPosition ( gST->ConOut, x, y);
// }
ShowSnake()
{int index=0;xy( snake[head].x, snake[head].y);Print(L"@");for(index=0;index < 2; index++){xy( snake[index].x, snake[index].y);Print(L"+");}}void Hello(){                       
Print(L"\n\n\n\t\t\t\t\t\t 1.New Game\n");
Print(L"\n\t\t\t\t\t\t 2.Continue\n");
Print(L"\n\t\t\t\t\t\t 3.Exit\n");
}void SetMap(){                      // for(int i=0;i<N;i++){           //     for(int j=0;j<N;j++){//         Map[i][j]=' ';//     }// }// for(int k=0;k<N;k++){           //set map//     Map[0][k]=Map[N-1][k]=Map[k][0]=Map[k][N-1]='+';// }// SetFood();Hello();head=2;tail=0;dirction='d';                   //default leftdirbef='d';snake[0].x=5;                   //snakesnake[0].y=4;snake[2].x=5;snake[2].y=6;snake[1].x=5;snake[1].y=5;// Map[1][3]='O';// Map[1][2]='O';// Map[1][1]='O';lenght=3;speed=500;score=0;grade=0;order=1;if(order==1){//cls();Print(L"\n\n\n\t\t\t\t\t\t 1.Normal Mode\n");Print(L"\n\t\t\t\t\t\t 2.No Wall Mode\n");order_type=2;if(order_type==1) wall=1;else wall=0;}if(order==3) return ;for(int time=3;time>0;time--) {cls();Print(L"\n\t\t\t\tready to game %d\n", time);Sleep (1000);cls();}food.x  =5;food.y  =18;xy(food.x,food.y);Print(L"*");
}
void ShowKK(){                    int i,j;//CpuBreakpoint();
for (int i = 1; i < L; i++) {for (int j = 1; j < N; j++) {if (i == 1 || i == L-1 || j == 1|| j == N-1) {Map[i][j]='+';xy(i,j);Print(L"+");} }
}
}void ShowMap(){                    int i,j;for (i = 1; i < N-1; i++) {for (j = 1; j < N-1; j++) {Print(L"%c ", Map[i][j]);}// if (i == 2) {//     Print(L"\t\tScore=%d", score);// }// if (i == 4) {//     Print(L"\t\tLenght=%d", lenght);// }// if (i == 6) {//     Print(L"\t\tSpeed=%d", 600 - speed);// }Print(L"\n");
}
}
int Gameover(){                    if(dirction=='p'){              cls();Print(L"\n\n\t\t\t\tGame Over\n\n\n");return 0;}if(wall){                      if(Map[next.y][next.x] == 'O' ||Map[next.y][next.x]=='+') {Map[next.y][next.x] = '@' ;Map[snake[head].y][snake[head].x]='O';Map[snake[tail].y][snake[tail].x]=' ';ShowMap();return 0;}}else{                           if(Map[next.y][next.x] == 'O') {Map[next.y][next.x] = '@' ;Map[snake[head].y][snake[head].x]='O';Map[snake[tail].y][snake[tail].x]=' ';return 0;}}return 1;
}int SnakeMove(){//moveif(score%100==0&&score!=0) speed=500-score;      //speedBOOLEAN timeover = TRUE;EFI_EVENT       WaitList[2];EFI_EVENT       TimeOutEvent;UINTN EventIndex;EFI_STATUS Status;EFI_INPUT_KEY                   Key;gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimeOutEvent);gBS->SetTimer (TimeOutEvent, TimerRelative, 10 * 1000 * 1000); WaitList[0] = TimeOutEvent;WaitList[1] = gST->ConIn->WaitForKey;while (1) {gBS->WaitForEvent (2, WaitList, &EventIndex);if (EventIndex == 1) {Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);if (Status == EFI_SUCCESS) {//Print(L"GetKey %d",Key.UnicodeChar);DEBUG((DEBUG_INFO, "Key.UnicodeChar:%d\n",Key.UnicodeChar ));if( Key.UnicodeChar== 'w' ||Key.UnicodeChar== 'a'|| Key.UnicodeChar== 's' || Key.UnicodeChar== 'd'){dirction=Key.UnicodeChar;break;}dirction=Key.UnicodeChar;break;}}else{   Status = EFI_TIMEOUT;// Print(L"Status %r",Status);break;}}//getchardirbef=dirction;DEBUG((DEBUG_INFO, "dirction:%d ,dirbef: \n",dirction ,dirbef));if(dirction!='w'&&dirction!='a'&&dirction!='s'&&dirction!='d'||((dirction=='w'&&dirbef=='s')||(dirction=='a'&&dirbef=='d')||(dirction=='s'&&dirbef=='w')||(dirction=='d'&&dirbef=='a')))dirction=dirbef;switch(dirction){case 'a':next.y = snake[head].y-1;next.x = snake[head].x;break;case 'd':next.y = snake[head].y+1;next.x = snake[head].x;break;case 'w':next.y = snake[head].y;next.x = snake[head].x-1;break;case 's':next.y = snake[head].y;next.x = snake[head].x+1;break;case 'p':break;//Gameover();}if((next.y==1)||(next.y==N-1)|| (next.x==1)||(next.x==L-1)) { cls();Print(L"\n\n\t\t\t\tGame Over\n\n\n");GameoverFlag=TRUE;MicroSecondDelay(3*1000*1000);return Status;}// if(next.y==0) next.y=N-2;// if(next.y==N-1) next.y=1;// if(next.x==0) next.x=M-2;// if(next.x==M-1) next.x=1;}void Eat(){//is eat foodif(next.x==food.x&&next.y==food.y){//eat score+=10;xy(next.x,next.y );Print(L"@");xy(snake[head].x,snake[head].y);Print(L"+");head++;snake[head].x=next.x;snake[head].y=next.y;Map[snake[head].x][snake[head].y]='@';lenght++;SetFood();}else{//no eatxy(next.x,next.y );Print(L"@");xy(snake[head].x,snake[head].y);Print(L"+");head++;snake[head].x=next.x;snake[head].y=next.y;xy(snake[head-lenght].x,snake[head-lenght].y);Print(L" ");}xy(5,60);Print(L"Score:%d",score);}EFI_STATUS
EFIAPI
TanchisheInit(IN EFI_HANDLE        ImageHandle,IN EFI_SYSTEM_TABLE  *SystemTable){ my_srand(11);gST->ConOut->EnableCursor (gST->ConOut, FALSE);while(1){SetMap();if(order==3){}else{ShowKK();ShowSnake();while(1){SnakeMove();if(GameoverFlag){return EFI_SUCCESS;}if(!Gameover()) {if(dirction!='p') break;}Eat();}}Print(L"\n....................press any key continue\n");order=0;dirction=dirbef;}}

游戏界面:

简单介绍下模块

    while (1) {

    gBS->WaitForEvent (2, WaitList, &EventIndex);

        if (EventIndex == 1) {

             Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);

               if (Status == EFI_SUCCESS) {

                 //Print(L"GetKey %d",Key.UnicodeChar);

                 DEBUG((DEBUG_INFO, "Key.UnicodeChar:%d\n",Key.UnicodeChar ));

                 

                 if( Key.UnicodeChar== 'w' ||Key.UnicodeChar== 'a'|| Key.UnicodeChar== 's' || Key.UnicodeChar== 'd')

                 {

                 dirction=Key.UnicodeChar;

                 break;

                 }

                 dirction=Key.UnicodeChar;

                 break;

             }

        }else

        {   Status = EFI_TIMEOUT;

           // Print(L"Status %r",Status);

            break;

        }

  }

gBS->WaitForEvent (2, WaitList, &EventIndex); 这行代码是在等待两个事件中的任何一个发生。这两个事件分别是定时器事件和键盘输入事件。

如果 EventIndex == 1,那么发生的事件是键盘输入事件。在这种情况下,程序会调用 gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); 来读取用户输入的键值。

如果读取成功,即 Status == EFI_SUCCESS,那么程序会检查用户输入的键值。如果键值是 'w'、'a'、's' 或 'd',那么程序会将这些值赋给 dirction 变量,并退出循环。

如果等待的事件不是键盘输入事件,那么程序会设置 Status = EFI_TIMEOUT; 并退出循环。

总的来说,这段代码的作用是等待用户输入方向键,并根据用户的输入来改变蛇的移动方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/467067.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++设计模式结构型模式———组合模式

文章目录 一、引言二、组合模式三、总结 一、引言 组合模式是一种结构型设计模式&#xff0c; 可以使用它将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们。代码实现中涉及了递归调用。组合模式与传统上的“类与类之间的组合关系”没有关联&#xff0c;不…

『大模型笔记』IBM技术团队:什么是智能体型RAG!

『大模型笔记』IBM技术团队:什么是智能体型RAG! 文章目录 一. 『大模型笔记』IBM技术团队:什么是智能体型RAG!二. 参考文献一. 『大模型笔记』IBM技术团队:什么是智能体型RAG! ✅检索增强生成(RAG)是一种结合检索和生成能力的技术,通过从向量数据库检索相关信息作为上…

快速傅里叶变换(FFT)基础(附python实现)

对于非专业人士&#xff0c;傅里叶变换一直是一个神秘的武器&#xff0c;它可以分析出不同频域的信息&#xff0c;从时域转换到频域&#xff0c;揭示了信号的频率成分&#xff0c;对于数字信号处理&#xff08;DSP&#xff09;、图像、语音等数据来说&#xff0c;傅里叶变换是最…

丹摩征文活动|新手入门指南

在AI大模型发展的今天&#xff0c;高性能计算平台已经成为研究和应用领域中不可或缺的工具。丹摩智算平台专注于为用户提供强大的算力支持和便捷的操作流程&#xff0c;帮助研究者和开发者更高效地训练和优化AI模型。本教程将深入介绍丹摩智算平台的核心功能及具体操作步骤&…

Java项目实战II基于Spring Boot的便利店信息管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在快节奏的…

【VScode】VScode内的ChatGPT插件——CodeMoss全解析与实用教程

在当今快速发展的编程世界中&#xff0c;开发者们面临着越来越多的挑战。如何提高编程效率&#xff0c;如何快速获取解决方案&#xff0c;成为了每位开发者心中的疑问。今天&#xff0c;我们将深入探讨一款颠覆传统编程体验的插件——CodeMoss&#xff0c;它将ChatGPT的强大功能…

数据冒险-dadd,sub和and

从图中的流水线执行情况来看&#xff0c;我们可以分析指令之间的依赖关系。图中每条指令对应的执行阶段标注为 IF (取指令)&#xff0c;ID (指令译码)&#xff0c;EX (执行)&#xff0c;Mem (访存)&#xff0c;和 WB (写回)。以下是对每条指令依赖情况的分析&#xff1a; 第一条…

如何修改WordPress经典编辑器的默认高度?

boke112百科有一个使用WordPress搭建的小网站&#xff0c;文章内容就是几个字不到一行&#xff0c;但是每次使用经典编辑器编辑文章时&#xff0c;都觉得编辑器默认高度太高了&#xff0c;影响了我添加文章摘要和其他属性&#xff0c;有没有办法修改WordPress经典编辑器的默认高…

量化研究--年化57%全球动量模型策略回测,学习使用

文章声明:本内容为个人的业余研究&#xff0c;和任何单位&#xff0c;机构没有关系&#xff0c;文章出现的股票代码&#xff0c;全部只是测试例子&#xff0c;不做投资参考&#xff0c;投资有风险&#xff0c;代码学习使用&#xff0c;不做商业用途 本文利用全球动量模型策略回…

【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期

目录 1. start() (1) start() 的性质 (2) start() 和 Thread类 的关系 2. 终止一个线程 (1)通过共享的标记结束线程 1. 通过共享的标记结束线程 2. 关于 lamda 表达式的“变量捕获” (2) 调用interrupt()方法 1. isInterrupted() 2. currentThread() …

Linux驱动开发(3):字符设备驱动

上一章节我们了解到什么是内核模块&#xff0c;模块的加载卸载详细过程以及内核模块的使用等内容。 本章&#xff0c;我们将学习驱动相关的概念&#xff0c;理解字符设备驱动程序的基本框架&#xff0c;并从源码上分析字符设备驱动实现和管理。 主要内容有如下五点&#xff1a;…

布谷直播源码部署服务器关于数据库配置的详细说明

布谷直播源码搭建部署配置接口数据库 /public/db.php&#xff08;2019年8月后的系统在该路径下配置数据库&#xff0c;老版本继续走下面的操作&#xff09; 在项目代码中执行命令安装依赖库&#xff08;⚠️注意&#xff1a;如果已经有了vendor内的依赖文件的就不用执行了&am…

【Linux】从零开始使用多路转接IO --- 理解EPOLL的 LT水平触发模式 与 ET边缘触发模式

当你偶尔发现语言变得无力时&#xff0c; 不妨安静下来&#xff0c; 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 EPOLL优缺点2 EPOLL工作模式 1 EPOLL优缺点 poll 的优点(和 select 的缺点对应) 接口使用方便&#xff1a;虽然拆分成了三个函数&#xff0c;…

云轴科技ZStack助力新远科技开启化工行业智能制造新篇章

新远科技基于云轴科技ZStack Cube超融合和ZStack Zaku容器云平台打造了灵活高效的IT基础设施&#xff0c;实现了IaaS和PaaS层的全面覆盖&#xff0c;优化了资源利用率&#xff0c;降低了硬件成本和运维复杂性&#xff0c;同时强化了数据安全和业务连续性。 化工行业的数字化先…

认识类和对象

认识类 类是用来对一个实体 ( 对象 ) 来进行描述的&#xff0c;主要描述该实体(对象)具有哪些属性(外观尺寸等)&#xff0c;哪些功能(用来干啥) 类中包含的内容称为 类的成员。属性主要是用来描述类的&#xff0c;称之为 类的成员属性或者 类成员变量。方法主要说明类具有哪些功…

npm镜像的常用操作

查看当前配置的 npm 镜像 npm config get registry切换官方镜像 npm config set registry https://registry.npmjs.org/切换淘宝镜像(推荐) npm config set registry https://registry.npmmirror.com/切换腾讯云镜像 npm config set registry http://mirrors.cloud.tencent…

网购选择困难症怎么破?别忘了你的这位“帮手”

每年双十一对不少人来说&#xff0c;既是购物剁手狂欢节&#xff0c;也是货比三家纠结得不行的选择困难症复发期。而现在&#xff0c;Pura 70 能够帮助我们解决不够了解商品、选择困难症等问题啦。 小艺圈选&#xff0c;圈出你感兴趣的商品&#xff0c;快速货比三家 利用指关…

175页PPTBCG某企业健康智能制造与供应链战略规划建议书

智能制造与供应链战略规划方法论是一个系统性、科学性的框架&#xff0c;旨在指导企业实现智能制造转型和供应链优化。以下是对这一方法论的核心内容的归纳和阐述&#xff1a; 一、智能制造的目标与原则 明确智能制造目标&#xff1a; 提高生产效率&#xff1a;通过引入自动…

【VS+QT】联合开发踩坑记录

最新更新日期&#xff1a;2024/11/05 0. 写在前面 因为目前在做自动化产线集成软件开发相关的工作&#xff0c;需要用到QT&#xff0c;所以选择了VS联合开发&#xff0c;方便调试。学习QT的过程中也踩了很多坑&#xff0c;在此记录一下&#xff0c;提供给各位参考。 1. 环境配…

flutter 专题四 Flutter渲染流程

一、 Widget - Element - RenderObject关系 二、 Widget 、Element 、RenderObject 分别表示什么 2.1 Widget Widget描述和配置子树的样子 Widget就是一个个描述文件&#xff0c;这些描述文件在我们进行状态改变时会不断的build。但是对于渲染对象来说&#xff0c;只会使用最…