c语言贪吃蛇最简单代码加注释(贪吃蛇的c语言代码)
C语言课程设计 贪吃蛇
2.1程序功能介绍
贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
2.2程序整体设计说明
一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。
2.2.1设计思路
这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有庆平的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块
2.2.2数据结构设计及用法说明
开始部分:
游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面我还设置了一个欢迎画面。标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重 要变量的初始化。
运行部分:
作为游戏的核心部分,这里包括的函数比较多,也就是模块比较多,首先让我模拟一下贪吃蛇的游戏模式:某个世界上突然出现一条蛇,它很短,它的运动神经异常,它没法停止自己的多动症在它的世界里就只有食物,它很饿,也很贪吃;同样在不明原因的情况下,食物从天而降,可惜的是没有落到嘴边;饥饿的主人公,不管它有没有毒,也不问食物的来历,径直向食物爬去;它吃到食物啦,它超出想象的同化能力让食物很快的成为自己身体的一部分,它的身子变长啦。当它吃到第一颗食物时,上帝有给它第二颗,于是它吃了第二颗,于是又变长了,于是又有第三颗……它的身子是一直的加长,它不管自己过长身体的麻烦——转身不便,继续吃下去,现在它是直接把巴张大,好让食物有个绿色通道。但是在某天的下午,它咬到了自己,它才想起自己是一条毒蛇,于是晕死过去(不是毒死);又或者它往食物冲锋的时候,它失去控制,撞到了墙上。
第一轮循环:第一步,出现食物;第二步,蛇不停运动;第三步,检查蛇是撞到自己或墙壁;由第四步起游戏有两条支线(A、B):
A :第四步,蛇没有碰到自己或墙壁,蛇继续前进,绘制蛇的动作;第五步,判断蛇是否吃到食物,如果蛇吃到食物,身子变长,原来的食物消失;第六步,让玩家输入控制指令,让蛇在下一轮循环的第二步改变运动方向;第七步,第二轮循环的第一步,重复第一轮的步骤;
B:第四步,蛇碰到自己或墙壁,终止游戏。
结束部分:
游戏结束时,显示“GAME OVER”,已经是约定俗成的规律了,我的游戏也不例外。除了游戏结束画面外,我还设置了一个游戏退出画面,“善始善终”嘛。
有了上述的大致划分,我把整个程序划分成(13+2)个模块(其实就是函数)
2.2.3程序结构(流程图)
图2.1流程图
依据所需要处理的任务要求,规划输入数据和输出结果,决定存放数据的数据结构。
C语言中数据结构集中体现在数据类型上,因此在进行C语言程序设计时,应统筹规划程序中所使用的变量,数组,指针等,以及它们的类型等。这点是很重要的,如果在此期间选择不合适的变量或者数组,将来修改就十分困难。
现在分析一下贪吃蛇游戏中的元素,继而得出与它们对应的在程序中的描述:
蛇:
基本描述:长度,颜色,位置。
对应数据与数据类型:长度—虽然可以用坐标表示,但是这样的话,运算量将很大,所以换算成较大的单位—节数,以固定长度的每节描述;坐标--整型;颜色--整型; 位置--X,Y坐标。
增加的描述:蛇运动的方向,蛇的生命。
对应数据与数据类型:这些描述是为了与程序的按键的输入部分与判断游戏结束部分相联系而设的。方向只有四个方向:上下左右。可以设置与之对应的四个整型数:3、4、2、1。生命就只有两种情况:死或生,对应0或1。
食物:
基本描述:颜色,位置。
对应数据与数据类型:由于颜色设成固定的,所以不再讨论。位置—X、Y坐标。
增加的描述:食物的存在。
对应数据与数据类型:这是为了避免重复出现食物而设置的,与绘制食物的函数有联系。只有两个值:0或1(没有食物或有食物)
其他的元素:墙,由于它在显示上是作为背景而存在的,所以并没有什么说明实际的墙壁就是四条直线组成的边框,由坐标描述。
还需要的变量:键盘键入的键值(作为全局变量,整型);经常要使用的循环变量;自定义的填充图案;说明文字的字符数组;游戏的记分;游戏的速度(蛇的速度)。
图2.2蛇的不停运动的关键算法的流程图
2.2.4各模块的功能及程序说明
主要模块的实现思路和算法的流程图说明:
关键所在——蛇不停移动的Snakemove():
蛇的不停移动,就是蛇的下一节取代前一节的位置,在计算机中就是蛇下一节的位置坐标变成前一节的位置坐标。在上文中,已定义蛇的位置坐标为数组类型,一组坐标对应一节的位置,假设有i+1节,由0到i节,第i节的坐标取第i-1节的坐标,第i-1节的坐标取第i-2节的坐标……直到第1节取第0节的坐标。而第0节的坐标,即蛇头的坐标要往某个方向变化,变化量为蛇每节的长度。蛇的这种坐标轮换需要循环语句使其继续下去。
2.2.5程序结果
运行程序得到如下初始界面图:
图2.3程序结果图
用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示:
图2.4程序结果图
蛇没有碰到自己或墙壁,蛇继续前进:
图2.5程序结果图
游戏结束时,显示“GAME OVER”
图2.6程序结果图
2.3程序源代码及注释
#define N 200
#include graphics.h
#include stdlib.h
#include dos.h
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/*得分*/
int gamespeed=50000;/*游戏速度自己调整*/
struct Food{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake{
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void){
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/}
/*图形驱动*/
void Init(void){
int gd=DETECT,gm;
registerbgidriver(EGAVGA_driver);
initgraph(gd,gm,"c:\\program files\\winyes\\tc20h\\bgi");
cleardevice();}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void){
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=50;i=600;i+=10)/*画围墙*/ ? {
rectangle(i,40,i+10,49); /*上边*/
rectangle(i,451,i+10,460);/*下边*/ ? }
for(i=40;i=450;i+=10) ?{
rectangle(50,i,59,i+10); /*左边*/
rectangle(601,i,610,i+10);/*右边*/ }}
/*玩游戏具体过程*/
void GamePlay(void){
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/ ? {
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/ ? ? ?{
if(food.yes==1)/*需要出现新食物*/ ? ? {
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*画面上有食物了*/ ? ? }
if(food.yes==0)/*画面上有食物了就要显示*/ ? ? {
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10); ? ? }
for(i=snake.node-1;i0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ ? ? ? ? {
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; ? ? }
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction) ? ? {
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break; ? ? }
for(i=3;isnake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ ? ? {
if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0]) ? ? ? ?{
GameOver();/*显示失败*/
snake.life=1;
break; ? ? ? ?} ? ? ? ?}
if(snake.x[0]55||snake.x[0]595||snake.y[0]55||
snake.y[0]455)/*蛇是否撞到墙壁*/ ? ?{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/ ? ?}
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]==food.xsnake.y[0]==food.y)/*吃到食物以后*/ ? ?{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/ ? ?}
setcolor(4);/*画出蛇*/
for(i=0;isnake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); ? ? } ?/*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
else
if(key==UPsnake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key==RIGHTsnake.direction!=2)
snake.direction=1;
else
if(key==LEFTsnake.direction!=1)
snake.direction=2;
else
if(key==DOWNsnake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/}
/*游戏结束*/
void GameOver(void){
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();}
/*输出成绩*/
void PrScore(void){
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);}
/*图形结束*/
void Close(void){
getch();
closegraph();
}
寻找贪吃蛇c++的代码
贪吃蛇游戏C语言源代码学习
源代码下载地址为:
阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读。
程序可在VS2013下编译运行。
1 #includestdio.h ?2 #includetime.h ?3 #includewindows.h ?4 #includestdlib.h ?5 ??6 #define U 1 ?7 #define D 2 ?8 #define L 3
9 #define R 4 ? ? ? //蛇的状态,U:上 ;D:下;L:左 R:右 10 ?11 typedef struct SNAKE //蛇身的一个节点 12 { 13 ? ? int x; 14 ? ? int y; 15 ? ? struct SNAKE *next; 16 }snake; 17 ?18 //全局变量// 19 int score = 0, add = 10;//总得分与每次吃食物得分。 20 int status, sleeptime = 200;//每次运行的时间间隔 21 snake *head, *food;//蛇头指针,食物指针 22 snake *q;//遍历蛇的时候用到的指针 23 int endGamestatus = 0; //游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。 24 ?25 //声明全部函数// 26 void Pos(); 27 void creatMap(); 28 void initSnake(); 29 int biteSelf(); 30 void createFood(); 31 void cantCrossWall(); 32 void snakeMove(); 33 void pause(); 34 void runGame(); 35 void initGame(); 36 void endGame(); 37 void gameStart(); 38 ?39 void Pos(int x, int y)//设置光标位置 40 { 41 ?? ?COORD pos; 42 ?? ?HANDLE hOutput; 43 ? ? pos.X = x; 44 ? ? pos.Y = y; 45 ? ? hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄 46 ?? ?SetConsoleCursorPosition(hOutput, pos); 47 } 48 ?49 void creatMap()//创建地图 50 { 51 ? ? int i; 52 ? ? for (i = 0; i58; i += 2)//打印上下边框 53 ?? ?{ 54 ? ? ? ? Pos(i, 0); 55 ? ? ? ? printf("■");//一个方块占两个位置 56 ? ? ? ? Pos(i, 26); 57 ? ? ? ? printf("■"); 58 ?? ?} 59 ? ? for (i = 1; i26; i++)//打印左右边框 60 ?? ?{ 61 ? ? ? ? Pos(0, i); 62 ? ? ? ? printf("■"); 63 ? ? ? ? Pos(56, i); 64 ? ? ? ? printf("■"); 65 ?? ?} 66 } 67 ?68 void initSnake()//初始化蛇身 69 { 70 ? ? snake *tail; 71 ? ? int i; 72 ? ? tail = (snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置// 73 ? ? tail-x = 24; 74 ? ? tail-y = 5; 75 ? ? tail-next = NULL; 76 ? ? for (i = 1; i = 4; i++)//初始长度为4 77 ?? ?{ 78 ? ? ? ? head = (snake*)malloc(sizeof(snake)); 79 ? ? ? ? head-next = tail; 80 ? ? ? ? head-x = 24 + 2 * i; 81 ? ? ? ? head-y = 5; 82 ? ? ? ? tail = head; 83 ?? ?} 84 ? ? while (tail != NULL)//从头到为,输出蛇身 85 ?? ?{ 86 ? ? ? ? Pos(tail-x, tail-y); 87 ? ? ? ? printf("■"); 88 ? ? ? ? tail = tail-next; 89 ?? ?} 90 } 91 //?? 92 int biteSelf()//判断是否咬到了自己 93 { 94 ? ? snake *self; 95 ? ? self = head-next; 96 ? ? while (self != NULL) 97 ?? ?{ 98 ? ? ? ? if (self-x == head-x self-y == head-y) 99 ?? ? ? ?{100 ? ? ? ? ? ? return 1;101 ?? ? ? ?}
102 ? ? ? ? self = self-next;103 ?? ?}104 ? ? return 0;105 }106 107 void createFood()//随机出现食物108 {109 ? ? snake *food_1;110 ? ? srand((unsigned)time(NULL));//为了防止每次产生的随机数相同,种子设置为time111 ? ? food_1 = (snake*)malloc(sizeof(snake));112 ? ? while ((food_1-x % 2) != 0) ? ?//保证其为偶数,使得食物能与蛇头对其113 ?? ?{114 ? ? ? ? food_1-x = rand() % 52 + 2;115 ?? ?}116 ? ? food_1-y = rand() % 24 + 1;117 ? ? q = head;118 ? ? while (q-next == NULL)119 ?? ?{120 ? ? ? ? if (q-x == food_1-x q-y == food_1-y) //判断蛇身是否与食物重合121 ?? ? ? ?{122 ? ? ? ? ? ? free(food_1);123 ?? ? ? ? ? ?createFood();124 ?? ? ? ?}125 ? ? ? ? q = q-next;126 ?? ?}127 ? ? Pos(food_1-x, food_1-y);128 ? ? food = food_1;129 ? ? printf("■");130 }131 132 void cantCrossWall()//不能穿墙133 {134 ? ? if (head-x == 0 || head-x == 56 || head-y == 0 || head-y == 26)135 ?? ?{136 ? ? ? ? endGamestatus = 1;137 ?? ? ? ?endGame();138 ?? ?}139 }140 141 void snakeMove()//蛇前进,上U,下D,左L,右R142 {143 ? ? snake * nexthead;144 ?? ?cantCrossWall();145 146 ? ? nexthead = (snake*)malloc(sizeof(snake));147 ? ? if (status == U)148 ?? ?{149 ? ? ? ? nexthead-x = head-x;150 ? ? ? ? nexthead-y = head-y - 1;151 ? ? ? ? if (nexthead-x == food-x nexthead-y == food-y)//如果下一个有食物//152 ?? ? ? ?{153 ? ? ? ? ? ? nexthead-next = head;154 ? ? ? ? ? ? head = nexthead;155 ? ? ? ? ? ? q = head;156 ? ? ? ? ? ? while (q != NULL)157 ?? ? ? ? ? ?{158 ? ? ? ? ? ? ? ? Pos(q-x, q-y);159 ? ? ? ? ? ? ? ? printf("■");160 ? ? ? ? ? ? ? ? q = q-next;161 ?? ? ? ? ? ?}162 ? ? ? ? ? ? score = score + add;163 ?? ? ? ? ? ?createFood();164 ?? ? ? ?}165 ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果没有食物//166 ?? ? ? ?{167 ? ? ? ? ? ? nexthead-next = head;168 ? ? ? ? ? ? head = nexthead;169 ? ? ? ? ? ? q = head;170 ? ? ? ? ? ? while (q-next-next != NULL)171 ?? ? ? ? ? ?{172 ? ? ? ? ? ? ? ? Pos(q-x, q-y);173 ? ? ? ? ? ? ? ? printf("■");174 ? ? ? ? ? ? ? ? q = q-next;175 ?? ? ? ? ? ?}176 ? ? ? ? ? ? Pos(q-next-x, q-next-y);177 ? ? ? ? ? ? printf(" ?");178 ? ? ? ? ? ? free(q-next);179 ? ? ? ? ? ? q-next = NULL;180 ?? ? ? ?}181 ?? ?}182 ? ? if (status == D)183 ?? ?{184 ? ? ? ? nexthead-x = head-x;185 ? ? ? ? nexthead-y = head-y + 1;186 ? ? ? ? if (nexthead-x == food-x nexthead-y == food-y) ?//有食物187 ?? ? ? ?{188 ? ? ? ? ? ? nexthead-next = head;189 ? ? ? ? ? ? head = nexthead;190 ? ? ? ? ? ? q = head;191 ? ? ? ? ? ? while (q != NULL)192 ?? ? ? ? ? ?{193 ? ? ? ? ? ? ? ? Pos(q-x, q-y);194 ? ? ? ? ? ? ? ? printf("■");195 ? ? ? ? ? ? ? ? q = q-next;196 ?? ? ? ? ? ?}197 ? ? ? ? ? ? score = score + add;198 ?? ? ? ? ? ?createFood();199 ?? ? ? ?}200 ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //没有食物201 ?? ? ? ?{202 ? ? ? ? ? ? nexthead-next = head;203 ? ? ? ? ? ? head = nexthead;204 ? ? ? ? ? ? q = head;205 ? ? ? ? ? ? while (q-next-next != NULL)206 ?? ? ? ? ? ?{207 ? ? ? ? ? ? ? ? Pos(q-x, q-y);208 ? ? ? ? ? ? ? ? printf("■");209 ? ? ? ? ? ? ? ? q = q-next;210 ?? ? ? ? ? ?}211 ? ? ? ? ? ? Pos(q-next-x, q-next-y);212 ? ? ? ? ? ? printf(" ?");213 ? ? ? ? ? ? free(q-next);214 ? ? ? ? ? ? q-next = NULL;215 ?? ? ? ?}216 ?? ?}217 ? ? if (status == L)218 ?? ?{219 ? ? ? ? nexthead-x = head-x - 2;220 ? ? ? ? nexthead-y = head-y;221 ? ? ? ? if (nexthead-x == food-x nexthead-y == food-y)//有食物222 ?? ? ? ?{223 ? ? ? ? ? ? nexthead-next = head;224 ? ? ? ? ? ? head = nexthead;225 ? ? ? ? ? ? q = head;226 ? ? ? ? ? ? while (q != NULL)227 ?? ? ? ? ? ?{228 ? ? ? ? ? ? ? ? Pos(q-x, q-y);229 ? ? ? ? ? ? ? ? printf("■");230 ? ? ? ? ? ? ? ? q = q-next;231 ?? ? ? ? ? ?}232 ? ? ? ? ? ? score = score + add;233 ?? ? ? ? ? ?createFood();234 ?? ? ? ?}235 ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//没有食物236 ?? ? ? ?{237 ? ? ? ? ? ? nexthead-next = head;238 ? ? ? ? ? ? head = nexthead;239 ? ? ? ? ? ? q = head;240 ? ? ? ? ? ? while (q-next-next != NULL)241 ?? ? ? ? ? ?{242 ? ? ? ? ? ? ? ? Pos(q-x, q-y);243 ? ? ? ? ? ? ? ? printf("■");244 ? ? ? ? ? ? ? ? q = q-next;245 ?? ? ? ? ? ?}246 ? ? ? ? ? ? Pos(q-next-x, q-next-y);247 ? ? ? ? ? ? printf(" ?");248 ? ? ? ? ? ? free(q-next);249 ? ? ? ? ? ? q-next = NULL;250 ?? ? ? ?}251 ?? ?}252 ? ? if (status == R)253 ?? ?{254 ? ? ? ? nexthead-x = head-x + 2;255 ? ? ? ? nexthead-y = head-y;256 ? ? ? ? if (nexthead-x == food-x nexthead-y == food-y)//有食物257 ?? ? ? ?{258 ? ? ? ? ? ? nexthead-next = head;259 ? ? ? ? ? ? head = nexthead;260 ? ? ? ? ? ? q = head;261 ? ? ? ? ? ? while (q != NULL)262 ?? ? ? ? ? ?{263 ? ? ? ? ? ? ? ? Pos(q-x, q-y);264 ? ? ? ? ? ? ? ? printf("■");265 ? ? ? ? ? ? ? ? q = q-next;266 ?? ? ? ? ? ?}267 ? ? ? ? ? ? score = score + add;268 ?? ? ? ? ? ?createFood();269 ?? ? ? ?}270 ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //没有食物271 ?? ? ? ?{272 ? ? ? ? ? ? nexthead-next = head;273 ? ? ? ? ? ? head = nexthead;274 ? ? ? ? ? ? q = head;275 ? ? ? ? ? ? while (q-next-next != NULL)276 ?? ? ? ? ? ?{277 ? ? ? ? ? ? ? ? Pos(q-x, q-y);278 ? ? ? ? ? ? ? ? printf("■");279 ? ? ? ? ? ? ? ? q = q-next;280 ?? ? ? ? ? ?}281 ? ? ? ? ? ? Pos(q-next-x, q-next-y);282 ? ? ? ? ? ? printf(" ?");283 ? ? ? ? ? ? free(q-next);284 ? ? ? ? ? ? q-next = NULL;285 ?? ? ? ?}286 ?? ?}287 ? ? if (biteSelf() == 1) ? ? ? //判断是否会咬到自己288 ?? ?{289 ? ? ? ? endGamestatus = 2;290 ?? ? ? ?endGame();291 ?? ?}292 }293 294 void pause()//暂停295 {296 ? ? while (1)297 ?? ?{298 ? ? ? ? Sleep(300);299 ? ? ? ? if (GetAsyncKeyState(VK_SPACE))300 ?? ? ? ?{301 ? ? ? ? ? ? break;302 ?? ? ? ?}303 304 ?? ?}305 }306 307 void runGame()//控制游戏 ? ? ? ?308 {309 310 ? ? Pos(64, 15);311 ? ? printf("不能穿墙,不能咬到自己\n");312 ? ? Pos(64, 16);313 ? ? printf("用↑.↓.←.→分别控制蛇的移动.");314 ? ? Pos(64, 17);315 ? ? printf("F1 为加速,F2 为减速\n");316 ? ? Pos(64, 18);317 ? ? printf("ESC :退出游戏.space:暂停游戏.");318 ? ? Pos(64, 20);319 ? ? printf("C语言研究中心 ");320 ? ? status = R;321 ? ? while (1)322 ?? ?{323 ? ? ? ? Pos(64, 10);324 ? ? ? ? printf("得分:%d ?", score);325 ? ? ? ? Pos(64, 11);326 ? ? ? ? printf("每个食物得分:%d分", add);327 ? ? ? ? if (GetAsyncKeyState(VK_UP) status != D)328 ?? ? ? ?{329 ? ? ? ? ? ? status = U;330 ?? ? ? ?}331 ? ? ? ? else if (GetAsyncKeyState(VK_DOWN) status != U)332 ?? ? ? ?{333 ? ? ? ? ? ? status = D;334 ?? ? ? ?}335 ? ? ? ? else if (GetAsyncKeyState(VK_LEFT) status != R)336 ?? ? ? ?{337 ? ? ? ? ? ? status = L;338 ?? ? ? ?}339 ? ? ? ? else if (GetAsyncKeyState(VK_RIGHT) status != L)340 ?? ? ? ?{341 ? ? ? ? ? ? status = R;342 ?? ? ? ?}343 ? ? ? ? else if (GetAsyncKeyState(VK_SPACE))344 ?? ? ? ?{345 ?? ? ? ? ? ?pause();346 ?? ? ? ?}347 ? ? ? ? else if (GetAsyncKeyState(VK_ESCAPE))348 ?? ? ? ?{349 ? ? ? ? ? ? endGamestatus = 3;350 ? ? ? ? ? ? break;351 ?? ? ? ?}352 ? ? ? ? else if (GetAsyncKeyState(VK_F1))353 ?? ? ? ?{354 ? ? ? ? ? ? if (sleeptime = 50)355 ?? ? ? ? ? ?{356 ? ? ? ? ? ? ? ? sleeptime = sleeptime - 30;357 ? ? ? ? ? ? ? ? add = add + 2;358 ? ? ? ? ? ? ? ? if (sleeptime == 320)359 ?? ? ? ? ? ? ? ?{360 ? ? ? ? ? ? ? ? ? ? add = 2;//防止减到1之后再加回来有错361 ?? ? ? ? ? ? ? ?}362 ?? ? ? ? ? ?}363 ?? ? ? ?}364 ? ? ? ? else if (GetAsyncKeyState(VK_F2))365 ?? ? ? ?{366 ? ? ? ? ? ? if (sleeptime350)367 ?? ? ? ? ? ?{368 ? ? ? ? ? ? ? ? sleeptime = sleeptime + 30;369 ? ? ? ? ? ? ? ? add = add - 2;370 ? ? ? ? ? ? ? ? if (sleeptime == 350)371 ?? ? ? ? ? ? ? ?{372 ? ? ? ? ? ? ? ? ? ? add = 1; ?//保证最低分为1373 ?? ? ? ? ? ? ? ?}374 ?? ? ? ? ? ?}375 ?? ? ? ?}376 ?? ? ? ?Sleep(sleeptime);377 ?? ? ? ?snakeMove();378 ?? ?}379 }380 381 void initGame()//开始界面382 {383 ? ? Pos(40, 12);384 385 ? ? system("title C语言研究中心 ? ");386 ? ? printf("欢迎来到贪食蛇游戏!");387 ? ? Pos(40, 25);388 ? ? printf(" ? ? ? ? ? ? ?C语言研究中心 ?.\n");389 ? ? system("pause");390 ? ? system("cls");391 ? ? Pos(25, 12);392 ? ? printf("用↑.↓.←.→分别控制蛇的移动, F1 为加速,2 为减速\n");393 ? ? Pos(25, 13);394 ? ? printf("加速将能得到更高的分数。\n");395 ? ? system("pause");396 ? ? system("cls");397 }398 399 void endGame()//结束游戏400 {401 402 ? ? system("cls");403 ? ? Pos(24, 12);404 ? ? if (endGamestatus == 1)405 ?? ?{406 ? ? ? ? printf("对不起,您撞到墙了。游戏结束.");407 ?? ?}408 ? ? else if (endGamestatus == 2)409 ?? ?{410 ? ? ? ? printf("对不起,您咬到自己了。游戏结束.");411 ?? ?}412 ? ? else if (endGamestatus == 3)413 ?? ?{414 ? ? ? ? printf("您的已经结束了游戏。");415 ?? ?}416 ? ? Pos(24, 13);417 ? ? printf("您的得分是%d\n", score);418 ? ? while (getchar() != 'y')419 ?? ?{ ? ?
420 ? ? ? ? printf("close?[y]");421 ?? ?}422 ? ? exit(0);423 }424 425 void gameStart()//游戏初始化426 {427 ? ? system("mode con cols=100 lines=30");428 ?? ?initGame();429 ?? ?creatMap();430 ?? ?initSnake();431 ?? ?createFood();432 }433 434 int main()435 {436 ?? ?gameStart();437 ?? ?runGame();438 ?? ?endGame();439 ? ? return 0;440 }
哪位大神c++贪吃蛇游戏代码 和注释,急用
1. //这个是背景的单元格数据结构
2. const length = 40;
3. const width = 20;
4. struct square{
5. bool blocked; //是否有障碍物
6. bool food; //是否有食物
7. int x; //单元格在背景中的相对横坐标
8. int y; //单元格在背景中的相对纵坐标
9. }bg[length][width]; //直接创建游戏背景
10.
11.//设置背景
12.void setBG(int length, int width){
13. HANDLE hOut;
14. COORD OutChar;
15. OutChar.X = 10;
16. OutChar.Y = 10;
17. int i = 0;
18. int j = 0;
19. for(i = 0; i width; i++){
20. for(j = 0; j length; j++){
21. bg[i][j].x = i;
22. bg[i][j].y = j;
23. bg[i][j].blocked = false;
24. bg[i][j].food = false;
25. OutChar.X = j+10;
26. hOut = GetStdHandle(STD_OUTPUT_HANDLE);
27. SetConsoleCursorPosition(hOut,OutChar);
28. cout col(BG_WHITE,true) " ";
29. }
30. cout endl;
31. OutChar.Y = i+10;
32. SetConsoleCursorPosition(hOut,OutChar);
33. }
34.}
35.//构造障碍物
36.void createBlock(int x, int y, unsigned short color){
37. HANDLE hOut;
38. COORD OutChar;
39. OutChar.X = x;
40. OutChar.Y = y;
41. hOut = GetStdHandle(STD_OUTPUT_HANDLE);
42. SetConsoleCursorPosition(hOut,OutChar); //定位光标输入
43. cout col(color, true) " "; //一个颜色为color 的空白
字符
44.}
45.
46.//生成单个障碍物
47.void createWall(int x,int y){
48. createBlock(x+10,y+10,BG_GREEN);
49. bg[x][y].blocked = true;
50.}
51.
52.//判断所指坐标是否被占用
53.bool checkExisted(int x,int y){
54. if(bg[x][y].blocked == true || bg[x][y].food == true){
55. return false;
56. }
57. return true;
58.}
59.
60.//随机生成障碍物
61.void rand_createWall(void){
62. srand((unsigned)time(NULL));
63. int n = rand() % 70+10;
64. int pos_x = 0;
65. int pos_y = 0;
66. int i = 0;
67. for(i = 0; i n; i++){
68. pos_x = rand() % length;
69. pos_y = rand() % (width-1);
70. if(checkExisted(pos_x,pos_y) == true){ //防止障碍物重
叠
71. createWall(pos_x,pos_y);
72. }else{
73. n++;
74. }
75. //createWall(pos_x,pos_y);
76. }
77.}
78.//创建食物
79.void createFood(int x,int y){
80. createBlock(x+10,y+10,BG_BLUE);
81. bg[x][y].food = true;
82.}
83.
84.//随机创建食物
85.void rand_createFood(void){
86. srand((unsigned)time(NULL));
87. int n = 1;//rand() % 20;
88. int pos_x = 0;
89. int pos_y = 0;
90. int i = 0;
91. for(i = 0; i n; i++){
92. pos_x = rand() % length;
93. pos_y = rand() % (width-1);
94. if(checkExisted(pos_x,pos_y) == true){ //防止在障碍物
上生成食物
95. createFood(pos_x,pos_y);
96. }else{
97. n++;
98. }
99. }
100. }
101. //物体信息,这是蛇的单元模型
102. const objLen = 5;
103. struct obj{
104. int x;
105. int y;
106. }snake[objLen];
107.
108. //创建蛇
109. LinListstruct obj newSnake;
110. void createSnake(void){
111. int i = 0;
112. for(i = 0; i objLen; i++){
113. snake[i].x = i;
114. snake[i].y = 0;
115. newSnake.Insert(snake[i],i);
116. }
117. }
118.
119. //绘制蛇
120. void drawSnake(int len){
121. int i = 0;
122. struct obj t;
123. for(i = 0; i len; i++){
124. t = newSnake.GetData(i);
125. createBlock(t.x,t.y,BG_RED);
126. }
127. }
128.
129. //增长蛇的身体
130. void insreaseSnake(int x,int y){
131. struct obj t;
132. t.x = x;
133. t.y = y;
134. newSnake.Insert(t,0);
135. createBlock(x,y,BG_RED);
136. }
137.
138. //传递蛇的信息
139. void transSnake(int x,int y,int len){
140. int i = 0;
141. struct obj t1,t2;
142. for(i = 0; i len-1; i++){
143. t1 = newSnake.GetData(i);
144. t2 = newSnake.GetData(i+1);
145. newSnake.Delete(i);
146. t1.x = t2.x;
147. t1.y = t2.y;
148. newSnake.Insert(t1,i);
149. }
150. newSnake.Delete(newSnake.Size()-1);
151. t1.x = x;
152. t1.y = y;
153. newSnake.Insert(t1,newSnake.Size()-1);
154. }
155. //清除物体移动轨迹
156. void removeTrack(int x, int y){
157. HANDLE hOut;
158. COORD OutChar;
159. OutChar.X = x;
160. OutChar.Y = y;
161. hOut = GetStdHandle(STD_OUTPUT_HANDLE);
162. SetConsoleCursorPosition(hOut,OutChar);
163. cout col(BG_WHITE,true) " ";
164. }
165.
166. //移动物体
167. int x = 10;
168. int y = 10;
169. int tail_x = 0;
170. int tail_y = 0;
171. void moveBlock(char direction){
172. HANDLE hOut2;
173. COORD OutChar2;
174. OutChar2.X = x;
175. OutChar2.Y = y;
176. struct obj t;
177. t = newSnake.GetData(0);
178. tail_x = t.x;
179. tail_y = t.y;
180. hOut2 = GetStdHandle(STD_OUTPUT_HANDLE);
181. removeTrack(t.x,t.y);
182. switch(direction){
183. case 'w':{
184. OutChar2.Y--;
185. y--;
186. SetConsoleCursorPosition(hOut2,OutChar2);
187. break;
188. }
189. case 's':{
190. OutChar2.Y++;
191. y++;
192. SetConsoleCursorPosition(hOut2,OutChar2);
193. break;
194. }
195. case 'a':{
196. OutChar2.X--;
197. x--;
198. SetConsoleCursorPosition(hOut2,OutChar2);
199. break;
200. }
201. case 'd':{
202. OutChar2.X++;
203. x++;
204. SetConsoleCursorPosition(hOut2,OutChar2);
205. break;
206. }
207. }
208.
209. transSnake(x,y,newSnake.Size());
210. drawSnake(newSnake.Size());
211. }
212. //判断是否碰到障碍物或边界
213. bool checkView(char direction){
214. if(direction == 'w' y = 10){
215. if(y == 10 || bg[x-10][y-10-1].blocked == true){re
turn false;}
216. }
217. else if(direction == 's' y 10+width){
218. if(y == 10+width-2 || bg[x-10][y-10+1].blocked ==
true){return false;}
219. }
220. else if(direction == 'a' x = 10){
221. if(x == 10 || bg[x-10-1][y-10].blocked == true){re
turn false;}
222. }
223. else if(direction == 'd' x 10+length){
224. if(x == 10+length-1 || bg[x-10+1][y-10].blocked ==
true){return false;}
225. }
226. return true;
227. }
228.
229. //判断是否吃到食物
230. bool checkFood(int x, int y){
231. if(bg[x-10][y-10].food == true){return true;}
232. return false;
233. }
234. int main()
235. {
236. HANDLE hOut;
237. COORD OutChar;
238.
239. OutChar.X = 0;
240. OutChar.Y = 0;
241. hOut = GetStdHandle(STD_OUTPUT_HANDLE);
242. SetConsoleCursorPosition(hOut,OutChar);
243.
244. /*
245. struct square **bgR = new square*[width];
246. struct square *bgC = new square[length];
247. for(int i = 0; i width; i++){
248. bgR[i] = bgC;
249. }
250. */
251. //设置背景
252. setBG(length,width);
253. //设置障碍物
254. rand_createWall();
255. //设置食物
256. rand_createFood();
257. //创建蛇
258. createSnake();
259. //移动物体
260. char direction;
261. int score = 0;
262. for(;;){
263. direction = getch();
264. if(checkView(direction) == true){//判断能否移动
265. moveBlock(direction);
266. if(checkFood(x,y) == true){//判断是否吃到食
物
267. bg[x-10][y-10].food = false;
268. score++;
269. insreaseSnake(tail_x,tail_y);//增长身体
270. rand_createFood();//吃完后随机在创建一个食
物
271. }
272. }
273. OutChar.X = 0;
274. OutChar.Y = 0;
275. hOut = GetStdHandle(STD_OUTPUT_HANDLE);
276. SetConsoleCursorPosition(hOut,OutChar);
277. cout col(BG_WHITE,true) "Scores: " score;
278. }
279. return 0;
280. }
抱歉,才发现你要的是c++程序,上面这个我觉得是比较好的一个贪吃蛇c++程序,特别是界面的控制,应为做游戏就是需要这方面的的考虑,下面还有个,你可以参考一下
#include iostream.h
#include windows.h
#include stdlib.h
#include conio.h
#include time.h //使用当前时间做种子;
enum dir{up,down,left,right}; //枚举类型enum dir;
//围墙;
class Fence{
public:
void InitFence();
void OutputF();
public:
char game[20][20];
}f; //定义对象;
//画框框;
void Fence::InitFence(){
for(int i=0; i20; i++)
for(int j=0; j20; j++){
if(i==0||i==19||j==0||j==19)
game[i][j]= '*';
else game[i][j]= ' ';
}
}
//显示框框;
void Fence::OutputF(){
for(int i=0; i20; i++){
for(int j=0; j20; j++)
coutgame[i][j]' ';
coutendl;
}
}
//蛇结点;
class SnakeNode{
private:
int x,y;
SnakeNode *prior,*next;
public:
void add_head(int x,int y);
int get_x();
int get_y();
void delete_tail();
}*head=NULL, *tail =NULL;
//插入头结点;
void SnakeNode::add_head(int x,int y){
SnakeNode *q=new SnakeNode;
q-x =x; q-y =y;
q-next =head;
q-prior =NULL;
if(head) head-prior =q;
head =q;
if(!tail) tail =head;
f.game[x][y]= '*'; //f对象可以在定义Fence类时定义; 且Fence类在SnakeNode类前定义;
}
int SnakeNode::get_x(){
return x;
}
int SnakeNode::get_y(){
return y;
}
//删除尾结点;
void SnakeNode::delete_tail(){
SnakeNode *p =tail;
f.game[tail-get_x()][tail-get_y()]= ' ';//把尾结点的坐标表示的'*'置为空格;
if(tail==head)
tail= head= NULL;
else{
tail= tail-prior;
tail-next= NULL;
}
delete p;
}
//move移动;
class move{
public:
dir point; //枚举变量point: 控制方向;
int food_x;
int food_y;
public:
void moving();
void change_point(char); //改变方向;
void get_food();
};
void move::moving(){
int a,b;
a= head-get_x(); //取得头结点横坐标
b= head-get_y(); //头结点纵坐标
switch(point){
case up: --a; break;
case down: ++a; break;
case left: --b; break;
case right: ++b; break;
}
if(a==19||b==19||a==0||b==0){ //判断是否撞墙;
cout"game over!!!"endl;
exit(0);
}
if(a==food_x b==food_y){ //吃food;
head-add_head(a,b);
get_food();
}
else{
head-add_head(a,b); //插入头结点;
head-delete_tail(); //删除尾结点;
}
}
void move::change_point(char keydown){
switch(keydown){
case 'w': point= up; break;
case 's': point= down; break;
case 'a': point= left; break;
case 'd': point= right; break;
}
}
void move::get_food(){
srand((unsigned int) time(NULL)); //做种子(程序运行时间);
food_x= rand()%18+1;
food_y= rand()%18+1;
f.game[food_x][food_y]= '*';
}
//main();
int main(){
cout"Using 'w,s,a,d'to control direction!!!\n\n\n";
//画框框和小蛇;
move m;
f.InitFence();
head-add_head(4,3);
head-add_head(4,4);
head-add_head(4,5);
m.get_food();
f.OutputF();
while (true){
char keydown= getch(); //getch()返回键盘上读取的字符;包含头文件conio.h
m.change_point(keydown);
while(!kbhit()){ //判断有没有按键落下;
system("cls"); //清屏函数;
m.moving();
f.OutputF();
Sleep(200);
}
}
return 0;
}
希望对你有帮助
求,贪吃蛇 C语言代码 及其每一步的讲解
/* 贪吃蛇程序 by champking */
#define N 200
#include graphics.h
#include stdlib.h
#include dos.h
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score = 0;/*得分*/
int gamespeed = 100000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd = DETECT, gm;
initgraph(gd, gm, "c:\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE, 0, THICK_WIDTH);/*设置线型*/
for(i = 50; i = 600; i += 10)/*画围墙*/
{
rectangle(i, 40, i + 10, 49); /*上边*/
rectangle(i, 451, i + 10, 460);/*下边*/
}
for(i = 40; i = 450; i += 10)
{
rectangle(50, i, 59, i + 10); /*左边*/
rectangle(601, i, 610, i + 10);/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
randomize();/*随机数发生器*/
food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life = 0;/*活着*/
snake.direction = 1;/*方向往右*/
snake.x[0] = 100; snake.y[0] = 100;/*蛇头*/
snake.x[1] = 110; snake.y[1] = 100;
snake.node = 2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes == 1)/*需要出现新食物*/
{
food.x = rand() % 400 + 60;
food.y = rand() % 350 + 60;
while(food.x % 10 != 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y % 10 != 0)
food.y++;
food.yes = 0;/*画面上有食物了*/
}
if(food.yes == 0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x, food.y, food.x + 10, food.y - 10);
}
for(i = snake.node - 1; i 0; i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i] = snake.x[i-1];
snake.y[i] = snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case 1: snake.x[0] += 10; break;
case 2: snake.x[0] -= 10; break;
case 3: snake.y[0] -= 10; break;
case 4: snake.y[0] += 10; break;
}
for(i = 3; i snake.node; i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i] == snake.x[0] snake.y[i] == snake.y[0])
{
GameOver();/*显示失败*/
snake.life = 1;
break;
}
}
if(snake.x[0]55||snake.x[0]595||snake.y[0]55||
snake.y[0]455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life == 1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0] == food.x snake.y[0] == food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x, food.y, food.x + 10, food.y - 10);
snake.x[snake.node] =- 20; snake.y[snake.node] =- 20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes = 1;/*画面上需要出现新的食物*/
score += 10;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i = 0; i snake.node; i++)
rectangle(snake.x[i], snake.y[i], snake.x[i] + 10,
snake.y[i] - 10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1], snake.y[snake.node-1],
snake.x[snake.node-1] + 10, snake.y[snake.node - 1] - 10);
} /*endwhile(!kbhit)*/
if(snake.life == 1)/*如果蛇死就跳出循环*/
break;
key = bioskey(0);/*接收按键*/
if(key == ESC)/*按ESC键退出*/
break;
else
if(key == UPsnake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key == RIGHT snake.direction != 2)
snake.direction=1;
else
if(key == LEFT snake.direction != 1)
snake.direction = 2;
else
if(key == DOWN snake.direction != 3)
snake.direction = 4;
}/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0, 0, 4);
outtextxy(200, 200, "GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL, YELLOW);
bar(50, 15, 220, 35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str, "score:%d", score);
outtextxy(55, 20, str);
}
/*图形结束*/
void Close(void)
{
getch();
closegraph();
}
c语言程序,谁帮我注释一下啊???贪吃蛇游戏,高值悬赏!谢谢朋友们。。。。。
import?java.awt.Color;??
import?java.awt.Graphics;??
import?java.awt.Graphics2D;??
import?java.awt.Rectangle;??
import?java.awt.event.KeyAdapter;??
import?java.awt.event.KeyEvent;??
import?java.awt.image.BufferedImage;??
import?java.util.ArrayList;??
import?java.util.List;??
import?javax.swing.JFrame;??
public?class?InterFace?extends?JFrame?{??
/**
*?WIDTH:宽
*?HEIGHT:高
*?SLEEPTIME:可以看作蛇运动的速度
*??L?=?1,R?=?2,?U?=?3,?D?=?4?左右上下代码
*/
????public?static?final?int?WIDTH?=?800,?HEIGHT?=?600,?SLEEPTIME?=?200,?L?=?1,R?=?2,?U?=?3,?D?=?4;??
????BufferedImage?offersetImage=?new?BufferedImage(WIDTH,?HEIGHT,BufferedImage.TYPE_3BYTE_BGR);;??
????Rectangle?rect?=?new?Rectangle(20,?40,?15?*?50,?15?*?35);??
????Snake?snake;??
????Node?node;??
????public?InterFace()?{??
???? //创建"蛇"对象
????????snake?=?new?Snake(this);??
????????//创建"食物"对象
????????createNode();??
????????this.setBounds(100,?100,?WIDTH,?HEIGHT);
????????//添加键盘监听器
????????this.addKeyListener(new?KeyAdapter()?{??
????????????public?void?keyPressed(KeyEvent?arg0)?{??
????????????????System.out.println(arg0.getKeyCode());??
????????????????switch?(arg0.getKeyCode())?{??
????????????????//映射上下左右4个键位
????????????????case?KeyEvent.VK_LEFT:??
????????????????????snake.dir?=?L;??
????????????????????break;??
????????????????case?KeyEvent.VK_RIGHT:??
????????????????????snake.dir?=?R;??
????????????????????break;??
????????????????case?KeyEvent.VK_UP:??
????????????????????snake.dir?=?U;??
????????????????????break;??
????????????????case?KeyEvent.VK_DOWN:??
????????????????????snake.dir?=?D;??
????????????????}??
????????????}??
????????});??
????????this.setTitle("贪吃蛇?0.1???By?:?Easy");??
????????this.setDefaultCloseOperation(EXIT_ON_CLOSE);??
????????this.setVisible(true);??
????????//启动线程,开始执行
????????new?Thread(new?ThreadUpadte()).start();??
????}??
????public?void?paint(Graphics?g)?{??
????????Graphics2D?g2d?=?(Graphics2D)?offersetImage.getGraphics();??
????????g2d.setColor(Color.white);??
????????g2d.fillRect(0,?0,?WIDTH,?HEIGHT);??
????????g2d.setColor(Color.black);??
????????g2d.drawRect(rect.x,?rect.y,?rect.width,?rect.height);??
????????//如果蛇碰撞(吃)到食物,则创建新食物
????????if?(snake.hit(node))?{??
????????????createNode();??
????????}??
????????snake.draw(g2d);??
????????node.draw(g2d);??
????????g.drawImage(offersetImage,?0,?0,?null);??
????}??
????class?ThreadUpadte?implements?Runnable?{??
????????public?void?run()?{??
???????? //无限重绘画面
????????????while?(true)?{??
????????????????try?{??
????????????????????Thread.sleep(SLEEPTIME);??
????????????????????repaint();??//
????????????????}?catch?(InterruptedException?e)?{??
????????????????????e.printStackTrace();??
????????????????}??
????????????}??
????????}??
????}??
????/**
?????*?创建食物
?????*/
????public?void?createNode()?{??
???? //随机食物的出现位置
????????int?x?=?(int)?(Math.random()?*?650)?+?50,y?=?(int)?(Math.random()?*?500)?+?50;??
????????Color?color?=?Color.blue;??
????????node?=?new?Node(x,?y,?color);??
????}??
????public?static?void?main(String?args[])?{??
????????new?InterFace();??
????}??
}??
/**
?*?节点类(包括食物和蛇的身躯组成节点)
?*/
class?Node?{??
????int?x,?y,?width?=?15,?height?=?15;??
????Color?color;??
????public?Node(int?x,?int?y,?Color?color)?{??
????????this(x,?y);??
????????this.color?=?color;??
????}??
????public?Node(int?x,?int?y)?{??
????????this.x?=?x;??
????????this.y?=?y;??
????????this.color?=?color.black;??
????}??
????public?void?draw(Graphics2D?g2d)?{??
????????g2d.setColor(color);??
????????g2d.drawRect(x,?y,?width,?height);??
????}??
????public?Rectangle?getRect()?{??
????????return?new?Rectangle(x,?y,?width,?height);??
????}??
}??
/**
?*?蛇
?*/
class?Snake?{??
????public?ListNode?nodes?=?new?ArrayListNode();??
????InterFace?interFace;??
????int?dir=InterFace.R;??
????public?Snake(InterFace?interFace)?{??
????????this.interFace?=?interFace;??
????????nodes.add(new?Node(20?+?150,?40?+?150));??
????????addNode();??
????}
????/**
?????*?是否碰撞到食物
?????*?@return?true?是?false?否
?????*/
????public?boolean?hit(Node?node)?{??
???? //遍历整个蛇体是否与食物碰撞
????????for?(int?i?=?0;?i??nodes.size();?i++)?{??
????????????if?(nodes.get(i).getRect().intersects(node.getRect()))?{??
????????????????addNode();??
????????????????return?true;??
????????????}??
????????}??
????????return?false;??
????}??
????public?void?draw(Graphics2D?g2d)?{??
????????for?(int?i?=?0;?i??nodes.size();?i++)?{??
????????????nodes.get(i).draw(g2d);??
????????}??
????????move();??
????}??
????public?void?move()?{??
????????nodes.remove((nodes.size()?-?1));??
????????addNode();??
????}??
????public?synchronized?void?addNode()?{??
????????Node?nodeTempNode?=?nodes.get(0);??
????????//如果方向
????????switch?(dir)?{??
????????case?InterFace.L:
???????? //判断是否会撞墙
????????????if?(nodeTempNode.x?=?20)?{?
????????????????nodeTempNode?=?new?Node(20?+?15?*?50,?nodeTempNode.y);??
????????????}??
????????????nodes.add(0,?new?Node(nodeTempNode.x?-?nodeTempNode.width,??
????????????????????nodeTempNode.y));??
????????????break;??
????????case?InterFace.R:?
???????? //判断是否会撞墙
????????????if?(nodeTempNode.x?=?20?+?15?*?50?-?nodeTempNode.width)?{??
????????????????nodeTempNode?=?new?Node(20?-?nodeTempNode.width,?nodeTempNode.y);??
????????????}??
????????????nodes.add(0,?new?Node(nodeTempNode.x?+?nodeTempNode.width,??
????????????????????nodeTempNode.y));??
????????????break;??
????????case?InterFace.U:??
???????? //判断是否会撞墙
????????????if?(nodeTempNode.y?=?40)?{??
????????????????nodeTempNode?=?new?Node(nodeTempNode.x,?40?+?15?*?35);??
????????????}??
????????????nodes.add(0,?new?Node(nodeTempNode.x,?nodeTempNode.y?-?nodeTempNode.height));??
????????????break;??
????????case?InterFace.D:
???????? //判断是否会撞墙
????????????if?(nodeTempNode.y?=?40?+?15?*?35?-?nodeTempNode.height)?{??
????????????????nodeTempNode?=?new?Node(nodeTempNode.x,40?-?nodeTempNode.height);??
????????????}??
????????????nodes.add(0,?new?Node(nodeTempNode.x,?nodeTempNode.y?+?nodeTempNode.height));??
????????????break;??
????????}??
????}