贪吃蛇c程序设计报告含c代码
贪吃蛇 C语言代码
}
snake[x][y]=FOOD;
draw(snake);
/*---------------------------------------*/
/*--------控制的部分---------------------*/
while(judgeGO(snake))
}
if(x>0&&x<16&&y>0&&y<16)
{
if(a==0)
printf("█");
else printf("□");
return ;
}
}
void draw(int (*sna)[17])
draw(snake);
Sleep(100);
continue;
}
rightmove(snake);
draw(snake);
}
int randno()
{
srand(time(NULL)); //运用随机函数,取随机数,出现食物用
return rand()%15+1;
}
//判断游戏是否结束
bool judgeGO(int (*sna)[17])
{
int x,y,i=0,max=0,count=0;
while(!kbhit()&&key1!=77&&judgeGO(snake))
{
if(judgeF(snake,key))
{
draw(snake);
Sleep(100);
超简单贪吃蛇c语言代码编写
超简单贪吃蛇c语言代码编写贪吃蛇其实就是实现以下几步——1:蛇的运动(通过“画头擦尾”来达到蛇移动的视觉效果)2:生成食物3:蛇吃食物(实现“画头不擦尾”)4:游戏结束判断(也就是蛇除了食物,其余东西都不能碰)#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#include<time.h>#define width 60#define hight 25#define SNAKESIZE 200//蛇身的最长长度int key=72;//初始化蛇的运动方向,向上int changeflag=1;//用来标识是否生成食物,1表示蛇还没吃到食物,0表示吃到食物int speed=0;//时间延迟struct {int len;//用来记录蛇身每个方块的坐标int x[SNAKESIZE];int y[SNAKESIZE];int speed;}snake;struct{int x;int y;}food;void gotoxy(int x,int y)//调用Windows的API函数,可以在控制台的指定位置直接操作,这里可暂时不用深究{COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }//■○void drawmap(){//打印图框for (int _y = 0; _y < hight; _y++){for (int x = 0; x < width; x+=2){if (x == 0 || _y == 0 || _y == hight - 1 || x == width - 2){gotoxy(x, _y);printf("■");}}}//打印蛇头snake.len=3;snake.x[0]=width/2;snake.y[0]=hight/2;gotoxy(snake.x[0],snake.y[0]);printf("■");//打印蛇身for(int i=1;i<snake.len;i++){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]+1;gotoxy(snake.x[i],snake.y[i]);printf("■");}//初始化食物的位置food.x=20;food.y=20;gotoxy(food.x,food.y);printf("○");}/**控制台按键所代表的数字*“↑”:72*“↓”:80*“←”:75*“→”:77*/void snake_move()//按键处理函数{int history_key=key;if (_kbhit()){fflush(stdin);key = _getch();key = _getch();}if(changeflag==1)//还没吃到食物,把尾巴擦掉{gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);printf(" ");}for(int i=snake.len-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}if(history_key==72&&key==80)key=72;if(history_key==80&&key==72)key=80;if(history_key==75&&key==77)key=75;if(history_key==77&&key==75)key=77;switch(key){case 72:snake.y[0]--;break;case 75:snake.x[0]-= 2;break;case 77:snake.x[0]+= 2;break;case 80:snake.y[0]++;break;}gotoxy(snake.x[0],snake.y[0]);printf("■");gotoxy(0,0);changeflag=1;}void creatfood(){if(snake.x[0] == food.x && snake.y[0] == food.y)//只有蛇吃到食物,才能生成新食物{changeflag=0;snake.len++;if(speed<=100)speed+=10;while(1){srand((unsigned int) time(NULL));food.x=rand()%(width-6)+2;//限定食物的x范围不超出围墙,但不能保证food.x 为偶数food.y=rand()%(hight-2)+1;for(int i=0;i<snake.len;i++){if(food.x==snake.x[i]&&food.y==snake.y[i])//如果产生的食物与蛇身重合则退出break;}if(food.x%2==0)break;//符合要求,退出循环}gotoxy(food.x,food.y);printf("○");}}bool Gameover(){//碰到围墙,OVERif(snake.x[0]==0||snake.x[0]==width-2)return false;if(snake.y[0]==0||snake.y[0]==hight-1) return false;//蛇身达到最长,被迫OVERif(snake.len==SNAKESIZE)return false;//头碰到蛇身,OVERfor(int i=1;i<snake.len;i++){if(snake.x[0]==snake.x[i]&&snake.y[0]==snake.y[i])return false;}return true;}int main(){system("mode con cols=60 lines=27");drawmap();while(Gameover()){snake_move();creatfood();Sleep(350-speed);//蛇的移动速度}return 0;}。
贪吃蛇游戏代码(C语言编写)
cleardevice(); if (!pause)
nextstatus(); else {
settextstyle(1,0,4); setcolor(12); outtextxy(250,100,"PAUSE"); } draw();
if(game==GAMEOVER) { settextstyle(0,0,6); setcolor(8); outtextxy(101,101,"GAME OVER"); setcolor(15); outtextxy(99,99,"GAME OVER"); setcolor(12); outtextxy(100,100,"GAME OVER"); sprintf(temp,"Last Count: %d",count); settextstyle(0,0,2); outtextxy(200,200,temp); }
place[tear].st = FALSE; tear ++; if (tear >= MAX) tear = 0; } else { eat = FALSE; exit = TRUE; while(exit) { babyx = rand()%MAXX; babyy = rand()%MAXY; exit = FALSE; for( i = 0; i< MAX; i++ ) if( (place[i].st)&&( place[i].x == babyx) && (place[i].y == babyy))
struct SPlace { int x; int y; int st; } place[MAX]; int speed; int count; int score; int control; int head; int tear; int x,y; int babyx,babyy; int class; int eat; int game; int gamedelay[]={5000,4000,3000,2000,1000,500,250,100}; int gamedelay2[]={1000,1};
C语言课程设计报告——贪吃蛇源程序
C 语言课程设计(小游戏贪吃蛇得程序设计报告)设计人:班级:201年月号目录一:概述1:研究背景及意义2:设计得任务与需要知识点3:具体完成设计内容二:需求分析1:功能需求2:操作方法三:总体设计1:模块划分2:数据结构设计四:详细设计1:主空摸块设计2:绘制游戏界面3:游戏得具体过程4:游戏得结束处理5:显示排行榜信息模块五:程序得调试与测试1:动画与音乐同步2:蛇得运行3:终止程序六:结论七::结束语八:程序清单九:参考文献一. 概述本课程设计以软件工程方法为指导,采用了结构化,模块化得程序设计方法,以C语言技术为基础,使用TurboC++3、0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统得实现与测试。
1、1 研究得背景及意义随着社会得发展,人们生活得节奏日益加快,越来越多得人加入了全球化得世界。
人们不再拘泥与一小块天地,加班,出差成了现代人不可避免得公务。
而此时一款可以随时随地娱乐得游戏成为了人们得需要。
此次课程设计完成得贪吃蛇小游戏,正就是为了满足上述需求而设计出来得。
贪吃蛇游戏虽小,却设计诸多得知识点。
通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程得与那个发,技术与工具开发软件得过程,进一步掌握结构化,模块化得程序设计方法与步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构得使用方法,掌握图形,声音,随机数等多种库函数得使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程得学习与将来实际软件开发打下坚实得基础。
1、2设计得任务与需要得知识点1、2、1 课程设计主要完成得任务1)、通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计得思想,培养解决实际问题得能力。
2)有同步播放动画,声音效果。
3)设计好数组元素与蛇,食物得对应关系。
贪吃蛇游戏c语言源代码
outtextxy(160,220,"Game Over");
loop1:key=bioskey(0);
if(key==Enter)
{cleardevice();
TheFirstBlock();
}
else
if(key==ESC)
void DrawMap(void);
void Initsnake(void);
void Initfood(void);
void Snake_Headmv(void);
void Flag(int,int,int,int);
void GameOver(void);
void Snake_Bodymv(void);
line(480,20,620,20);
line(620,20,620,460);
line(620,460,480,460);
line(480,460,480,20);
}
void Initsnake()
{randomize();
num=2;
Snk[0].x=random(440);
{checkx=Snk[0].x;
checky=Snk[0].y;
Dsnkorfd(Snk[0].x,Snk[0].y,0);
Snk[0].x+=20;
Dsnkorfd(Snk[0].x,Snk[0].y,Snk[0].color);
}
}
void Flag(int a,int b,int c,int d)
void Snake_Bodyadd(void);
贪吃蛇代码(C 实现)
for(i=T.tail;i!=T.head;) {
; }
if(kbhit()&&(order=getch(),order=='w'||order=='s'||order=='a'|| order=='d'))
{
sum=T.body[(T.head-1+ML)%ML]; system("CLS"); for(i=T.tail;i!=T.head;) {
jud=order; //printf("-->a\n"); if(map[sum/100][sum%100-1]!=-1) { for(i=T.tail;i!=T.head;) { temp=T.body[i]; map[temp/100][temp%100]=0; i++; i%=ML; }
aaa(); } else {
sum=T.body[i]; map[sum/100][sum%100]=-1; i++; i%=ML; } while(1) { sum=getnum(); if(map[sum/100][sum%100]==0) {
map[sum/100][sum%100]=1; break; } } for(i=T.tail;i!=T.head;) { sum=T.body[i]; map[sum/100][sum%100]=0; i++; i%=ML; } } else { T.body[T.head++]=sum; T.head%=ML; T.tail=(++T.tail)%ML; } } void sss() { int sum,i; sum=T.body[(T.head-1+ML)%ML]+100; if(map[sum/100][sum%100]==1) { T.length++; T.body[T.head++]=sum; T.head%=ML; map[sum/100][sum%100]=0; for(i=T.tail;i!=T.head;) { sum=T.body[i]; map[sum/100][sum%100]=-1; i++;
C语言贪吃蛇代码
head->x=17;
head->y=17;
score=0;
ms=300;
for(int i=0;i<35;++i)
outtextxy(i,35,"▓");
outtextxy(2,41,"游戏速度");
outtextxy(4,42,"300");
outtextxy(8,42,"得分");
ontimer(tally[2],ms*2,AI());
}
}
void kmsg(UINT ch)
{
switch(ch)
{
case 72:
if(x&&!map[x-1][y])
move(--x,y);
else if(map[x-1][y]==2)
add(--x,y);
else
end();
break;
case 80:
break;
case 77:
if(ch!=75)
ch=77;
break;
}
if(GetKeyState(VK_SPACE)&0x80)//如果空格键是按下状态,将速度临时调整至60ms
ontimer(tally[0],60,kmsg(ch));
else
ontimer(tally[1],ms,kmsg(ch));//否则按照变量ms的速度运行游戏
head=head->n;
head->x=x;
head->y=y;
map[x][y]=1;
outtextxy(x,y,"■");
贪吃蛇c语言代码
#include<stdio.h>#include<stdlib.h>#include<Windows.h>#include<conio.h>#include<time.h>char gamemap[20][40];//游戏地图大小20*40 int score=0;//当前分数//记录蛇的结点int x[800];//每个结点的行编号int y[800];//每个结点的列编号int len = 0;//蛇的长度//记录水果信息int fx=;//食物的横坐标int fy=00;//食物的纵坐标int fcount=0;//食物的数目//主要函数操作void createfood();//生成食物void PrintgameMap(int x[],int y[]);//画游戏地图void move(int x[],int y[]);//移动蛇int main(){srand(time(NULL));//初始化蛇头和身体的位置,默认刚开始蛇长为2 x[len] = 9;y[len] = 9;len++;x[len] = 9;y[len] = 8;len++;createfood();PrintgameMap(x,y);move(x,y);return 0;}void createfood(){if(0==fcount){int tfx=rand()%18+1;int tfy=rand()%38+1;int i,j;int have=0;//为0表示食物不是食物的一部分for(i=0;i<len;i++){for(j=0;j<len;j++){if(x[i]==fx&&y[j]==fy){have=1;break;}else{have=0;}}if(1==have)//若为蛇的一部分,执行下一次循环{continue;}else//否则生成新的水果{fcount++;fx=tfx;fy=tfy;break;}}}}//游戏地图void PrintgameMap(int x[],int y[]){int snake = 0,food=0;int i, j;//画游戏地图,并画出蛇的初始位置for (i = 0; i < 20; i++){for (j = 0; j < 40; j++){if (i == 0 && j >= 1 && j <= 38){gamemap[i][j] = '=';}else if (i == 19 && j >= 1 && j <= 38){gamemap[i][j] = '=';}else if (j == 0 || j == 39){gamemap[i][j] = '#';}else{gamemap[i][j] = ' ';}//判断蛇是否在当前位置int k;for ( k = 0; k < len; k++){if (i == x[k]&&j == y[k]){snake = 1;break;}else{snake = 0;}}{if(fcount&&fx==i&&fy==j){food=1;}else{food=0;}}//若蛇在当前位置if (1==snake ){printf("*");}else if(1==food){printf("f");}//若蛇不在当前位置并且当前位置没有水果else{printf("%c", gamemap[i][j]);}}printf("\n");}printf("score:%d",score);}//移动void move(int x[],int y[]){char s;s=getch();int move=0,beat=0;while (1){int cx[800];int cy[800];memcpy(cx, x, sizeof(int)*len); memcpy(cy, y, sizeof(int)*len); //头if (s=='w'){x[0]--;move=1;if(x[0]<=0){printf("Game over\n"); break;}}else if (s=='s'){x[0]++;move=1;if(x[0]>=19){printf("Game over\n"); break;}}else if (s=='a'){y[0] --;move=1;if(y[0]<=0){printf("Game over\n");break;}}else if (s=='d'){y[0]++;move=1;if(y[0]>=39){printf("Game over\n");break;}}//身体int i;for ( i = 1; i < len; i++){x[i] = cx[i - 1];y[i] = cy[i - 1];}for(i=1;i<len;i++)//要是咬到了自己{if(x[0]==x[i]&&y[0]==y[i]){beat=1;}else{beat=0;}}if(1==beat){printf("Game over\n");break;}if(1==move){if(fcount&&x[0]==fx&&y[0]==fy)//如果吃到了果子{//拷贝当前蛇头地址到第二个结点memcpy(x+1,cx,sizeof(int)*len); memcpy(y+1,cy,sizeof(int)*len); len++;fcount--;fx=0;fy=0;score++;createfood();}Sleep(70);system("cls");PrintgameMap( x, y);}elsecontinue;if(kbhit())//判断是否按下按键{s=getch();}}}。
贪吃蛇c代码
void Draw_Score(Snake S)
{
snprintf(str, 10, "%d", S.snake_long);
font = TTF_OpenFont("test.ttf", 15);
color.r = 0;
color.g = 0;
color.b = 255;
case 2:{x += 24;y -= 24;}break;
case 3:{x += 24;y += 24;}break;
}
flag = (flag+1)%4;
}
}
void Game_background()
{
dst.x = 0;
dst.y = 0;
dst.x = 150;
dst.y = 350;
dst.w = score->w;
dst.h = score->h;
SDL_BlitSurface(score, NULL, screen, &dst);
SDL_UpdateRects (screen, 1, &dst);
start_background = LoadIMG (str);
SDL_Delay (15);
dst.x = x;
dst.y = y;
dst.w = start_background->w;
dst.h = start_background->h;
SDL_BlitSurface (start_background, NULL, screen, &dst);
c 贪吃蛇实验报告
C 贪吃蛇实验报告1. 引言贪吃蛇是一款经典的游戏,玩家通过操纵蛇的移动,使其吃到食物并避免碰到自己的身体或墙壁。
本实验旨在通过编写一个贪吃蛇游戏的实现代码,展示基本的编程思路和方法。
2. 实验环境本实验使用Python编程语言进行实现,采用了以下工具和库: - Python 3.9.2 - Pygame 2.0.13. 实验步骤3.1 初始化游戏界面首先,我们需要创建一个窗口来显示游戏界面。
在Pygame中,可以使用pygame.display.set_mode()函数来创建一个窗口。
我们还需要定义一些常量,如窗口的大小、蛇的初始位置和速度等。
3.2 绘制蛇和食物在游戏界面中,蛇和食物是需要绘制出来的。
我们可以使用Pygame提供的绘图函数来实现。
具体步骤如下: 1. 创建一个蛇的列表,表示蛇的身体。
初始时,蛇只有一个方块。
2. 创建一个食物的坐标点,表示食物的位置。
3. 使用pygame.draw.rect()函数绘制蛇和食物的方块。
3.3 控制蛇的移动蛇的移动是通过改变蛇的身体坐标来实现的。
我们需要定义一个变量来表示蛇移动的方向,如上、下、左、右。
通过监听键盘事件,获取玩家的操作,然后改变蛇移动的方向。
3.4 更新蛇的位置蛇的位置需要不断更新,使其向当前移动方向移动一个方块的距离。
当蛇吃到食物时,蛇的身体长度增加一个方块。
具体步骤如下: 1. 根据当前移动方向,更新蛇头的坐标。
2. 将蛇头的坐标添加到蛇的身体列表中。
3. 如果蛇吃到了食物,生成一个新的食物坐标,并将蛇的身体长度增加一个方块。
3.5 判断游戏结束游戏结束的条件有两种情况:蛇碰到自己的身体或者蛇碰到墙壁。
我们需要在每次更新蛇的位置后,判断是否满足游戏结束的条件。
如果满足条件,游戏结束。
3.6 游戏循环完成以上步骤后,我们可以将整个游戏的逻辑放在一个循环中,不断更新蛇的位置、绘制游戏界面,并响应用户的操作。
直到游戏结束为止。
C语言简单贪吃蛇游戏代码
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <CONIO.H>#include <AFX.H>intx[10]={0},y[10]={0},xx[20]={0},yy[20]={0},xxx[20],yyy[20],actx=0,acty=1,eggx[10]={13,2,11 },eggy[10]={5,4,4};time_t time1,time2;void eogame(){int i;system("cls");for(i=0;i<10;i++)printf("\n");printf(" game over !!");getch();system("exit");}void show(){int i,j,tempx,tempy,max=0,ifget=0;time(&time1);system("cls");for(i=0;i<10;i++){xx[i]=x[i];yy[i]=y[i];}for(i=0;i<10;i++){xx[10+i]=eggx[i];yy[10+i]=eggy[i];}for (j=0;j<19;j++)for (i=0;i<19-j;i++){if (yy[i]>yy[i+1]){tempy=yy[i];yy[i]=yy[i+1];yy[i+1]=tempy;tempx=xx[i];xx[i]=xx[i+1];xx[i+1]=tempx;}else if(yy[i]==yy[i+1]&&xx[i]>xx[i+1]){tempx=xx[i];xx[i]=xx[i+1];xx[i+1]=tempx;}}yyy[0]=yy[0];xxx[0]=xx[0];for (i=0;i<19;i++){yyy[i+1]=yy[i+1]-yy[i];if(yy[i+1]==yy[i])xxx[i+1]=xx[i+1]-xx[i];else xxx[i+1]=xx[i+1];}for(i=0;i<20;i++){for(j=0;j<yyy[i];j++)printf("\n");for (j=1;j<xxx[i];j++)printf(" ");if(xxx[i]>0||yyy[i]>0)printf("@ ");}time(&time2);while(time2-time1<1)time(&time2);for(i=0;i<10;i++)if(x[0]+actx==eggx[i]&&y[0]+acty==eggy[i]){ifget++;eggx[i]=0;eggy[i]=0;} for(i=0;i<9;i++){if(x[i+1]!=0||y[i+1]!=0||ifget!=0){xx[i+1]=x[i];yy[i+1]=y[i];}else{xx[i+1]=0;yy[i+1]=0;}}if(ifget>0)ifget--;x[0]=x[0]+actx;y[0]=y[0]+acty;for(i=1;i<10;i++){x[i]=xx[i];y[i]=yy[i];}if(x[0]==0||x[0]>20||y[0]==0||y[0]>20)eogame();for(i=1;i<10;i++)if(x[0]==x[i]&&y[0]==y[i])eogame();}DWORD WINAPI KEYBOARD(LPVOID IpParam) {char key,guard=2,ch;insert:key=getch();if(key==-32)guard=0;else guard++;if(guard==1)switch(key){case 72: actx=0;acty=-1;break;case 80: actx=0;acty=1;break;case 75: actx=-1;acty=0;break;case 77: actx=1;acty=0;break;default: break;}goto insert;}void main(){x[0]=1;y[0]=1;system("mode con:cols=40 lines=20");CreateThread(NULL,0,KEYBOARD,NULL,0,NULL);while (1)show();}。
C语言版贪吃蛇代码
C语言版贪食蛇游戏源代码(我自己写的)热1已有58 次阅读2011-01-18 17:57#include <stdio.h>#include <windows.h>#include <conio.h>#include <string.h>#define UP 0#define DOWN 1#define LEFT 2#define RIGHT 3//宏定义,定义四个方向--0 1 2 3分别代表上下左右#define TURN_NUM 1000//可以保存的最多转弯次数,一条蛇同时最多只能有1000次的弯曲#define INIT_LENGTH 8#define UP_EDGE 0#define DOWN_EDGE 24#define LEFT_EDGE 0#define RIGHT_EDGE 79//定义上下左右四个边界#define X 0//初始状态下蛇的身体坐标(LEFT_EDGE+X,UP_EDGE+Y)#define Y 0//决定初始状态下蛇的身体相对于游戏界面原点(LEFT_EDGE,UP_EDGE)的位置/*定义全局变量*/char buf[1000]="@*******";//决定初始的snake_length的值:必须与INIT_LENGTH保持同步char *snake=buf;//蛇的身体,最长有1000个环节char FOOD='$';//记录食物的形状int food_num=0;//记录已经吃下的食物数量int score=0;//记录当前的得分,由food_num决定int snake_length=INIT_LENGTH;//initializer is not a constant:strlen(snake); int cursor[2]={LEFT_EDGE+20+INIT_LENGTH,UP_EDGE+10};//记录当前光标所指位置int head[2]={LEFT_EDGE+20+INIT_LENGTH-1,UP_EDGE+10};//记录头部的坐标int tail[2]={0,0};//记录尾巴的坐标int old_tail[2];//记录上一步尾巴所在位置int food[2]={0,0};//记录食物的坐标int init_position[2]={LEFT_EDGE+X,UP_EDGE+Y};//蛇的初始位置int direction=RIGHT;//记录当前蛇的头部的运动方向int turn_point[TURN_NUM][2];int head_turn_num=0;//记录头部的转弯次数int tail_turn_num=0;//记录尾巴的转弯次数int game_over=0;//判断游戏是否结束/*主方法*/void main(){//函数声名void gotoxy(int x,int y);//移动光标的位置void cur_state();//测试游戏的当前状态参数void print_introduction();//打印游戏规则void init();//初始化游戏void control();//接收键盘控制命令void move();//控制身体的运动void move_up();//向上运动void move_down();//向下运动void move_left();//向左运动void move_right();//向右运动void update_tail_position();//更新尾巴的坐标void generate_food();//随机产生食物void eat_food();//吃下食物char ch;while(!game_over){print_introduction();printf("\t\t按任意键开始游戏");getch();system("cls");//cur_state();init();control();system("cls");gotoxy(0,10);printf("\t\t您的当前得分是%d\n",score);printf("\t\t这条蛇共转了%d次弯,它的身体长度是%d\n",head_turn_num,strlen(snake));printf("\t\t游戏结束,您要再玩一局吗?(y/n)");scanf("%c",&ch);getchar();if(ch=='y'||ch=='Y'){continue;}else{system("cls");printf("\n\n\n\t\t\t谢谢您的使用,再见!");_sleep(3000);game_over=1;}}}/*打印游戏规则*/void print_introduction(){int i=0;int rule_num;char *rule[4];rule[i++]="\n\n\t\t\t欢迎您来玩贪食蛇游戏\n";rule[i++]="\t\t游戏规则如下:\n";rule[i++]="\t\t1.按上下左右键控制蛇的运动方向\n";rule[i++]="\t\t2.按Ctrl+C结束当前游戏\n";rule_num=i;system("cls");for(i=0;i<rule_num;i++){puts(rule[i]);}}/*移动光标的位置*/void gotoxy(int x,int y){COORD coord={x,y};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); }/*测试游戏的当前状态参数*/void cur_state(){printf("游戏的当前状态参数如下:\n");printf("snake=%s\n",snake);printf("snake_body_length=%d\n",strlen(snake));printf("head=(%d,%d)\n",head[0],head[1]);printf("tail=(%d,%d)\n",tail[0],tail[1]);printf("direction=%d\n",direction);printf("game_over=%d\n",game_over);}/*游戏进入初始状态*/void init(){int i;/*初始化游戏参数*/food_num=0;//记录已经吃下的食物数量score=0;//记录当前的得分,由food_num决定snake_length=INIT_LENGTH;cursor[0]=init_position[0]+INIT_LENGTH;cursor[1]=init_position[1];//记录当前光标所指位置head[0]=init_position[0]+INIT_LENGTH-1;head[1]=init_position[1];//记录头部的坐标tail[0]=init_position[0];tail[1]=init_position[1];//记录尾巴的坐标direction=RIGHT;//记录当前蛇的头部的运动方向head_turn_num=0;//记录头部的转弯次数tail_turn_num=0;//记录尾巴的转弯次数game_over=0;//判断游戏是否结束turn_point[0][0]=RIGHT_EDGE;turn_point[0][1]=0;/*游戏参数初始化完毕*/generate_food();//投下第一粒食物gotoxy(init_position[0],init_position[1]);//将光标移动到到初始化位置for(i=snake_length;i>0;i--){putchar(snake[i-1]);}}/*接收键盘控制命令*/void control(){char command;//存放接收到命令while(1){command=getch();if(command==-32){//F11,F12:-123,-122command=getch();if(command=='H' && (direction==LEFT || direction==RIGHT)){//光标上移direction=UP;turn_point[head_turn_num%TURN_NUM][0]=head[0];turn_point[head_turn_num%TURN_NUM][1]=head[1];head_turn_num++;}else if(command=='P' && (direction==LEFT || direction==RIGHT)){//光标下移direction=DOWN;turn_point[head_turn_num%TURN_NUM][0]=head[0];turn_point[head_turn_num%TURN_NUM][1]=head[1];head_turn_num++;}else if(command=='K' && (direction==UP || direction==DOWN)){//光标左移direction=LEFT;turn_point[head_turn_num%TURN_NUM][0]=head[0];turn_point[head_turn_num%TURN_NUM][1]=head[1];head_turn_num++;}else if(command=='M' && (direction==UP || direction==DOWN)){//光标右移direction=RIGHT;turn_point[head_turn_num%TURN_NUM][0]=head[0];turn_point[head_turn_num%TURN_NUM][1]=head[1];head_turn_num++;}else if(command==-122 || command==-123);}else if(command==0){command=getch();//接收Fn的下一个字符//F1~F10:59~68}else if(command>=1&&command<=26){//Ctrl+a~z:1~26if(command==3){break;}}else{//do nothing!}move();if(head[0]==food[0] && head[1]==food[1]){eat_food();//吃掉一粒事物generate_food();//投下新食物}}}/*蛇的身体运动*/void move(){if(direction==UP){//printf("Moving up!\n");move_up();}else if(direction==DOWN){//printf("Moving down!\n");move_down();}else if(direction==LEFT){//printf("Moving left!\n");move_left();}else if(direction==RIGHT){//printf("Moving right!\n");move_right();}}/*向上运动*/void move_up(){if(cursor[1]>=UP_EDGE){gotoxy(head[0],head[1]);putchar('*');gotoxy(head[0],head[1]-1); putchar(snake[0]);gotoxy(tail[0],tail[1]);//_sleep(1000);//查看尾部光标putchar(0);update_tail_position();head[1]-=1;cursor[0]=head[0];cursor[1]=head[1]-1; gotoxy(cursor[0],cursor[1]); }else{gotoxy(head[0],head[1]);}}/*向下运动*/void move_down(){if(cursor[1]<=DOWN_EDGE){ gotoxy(head[0],head[1]); putchar('*');gotoxy(head[0],head[1]+1); putchar(snake[0]);gotoxy(tail[0],tail[1]);//_sleep(1000);//查看尾部光标putchar(0);update_tail_position();head[1]+=1;cursor[0]=head[0];cursor[1]=head[1]+1; gotoxy(cursor[0],cursor[1]); }else{gotoxy(head[0],head[1]);}}/*向左运动*/void move_left(){if(cursor[0]>=LEFT_EDGE){ gotoxy(head[0],head[1]); putchar('*');gotoxy(head[0]-1,head[1]); putchar(snake[0]);gotoxy(tail[0],tail[1]);//_sleep(1000);//查看尾部光标putchar(0);update_tail_position();head[0]-=1;cursor[0]=head[0]-1;cursor[1]=head[1];gotoxy(cursor[0],cursor[1]);}else{gotoxy(head[0],head[1]);}}/*向右运动*/void move_right(){if(cursor[0]<=RIGHT_EDGE){gotoxy(head[0],head[1]);putchar('*');putchar(snake[0]);gotoxy(tail[0],tail[1]);//_sleep(1000);//查看尾部光标putchar(0);update_tail_position();head[0]+=1;cursor[0]=head[0]+1;cursor[1]=head[1];gotoxy(cursor[0],cursor[1]);}else{gotoxy(head[0],head[1]);}}/*更新尾巴的坐标*/void update_tail_position(){old_tail[0]=tail[0];old_tail[1]=tail[1];//保存上次尾巴的位置if(tail[0]==food[0] && tail[1]==food[1]){gotoxy(tail[0],tail[1]);putchar(FOOD);}if(tail_turn_num<head_turn_num){if(tail[0]<turn_point[tail_turn_num%TURN_NUM][0]){tail[0]+=1;}else if(tail[0]>turn_point[tail_turn_num%TURN_NUM][0]){ tail[0]-=1;}else if(tail[1]<turn_point[tail_turn_num%TURN_NUM][1]){ tail[1]+=1;}else if(tail[1]>turn_point[tail_turn_num%TURN_NUM][1]){ tail[1]-=1;}else if(tail[0]==turn_point[(tail_turn_num-1)%TURN_NUM][0] && tail[1]==turn_point[(tail_turn_num-1)%TURN_NUM][1]){if(tail[0]<turn_point[tail_turn_num%TURN_NUM][0]){tail[0]+=1;}else if(tail[0]>turn_point[tail_turn_num%TURN_NUM][0]){tail[0]-=1;}else if(tail[1]<turn_point[tail_turn_num%TURN_NUM][1]){tail[1]+=1;}else if(tail[1]>turn_point[tail_turn_num%TURN_NUM][1]){tail[1]-=1;}}if(tail[0]==turn_point[tail_turn_num%TURN_NUM][0] && tail[1]==turn_point[tail_turn_num%TURN_NUM][1]){tail_turn_num+=1;}}else if(tail_turn_num==head_turn_num){if(tail[0]<head[0]){tail[0]+=1;}else if(tail[0]>head[0]){tail[0]-=1;}else if(tail[1]<head[1]){tail[1]+=1;}else if(tail[1]>head[1]){tail[1]-=1;}}}void generate_food(){int i=0,j=0;do{i=rand()%DOWN_EDGE;}while(i<UP_EDGE || i>DOWN_EDGE);do{j=rand()%DOWN_EDGE;}while(j<LEFT_EDGE || j>RIGHT_EDGE);food[0]=i;food[1]=j;gotoxy(food[0],food[1]);//抵达食物投放点putchar(FOOD);//放置食物gotoxy(cursor[0],cursor[1]);//返回光标当前位置}void eat_food(){if(tail[0]==turn_point[(tail_turn_num-1)%TURN_NUM][0] &&tail[1]==turn_point[(tail_turn_num-1)%TURN_NUM][1]){ tail_turn_num-=1;}snake[snake_length++]=snake[1];tail[0]=old_tail[0];tail[1]=old_tail[1];//将尾巴回退到上一步所在的位置gotoxy(tail[0],tail[1]);putchar(snake[1]);food_num++;score=food_num;gotoxy(cursor[0],cursor[1]);}。
C语言课程设计贪吃蛇源代码
C语言课程设计贪吃蛇源代码c语言程序贪吃蛇代码#include#include#include#include#include#definen21file*fp;ints;voidboundary(void);//已经开始界面voidend(void);//完结voidgotoxy(intx,inty)//位置函数{coordpos;pos.x=x;pos.y=y;setconsolecursorposition(getstdhandle(std_output_han dle),pos);}voidcolor(inta)//颜色函数{setconsoletextattribute(getstdhandle(std_output_handle),a);}voidinit(intfood[2])//初始化函数(初始化围墙、显示信息、苹果){system(\inti,j;//初始化围墙intwall[n+2][n+2]={{0}};//初始化围墙的二维数组for(i=1;i<=n;i++){for(j=1;j<=n;j++)wall[i][j]=1;}color(10);for(i=0;iprintf(\}gotoxy(n+3,3);//显示信息color(14);printf(\按a,b,c,d改变方向\\n\gotoxy(n+3,1);color(14);printf(\按任意键暂停,按1回到,按2选择退出\\n\gotoxy(n+5,3);color(14);printf(\food[0]=rand()%n+1;//随机发生食物}food[1]=rand()%n+1;gotoxy(food[0],food[1]);color(12);printf(\voidplay()//具体内容玩玩的过程{system(\inti,j;int**snake=null;//定义蛇的二维指针intfood[2];//食物的数组,food[0]代表横坐标,food[1]代表纵坐标intscore=0;//为罚球inttail[2];//此数组为了记录蛇的头的座标intnode=3;//蛇的节数charch='p';srand((unsigned)time(null));//随机数发生器的初始化函数init(food);snake=(int**)realloc(snake,sizeof(int*)*node);//发生改变snake所指内存区域的大小为node长度for(i=0;igotoxy(snake[i][0],snake[i][1]);color(14);printf(\}while(1)//步入消息循环{gotoxy(5,0);color(10);printf(\gotoxy(0,5);color(10);printf(\gotoxy(0,7);color (10);printf(\gotoxy(0,9);color(10);printf(\tail[0]=snake[node-1][0];//将蛇的后一节座标参数值tail数组tail[1]=snake[node-1][1];gotoxy(tail[0],tail[1]);color(0);printf(\for(i=node-1;i>0;i--)//蛇想前移动的关键算法,后一节的占有前一节的地址座标{snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];gotoxy(snake[i][0],snake[i][1]);color(14);printf(\}if(kbhit())//抓取输出信息{gotoxy(0,n+2);ch=getche();}switch(ch){case'w':snake[0][1]--;break;case's':snake[0][1]++;break;case'a':snake[0][0]--;break;case'd':snake[0][0]++;break;case'1':boundary();break;case'2':end();brea k;default:break;}gotoxy(snake[0][0],snake[0][1]);color(14);printf(\sleep(abs(2 00-0.5*score));//并使随着分数的快速增长蛇的移动速度越来越快if(snake[0][0]==food[0]&&snake[0][1]==food[1])//吞下食物后蛇分数提1,蛇长提1{score++;//分数减少s=score;node++;//节数减少snake=(int**)realloc(snake,sizeof(int*)*node);snake[node-1]=(int*)malloc(sizeof(int)*2);food[0]=rand()%n+1;//产生随机数且要在围墙内部。
贪吃蛇c语言代码
贪吃蛇c语言代码.txt为什么我们在讲故事的时候总要加上从前?开了一夏的花,终落得粉身碎骨,却还笑着说意义。
#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 0x011bint 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;}snake;void Init();void Close();void DrawK();void GamePlay();void GameOver();void PrScore();void main(){ Init();DrawK();GamePlay();Close();}void Init(){int gd=DETECT,gm;initgraph(&gd,&gm,"C:\\tc");cleardevice();}void DrawK(){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(){randomize();food.yes=1;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){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];}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,s nake.y[snake.node-1]-10);}if(snake.life==1)break;key=bioskey(0);if(key==Esc)break;else if(key==UP&&snake.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;}}void GameOver(){cleardevice();PrScore();setcolor(RED);settextstyle(3,0,4);outtextxy(100,100,"Mengmeng,i love you!"); getch();}void PrScore(){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(){ getch();closegraph();}。
贪吃蛇游戏代码C
贪吃蛇游戏代码C 集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]#include<iostream>#include<>#include<>#include<>#include<>using namespace std;int GameOver=0;struct Body//蛇身(链表结构){int x,y;//蛇身结点坐标Body *next;//下一个结点};void SetPos(int i,int j)//设定光标位置{COORD pos={i-1,j-1};//坐标变量HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);//获取输出句柄 SetConsoleCursorPosition(Out,pos);//设定光标位置}class Sneak//贪吃蛇类{private:Body *head;//蛇头指针int Direction;//移动方向。
1,2,3,4对应上左下右int Count;//蛇长int Speed;//速度(等级)int FoodExist;//食物存在标记int Food_x;//食物X坐标int Food_y;//食物Y坐标public:Sneak(int a=3,int b=4,int c=1,int d=0)//构造函数{FoodExist=d;//起始不存在食物Body *temp1,*temp2;head=new(Body);//申请起始蛇身3节head->x=4;head->y=2;temp1=new(Body);temp1->x=3;temp1->y=2;temp2=new(Body);temp2->x=2;temp2->y=2;head->next=temp1;temp1->next=temp2;temp2->next=NULL;Direction=b;//方向为右Count=a;//长为3Speed=c;//等级1}void Map();//画界面函数void Paint();//画蛇身函数void Food();//生成食物int Over();//判断游戏是否结束void Gaming();//游戏进程函数void Move();//移动};void Sneak::Map()//使用{int i;for(i=1;i<=50;i++){SetPos(i,1);cout<<"-";}for(i=2;i<=25;i++){SetPos(1,i);cout<<"|";SetPos(50,i);cout<<"|";}for(i=1;i<=50;i++){SetPos(i,25);cout<<"-";}SetPos(54,3);cout<<"贪吃蛇";SetPos(54,5);cout<<"贪吃蛇长度为:"<<Count;SetPos(54,7);cout<<"等级:"<<Speed;}void Sneak::Food(){Body *p;int InBody=0; //判断食物是否产生在蛇体内srand((int)time(0));//用系统时间来做随机数种子while(1){Food_x=rand()%48+2;//随机出食物的坐标Food_y=rand()%23+2;p=head;while(p!=NULL)//判断食物是否产生在蛇体内{if(p->x==Food_x&&p->y==Food_y){InBody=1;break;}p=p->next;}if(InBody==0)//食物不在蛇身。
C语言贪吃蛇源代码
C语言贪吃蛇源代码 TTA standardization office【TTA 5AB- TTAK 08- TTA 2C】#include<stdio.h>#include<process.h>#include<windows.h>#include<conio.h>#include<time.h>#include<stdlib.h>#define WIDTH 40#define HEIGH 12enum direction{//方向LEFT,RIGHT,UP,DOWN};struct Food{//食物int x;int y;};struct Node{//画蛇身int x;int y;struct Node *next;};struct Snake{//蛇属性int lenth;//长度enum direction dir;//方向};struct Food *food; //食物struct Snake *snake;//蛇属性struct Node *snode,*tail;//蛇身int SPEECH=200;int score=0;//分数int smark=0;//吃食物标记int times=0;int STOP=0;void Initfood();//产生食物void Initsnake();//构造snakevoid Eatfood();//头部前进void Addnode(int x, int y);//增加蛇身void display(struct Node *shead);//显示蛇身坐标void move();//蛇移动void draw();//画蛇void Homepage();//主页void keybordhit();//监控键盘按键void Addtail();//吃到食物void gotoxy(int x, int y)//定位光标{COORD pos;pos.X = x - 1;pos.Y = y - 1;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); }void Initsnake()//构造snake{int i;snake=(struct Snake*)malloc(sizeof(struct Snake));tail=(struct Node*)malloc(sizeof(struct Node));food = (struct Food*)malloc(sizeof(struct Food));snake->lenth=5;//初始长度 5snake->dir=RIGHT;//初始蛇头方向右for(i=2;i<=snake->lenth 2;i )//增加 5 个结点{Addnode(i,2);}}void Initfood()//产生食物{struct Node *p=snode;int mark=1;srand((unsigned)time(NULL));//以时间为种子产生随机数while(1){food->x=rand()%(WIDTH-2) 2;//食物X坐标food->y=rand()%(HEIGH-2) 2;//食物Y坐标while(p!=NULL){if((food->x==p->x)&&(food->y==p->y))//如果食物产生在蛇身上{//则重新生成食物mark=0;//食物生成无效break;}p=p->next;if(mark==1)//如果食物不在蛇身上,生成食物,否则重新生成食物{gotoxy(food->x,food->y);printf("%c",3);break;}mark=1;p=snode;}}void move()//移动{struct Node *q, *p=snode;if(snake->dir==RIGHT){Addnode(p->x 1,p->y);if(smark==0){while(p->next!=NULL){q=p;p=p->next;}q->next=NULL;free(p);}}if(snake->dir==LEFT){Addnode(p->x-1,p->y);if(smark==0){while(p->next!=NULL){q=p;p=p->next;}q->next=NULL;free(p);}if(snake->dir==UP){Addnode(p->x,p->y-1);if(smark==0){while(p->next!=NULL){q=p;p=p->next;}q->next=NULL;free(p);}}if(snake->dir==DOWN){Addnode(p->x,p->y 1);if(smark==0){while(p->next!=NULL){q=p;p=p->next;}q->next=NULL;free(p);}}}void Addnode(int x, int y)//增加蛇身{struct Node *newnode=(struct Node *)malloc(sizeof(struct Node)); struct Node *p=snode;newnode->next=snode;newnode->x=x;newnode->y=y;snode=newnode;//结点加到蛇头if(x<2||x>=WIDTH||y<2||y>=HEIGH)//碰到边界{STOP=1;gotoxy(10,19);printf("撞墙,游戏结束,任意键退出!\n");//失败_getch();free(snode);//释放内存free(snake);exit(0);}while(p!=NULL)//碰到自身{if(p->next!=NULL)if((p->x==x)&&(p->y==y)){STOP=1;gotoxy(10,19);printf("撞到自身,游戏结束,任意键退出!\n");//失败_getch();free(snode);//释放内存free(snake);exit(0);}p=p->next;}}void Eatfood()//吃到食物{Addtail();score ;}void Addtail()//增加蛇尾{struct Node *newnode=(struct Node *)malloc(sizeof(struct Node)); struct Node *p=snode;tail->next=newnode;newnode->x=50;newnode->y=20;newnode->next=NULL;//结点加到蛇头tail=newnode;//新的蛇尾}void draw()//画蛇{struct Node *p=snode;int i,j;while(p!=NULL){gotoxy(p->x,p->y);printf("%c",2);tail=p;p=p->next;}if(snode->x==food->x&&snode->y==food->y)//蛇头坐标等于食物坐标{smark=1;Eatfood();//增加结点Initfood();//产生食物}if(smark==0){gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点printf("%c",' ');//如果吃到食物,不清楚尾结点}else{times=1;}if((smark==1)&&(times==1)){gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点printf("%c",' ');//如果吃到食物,不清楚尾结点smark=0;}gotoxy(50,12);printf("食物: %d,%d",food->x,food->y);gotoxy(50,5);printf("分数: %d",score);gotoxy(50,7);printf("速度: %d",SPEECH);gotoxy(15,14);printf("按o键加速");gotoxy(15,15);printf("按p键减速");gotoxy(15,16);printf("按空格键暂停");}void HideCursor()//隐藏光标{CONSOLE_CURSOR_INFO cursor_info = {1, 0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); }void Homepage()//绘主页{int x,y;HideCursor();//隐藏光标printf("----------------------------------------\n");printf("|\t\t\t\t |\n");printf("|\t\t\t\t |\n");printf("|\t\t\t\t |\n");printf("|\t\t\t\t |\n");printf("|\t\t\t\t |\n");printf("|\t\t\t\t |\n");printf("|\t\t\t\t |\n");printf("|\t\t\t\t |\n");printf("|\t\t\t\t |\n");printf("|\t\t\t\t |\n");printf("----------------------------------------\n");gotoxy(5,13);printf("任意键开始游戏!按W.A.S.D控制方向");_getch();Initsnake();Initfood();gotoxy(5,13);printf(" ");}void keybordhit()//监控键盘{char ch;if(_kbhit()){ch=getch();switch(ch){case 'W':case 'w':if(snake->dir==DOWN)//如果本来方向是下,而按相反方向无效{break;}elsesnake->dir=UP;break;case 'A':case 'a':if(snake->dir==RIGHT)//如果本来方向是右,而按相反方向无效{break;}elsesnake->dir=LEFT;break;case 'S':case 's':if(snake->dir==UP)//如果本来方向是上,而按相反方向无效{break;}elsesnake->dir=DOWN;break;case 'D':case 'd':if(snake->dir==LEFT)//如果本来方向是左,而按相反方向无效{break;}elsesnake->dir=RIGHT;break;case 'O':case 'o':if(SPEECH>=150)//速度加快{SPEECH=SPEECH-50;}break;case 'P':case 'p':if(SPEECH<=400)//速度减慢{SPEECH=SPEECH 50;}break;case ' '://暂停gotoxy(15,18);printf("游戏已暂停,按任意键恢复游戏"); system("pause>nul");gotoxy(15,18);printf(" "); break;default:break;}}}int main(void)//程序入口{Homepage();while(!STOP){keybordhit();//监控键盘按键move();//蛇的坐标变化draw();//蛇的重绘Sleep(SPEECH);//暂时挂起线程}return 0;}。
vc贪吃蛇c语言代码
vc贪吃蛇c语言代码#include "stdio.h"#include "stdio.h"#include "windows.h"#include "time.h"#include "setjmp.h"#define MAXNOD 500#define UP 1#define DOWN -1#define LEFT -2#define RIGHT 2#define YES 1#define NO 0jmp_buf retry;typedef struct{int x;int y;int status;}Food;typedef struct {int *px;int *py;int direction;int nodlen;int score;}Snack;int gotoxy(int x, int y){COORD cd;cd.X = x;cd.Y = y;returnSetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE ),cd); }void initialization(Snack *pss){system("color 0e");pss->px=(int *)malloc(MAXNOD*sizeof(int));pss->py=(int *)malloc(MAXNOD*sizeof(int));memset(pss->px,0,MAXNOD);memset(pss->py,0,MAXNOD);pss->px[0]=0;pss->py[0]=0;pss->px[1]=1;pss->py[1]=0;pss->direction=RIGHT;pss->nodlen=2;pss->score=0;}void getscoresys(Snack scr){gotoxy(68,7);cprintf("score: %d",scr.score);}int ctrltoi(char ctr){switch(ctr){case 'w':return UP;case 's':return DOWN;case 'a':return LEFT;case 'd':return RIGHT ;}}void boundary(){int cnt,y;gotoxy(15,3);for (cnt=0;cnt<45;cnt++) {cprintf("%c",4);}for (y=4;y<20;y++){gotoxy(15,y);cprintf("%c",219); gotoxy(59,y);cprintf("%c",219);}gotoxy(15,20);for (cnt=0;cnt<45;cnt++) {cprintf("%c",4);}gotoxy(68,9);cprintf("UP: W"); gotoxy(68,10);cprintf("DOWN: S");gotoxy(68,11);cprintf("LEFT: A");gotoxy(68,12);cprintf("RIGHT: D");gotoxy(68,14);cprintf("PAUSE: BLANK");gotoxy(68,15);cprintf("EXIT :ESC");}int isdead(Snack ts){int i;char select;for(i=0;i<ts.nodlen-1;i++)< p="">if((ts.px[i]==ts.px[ts.nodlen-1]&&ts.py[i]==ts.py[ts.nodlen-1])||((ts.px[ts.nodlen-1]<0))||(ts.px[ts.nodl en-1]>42)||(ts.py[ts.nodlen-1]<0)||(ts.py[ts.nodlen-1]>15)) {system("cls");gotoxy(15,12);cprintf("Game Over! Press ESC to exit, any other key to retry\a\n");flushall();select=getch();if(select==27) exit(0);system("cls");longjmp(retry,1);}void getfood(Snack s,Food *pf) {int i;cnt: do{pf->x=rand()%43;pf->y=rand()%16;for (i=0;i<s.nodlen;i++)< p=""> {if (s.px[i]==pf->x&&s.py[i]==pf->y) {goto cnt;}}break;}while(1);pf->status=YES;}int main(){Snack ss;Food foo;int i,j,dire;char ctrl;srand((unsigned)time(NULL)); setjmp(retry);initialization(&ss);getfood(ss,&foo);dogotoxy(foo.x+16,foo.y+4);if (foo.status==NO)getfood(ss,&foo);cprintf("%c",3);boundary();if(_kbhit()){ctrl=getch();if (ctrl=='w'||ctrl=='s'||ctrl=='a'||ctrl=='d') {dire=ctrltoi(ctrl);if(ss.direction==(0-dire)) ;elsess.direction=dire;}else if (ctrl==' ')system("pause");else if (ctrl==27)exit(0);}for (i=0;i<ss.nodlen-1;i++)< p="">{ss.px[i]=ss.px[i+1];ss.py[i]=ss.py[i+1];}switch(ss.direction){case UP:ss.py[ss.nodlen-1]=ss.py[ss.nodlen-1]-1;break;case DOWN:ss.py[ss.nodlen-1]=ss.py[ss.nodlen-1]+1;break;case LEFT:ss.px[ss.nodlen-1]=ss.px[ss.nodlen-1]-1;break;case RIGHT:ss.px[ss.nodlen-1]=ss.px[ss.nodlen-1]+1;}for(i=0;i<ss.nodlen;i++)< p="">{gotoxy(ss.px[i]+16,ss.py[i]+4);cprintf("%c",4);}isdead(ss);if (ss.px[ss.nodlen-1]==foo.x&&ss.py[ss.nodlen-1]==foo.y) { for (j=0;j<ss.nodlen;j++)< p="">{ss.px[ss.nodlen-j]=ss.px[ss.nodlen-j-1];ss.py[ss.nodlen-j]=ss.py[ss.nodlen-j-1];}ss.score +=10;ss.nodlen++;foo.status=NO;}getscoresys(ss);_sleep(199);system("cls");flushall();}while(1);}</ss.nodlen;j++)<> </ss.nodlen;i++)<> </ss.nodlen-1;i++)<> </s.nodlen;i++)<></ts.nodlen-1;i++)<>。
贪吃蛇c语言代码
贪吃蛇c语言代码#include <graphics.h>#include <conio.h>#include <stdlib.h>#include <dos.h>#define NULL 0#define UP 18432#define DOWN 20480#define LEFT 19200#define RIGHT 19712#define ESC 283#define ENTER 7181struct snake{int centerx;int centery;int newx;int newy;struct snake *next;};struct snake *head;int grade=60; /*控制速度的*******/int a,b; /* 背静遮的位置*/void *far1,*far2,*far3,*far4; /* 蛇身指针背静遮的指针虫子*/int size1,size2,size3,size4; /* **全局变量**/int ch=RIGHT; /**************存按键开始蛇的方向为RIGHT***********/int chy=RIGHT;int flag=0; /*********判断是否退出游戏**************/int control=4; /***********判断上次方向和下次方向不冲突***/int nextshow=1; /*******控制下次蛇身是否显示***************/int scenterx; /***************随即矩形中心坐标***************/int scentery;int sx; /*******在a b 未改变前得到他们的值保证随机矩形也不在此出现*******/int sy;/************************蛇身初始化**************************/void snakede(){struct snake *p1,*p2;head=p1=p2=(struct snake *)malloc(sizeof(struct snake));p1->centerx=80;p1->newx=80;p1->centery=58;p1->newy=58;p1=(struct snake *)malloc(sizeof(struct snake));p2->next=p1;p1->centerx=58;p1->newx=58;p1->centery=58;p1->newy=58;p1->next=NULL;}/*******************end*******************/void welcome() /*************游戏开始界面,可以选择速度**********/ {int key;int size;int x=240;int y=300;int f;void *buf;setfillstyle(SOLID_FILL,BLUE);bar(98,100,112,125);setfillstyle(SOLID_FILL,RED);bar(98,112,112,114);setfillstyle(SOLID_FILL,GREEN);bar(100,100,110,125);size=imagesize(98,100,112,125);buf=malloc(size);getimage(98,100,112,125,buf);cleardevice();setfillstyle(SOLID_FILL,BLUE);bar(240,300,390,325);outtextxy(193,310,"speed:");setfillstyle(SOLID_FILL,RED);bar(240,312,390,314);setcolor(YELLOW);outtextxy(240,330,"DOWN");outtextxy(390,330,"UP");outtextxy(240,360,"ENTER to start..." );outtextxy(270,200,"SNAKE");fei(220,220);feiyang(280,220);yang(340,220);putimage(x,y,buf,COPY_PUT);setcolor(RED);rectangle(170,190,410,410);while(1){ if(bioskey(1)) /********8选择速度部分************/ key=bioskey(0);switch(key){case ENTER:f=1;break;case DOWN:if(x>=240){ putimage(x-=2,y,buf,COPY_PUT);grade++;key=0;}case UP:if(x<=375){ putimage(x+=2,y,buf,COPY_PUT);grade--;key=0;break;}}if (f==1)break;} /********** end ****************/ free(buf);}/*************************随即矩形*****************//***********当nextshow 为1的时候才调用此函数**********/void ran(){ int nx;int ny;int show; /**********控制是否显示***********/int jump=0;struct snake *p;p=head;if(nextshow==1) /***********是否开始随机产生***************/{show=1;randomize();nx=random(14);ny=random(14);scenterx=nx*22+58;scentery=ny*22+58;while(p!=NULL){if(scenterx==p->centerx&&scentery==p->centery||scenterx==sx&&scentery==sy) {show=0;jump=1;break;}elsep=p->next;if(jump==1)break;}if(show==1){putimage(scenterx-11,scentery-11,far3,COPY_PUT);nextshow=0;break;}}}/***********过关动画**************/ void donghua(){ int i;cleardevice();setbkcolor(BLACK);randomize();while(1){for(i=0;i<=5;i++){putpixel(random(640),random(80),13); putpixel(random(640),random(80)+80,2); putpixel(random(640),random(80)+160,3); putpixel(random(640),random(80)+240,4); putpixel(random(640),random(80)+320,1); putpixel(random(640),random(80)+400,14); }setcolor(YELLOW);settextstyle(0,0,4);outtextxy(130,200,"Wonderful!!"); setfillstyle(SOLID_FILL,10);bar(240,398,375,420);feiyang(300,400);fei(250,400);yang(350,400);if(bioskey(1))if(bioskey(0)==ESC){flag=1;break;}}}/*************************end************************//***********************初始化图形系统*********************/ void init(){int a=DETECT,b;int i,j;initgraph(&a,&b,"");}/***************************end****************************/ /***画立体边框效果函数******/void tline(int x1,int y1,int x2,int y2,int white,int black){ setcolor(white);line(x1,y1,x2,y1);line(x1,y1,x1,y2);setcolor(black);line(x2,y1,x2,y2);line(x1,y2,x2,y2);}/****end*********//*************飞洋标志**********/int feiyang(int x,int y){int feiyang[18][18]={ {0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,0,0,0}, {0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0},{0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0},{0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0},{0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0},{0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0},{0,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0},{0,0,1,1,1,1,1,0,0,1,0,0,1,1,0,0,0,0},{0,0,1,1,1,0,0,0,0,1,0,1,1,1,0,0,0,0},{0,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0},{0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},{0,0,1,1,0,0,0,1,1,0,0,1,1,0,0,1,0,0},{0,0,1,1,1,0,0,1,1,0,0,1,1,0,0,1,0,0},{0,0,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0},{0,0,0,1,1,1,0,1,1,1,1,1,0,0,1,0,0,0},{0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0},{0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0},{0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0}};int i,j;for(i=0;i<=17;i++)for(j=0;j<=17;j++){if (feiyang[i][j]==1)putpixel(j+x,i+y,RED);}}/********"飞"字*************/int fei(int x,int y){int fei[18][18]={{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0},{0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0},{0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0},{0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0},{0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1},{0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1},{0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0}};int i,j;for(i=0;i<=17;i++)for(j=0;j<=17;j++){if (fei[i][j]==1)putpixel(j+x,i+y,BLUE);}}/*********"洋"字**************/int yang(int x,int y){int yang[18][18]={{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, {1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0},{0,1,1,1,0,0,0,1,1,1,0,1,1,0,0,0,0,0},{0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,1,0,0},{0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0},{0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0},{0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0},{0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0},{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0},{1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}};int i,j;for(i=0;i<=17;i++)for(j=0;j<=17;j++){if (yang[i][j]==1)putpixel(j+x,i+y,BLUE);}}/******************主场景**********************/ int bort(){ int a;setfillstyle(SOLID_FILL,15);bar(49,49,71,71);setfillstyle(SOLID_FILL,BLUE);bar(50,50,70,70);size1=imagesize(49,49,71,71);far1=(void *)malloc(size1);getimage(49,49,71,71,far1);cleardevice();setfillstyle(SOLID_FILL,12);bar(49,49,71,71);size2=imagesize(49,49,71,71);far2=(void *)malloc(size2);getimage(49,49,71,71,far2);setfillstyle(SOLID_FILL,12);bar(49,49,71,71);setfillstyle(SOLID_FILL,GREEN);bar(50,50,70,70);size3=imagesize(49,49,71,71);far3=(void *)malloc(size3);getimage(49,49,71,71,far3);cleardevice(); /*取蛇身节点背景节点虫子节点end*/ setbkcolor(8);setfillstyle(SOLID_FILL,GREEN);bar(21,23,600,450);tline(21,23,600,450,15,8); /***开始游戏场景边框立体效果*******/ tline(23,25,598,448,15,8);tline(45,45,379,379,8,15);tline(43,43,381,381,8,15);tline(390,43,580,430,8,15);tline(392,45,578,428,8,15);tline(412,65,462,85,15,8);tline(410,63,464,87,15,8);tline(410,92,555,390,15,8);tline(412,94,553,388,15,8);tline(431,397,540,420,15,8);tline(429,395,542,422,15,8);tline(46,386,377,428,8,15);tline(44,384,379,430,8,15);setcolor(8);outtextxy(429,109,"press ENTER ");outtextxy(429,129,"---to start"); /*键盘控制说明*/outtextxy(429,169,"press ESC ");outtextxy(429,189,"---to quiet");outtextxy(469,249,"UP");outtextxy(429,289,"LEFT");outtextxy(465,329,"DOWN");outtextxy(509,289,"RIGHT");setcolor(15);outtextxy(425,105,"press ENTER ");outtextxy(425,125,"---to start");outtextxy(425,165,"press ESC ");outtextxy(425,185,"---to quiet");outtextxy(465,245,"UP");outtextxy(425,285,"LEFT");outtextxy(461,325,"DOWN");outtextxy(505,285,"RIGHT"); /*******end*************/ setcolor(8);outtextxy(411,52,"score");outtextxy(514,52,"left");setcolor(15);outtextxy(407,48,"score");outtextxy(510,48,"left");size4=imagesize(409,62,465,88); /****分数框放到内存********/ far4=(void *)malloc(size4);getimage(409,62,465,88,far4);putimage(500,62,far4,COPY_PUT); /*******输出生命框***********/setfillstyle(SOLID_FILL,12);setcolor(RED);outtextxy(415,70,"0"); /***************输入分数为零**********/outtextxy(512,70,"20"); /*************显示还要吃的虫子的数目*********/ bar(46,46,378,378);feiyang(475,400);fei(450,400);yang(500,400);outtextxy(58,390,"mailto:");outtextxy(58,410,"snake game");outtextxy(200,410,"made by yefeng");while(1){ if(bioskey(1))a=bioskey(0);if(a==ENTER)break;}}/******************gameover()******************/void gameover(){ char *p="GAME OVER";int cha;setcolor(YELLOW);settextstyle(0,0,6);outtextxy(100,200,p);while(1){if(bioskey(1))cha=bioskey(0);if(cha==ESC){flag=1;break;}}}/***********显示蛇身**********************/void snakepaint(){struct snake *p1;p1=head;putimage(a-11,b-11,far2,COPY_PUT);while(p1!=NULL){putimage(p1->newx-11,p1->newy-11,far1,COPY_PUT);p1=p1->next;}}/****************end**********************//*********************蛇身刷新变化游戏关键部分*******************/ void snakechange(){struct snake *p1,*p2,*p3,*p4,*p5;int i,j;static int n=0;static int score;static int left=20;char sscore[5];char sleft[1];p2=p1=head;while(p1!=NULL){ p1=p1->next;if(p1->next==NULL){a=p1->newx;b=p1->newy; /************记录最后节点的坐标************/ sx=a;sy=b;}p1->newx=p2->centerx;p1->newy=p2->centery;p2=p1;}p1=head;while(p1!=NULL){p1->centerx=p1->newx;p1->centery=p1->newy;p1=p1->next;}/********判断按键方向*******/if(bioskey(1)){ ch=bioskey(0);if(ch!=RIGHT&&ch!=LEFT&&ch!=UP&&ch!=DOWN&&ch!=ESC) /********chy为上一次的方向*********/ch=chy;}switch(ch){case LEFT: if(control!=4){head->newx=head->newx-22;head->centerx=head->newx;control=2;if(head->newx<47)gameover();}else{ head->newx=head->newx+22;head->centerx=head->newx;control=4;if(head->newx>377)gameover();}chy=ch;break;case DOWN:if(control!=1){ head->newy=head->newy+22;head->centery=head->newy; control=3;if(head->newy>377)gameover();}else{ head->newy=head->newy-22; head->centery=head->newy;control=1;if(head->newy<47)gameover();}chy=ch;break;case RIGHT: if(control!=2){ head->newx=head->newx+22;head->centerx=head->newx;control=4;if(head->newx>377)gameover();}else{ head->newx=head->newx-22;head->centerx=head->newx;control=2;if(head->newx<47)gameover();}chy=ch;break;case UP: if(control!=3){ head->newy=head->newy-22;head->centery=head->newy;control=1;if(head->newy<47)gameover();}else{ head->newy=head->newy+22;head->centery=head->newy;control=3;if(head->newy>377)gameover();}chy=ch;break;case ESC:flag=1;break;}/* if 判断是否吃蛇*/if(flag!=1){ if(head->newx==scenterx&&head->newy==scentery){ p3=head;while(p3!=NULL){ p4=p3;p3=p3->next;}p3=(struct snake *)malloc(sizeof(struct snake));p4->next=p3;p3->centerx=a;p3->newx=a;p3->centery=b;p3->newy=b;p3->next=NULL;a=500;b=500;putimage(409,62,far4,COPY_PUT); /********** 分数框挡住**************/ putimage(500,62,far4,COPY_PUT); /*********把以前的剩下虫子的框挡住********/ score=(++n)*100;left--;itoa(score,sscore,10);itoa(left,sleft,10);setcolor(RED);outtextxy(415,70,sscore);outtextxy(512,70,sleft);nextshow=1;if(left==0) /************判断是否过关**********/donghua(); /*******如果过关,播放过关动画*********************/}p5=head; /*********************判断是否自杀***************************/ p5=p5->next;p5=p5->next;p5=p5->next;p5=p5->next; /****从第五个节点判断是否自杀************/while(p5!=NULL){if(head->newx==p5->centerx&&head->newy==p5->centery){ gameover();break;}elsep5=p5->next;}}}/************snakechange()函数结束*******************//*****************************主函数******************************************/ int main(){ int i;init(); /**********初始化图形系统**********/ welcome(); /*********8欢迎界面**************/ bort(); /*********主场景***************/ snakede(); /**********连表初始化**********/ while(1){ snakechange();if(flag==1)break;snakepaint();ran();for(i=0;i<=grade;i++)delay(3000);}free(far1);free(far2);free(far3);free(far4);closegraph();return 0;}。
简单贪吃蛇c语言代码,一个C语言写简单贪吃蛇源代码.doc
简单贪吃蛇c语⾔代码,⼀个C语⾔写简单贪吃蛇源代码.doc ⼀个C语⾔写简单贪吃蛇源代码#include#include#include#include#include#includeint grade=5,point=0,life=3;voidset(),menu(),move_head(),move_body(),move(),init_insect(),left(),upon(),right(),down(),init_graph(),food_f(),ahead(),crate(); struct bug{int x;int y;struct bug *last;struct bug *next;};struct fd{int x;int y;int judge;}food={0,0,0};struct bug *head_f=NULL,*head_l,*p1=NULL,*p2=NULL;void main(){char ch;initgraph(800,600);set();init_insect();while(1){food_f();Sleep(grade*10);setcolor(BLACK);circle(head_l->x,head_l->y,2);setcolor(WHITE);move_body();if(kbhit()){ch=getch();if(ch==27){ahead();set();}else if(ch==-32){switch(getch()){case 72:upon();break;case 80:down();break;case 75:left();break;case 77:right();break;}}else ahead();}else{ahead();}if(head_f->x==food.x&&head_f->y==food.y) {Sleep(100);crate();food.judge=0;point=point+(6-grade)*10;if(food.x<30||food.y<30||food.x>570||food.y>570)life++;menu();}if(head_f->x<5||head_f->x>595||head_f->y<5||head_f->y>595) {Sleep(1000);life--;food.judge=0;init_graph();init_insect();menu();}for(p1=head_f->next;p1!=NULL;p1=p1->next){if(head_f->x==p1->x&&head_f->y==p1->y){Sleep(1000);life--;food.judge=0;init_graph();init_insect();menu();break;}}if(life==0){outtextxy(280,300,"游戏结束!");getch();return;}move();};}void init_graph(){clearviewport();setlinestyle(PS_SOLID,1,5);rectangle(2,2,600,598);setlinestyle(PS_SOLID,1,1);}void set(){init_graph();outtextxy(640,50,"1、开始 / 返回");outtextxy(640,70,"2、退出");outtextxy(640,90,"3、难度");outtextxy(640,110,"4、重新开始");switch(getch()){case '1': menu();setcolor(GREEN);circle(food.x,food.y,2);setcolor(WHITE);return; case '2': exit(0);break;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贪吃蛇一实验目的1、了解AVR ATmega128试验箱的基本构成2、熟悉键盘的工作原理和设置3、熟悉点阵的工作原理和设置4、熟悉液晶显示器的工作原理和设置5、熟悉语音播放的工作原理和设置6、熟悉AVR ATmega128的中断功能7、初步掌握用C语言编程的能力二实验内容:1、设计题目:根据液晶显示器中的提示,通过对4*4键盘的按键输入,选择游戏的难度,继而控制点阵中点列的移动、长度的增加,只有在规定的时间(30秒、20秒、10秒)内完成任务(吃10个),就可游戏胜利,否则失败。
同时在游戏的开始、胜利、失败时都将伴随着声音的输出。
三硬件原理1、AVR ATmega128单片机及片外选址电路2、LDM点阵显示电路3、LCD液晶显示电路4、键盘连接电路及语音输出连接电路四程序流程图(1)、主函数只有在规定的时间内完成“吃下”10个点,游戏才能成功,除了上图中的当第一点碰触到自身点导致失败情况下,在规定的时间内没有完成任务,将会导致中断相应,推出程序运行,最终游戏失败。
(2)、随机点产生函数void _rand(void)函数中应用了产生随机点的函数rand(),其头文件必须包括“#include<stdlib.h>”(3)、第一点的操作函数void operate(unsigned char in)产生第一点运动后的在点阵中显示的码值(数组change[])Leader_i,leader_j分别为第一点相对于点阵中左上角上的点的绝对坐标值,其中每一个点的直径长设为1。
(4)、擦除函数void _eraser(void)产生被擦除点的码值的反(eraser[])由于最后一个点的位置可以由第一个点根据先前操作逆走N步得到,所以eraser_i=leader_i+n1-n2和eraser_j=leader_j+n3-n4得到被擦除点相对于点阵左上点的绝对坐标。
由于eraser_i、eraser_j可能为负值,因而为求得最后一个点在点阵中的位置,使其任意加一足够大的能被8整除的正整数(设为800),再与8除求余。
即:eraser_i=(eraser_i+800)%8,eraser_j=(eraser_j+800)%8。
后经eraser[eraser_i]=~(1<<eraser_j)求得被擦除点在点阵中显示码值的反码。
(5)、状态保存函数void status_save(void)将前一状态与第一点移动后产生的第一点新码值(change[])进行或运算,再与产生的被擦除点显示码值的反(eraser[])进行与运算,得到新的显示状态(除随机点)的码值。
(6)、第一点的操作过程记录函数void renew(unsigned char in)根据需要记录第一个点的N个运行过程(设为20)(7)、吃点函数void eat(unsigned char in)将记录的随机点显示码值的数组font[]清零,让第一个点再向前操作一步,但不擦除最后一个点,用来实现吃点效果。
最后调用产生随机点函数重新产生一随机点。
(8)、结合函数void join(void)用于产生要显示的码值。
将表示状态的数组status[]与表示随机点的数组font[]进行或运算就可以实现。
(9)、测试函数unsigned char test(unsigned char *tester)这个函数在程序中用于两个地方,一是在产生随机点的函数中,如果产生的随机点在“蛇”身上(返回值为2),则重新产生随机点;二是在第一个操作完一步后,判断此时第一点的位置,如果在“蛇”身上(返回值为2),则游戏失败。
(10)、液晶显示器显示函数void print_message(char *message)用于显示字符串message。
(11)、函数void start(void)、void _win(void)、void lose(void) 用于在游戏开始时、胜利时、失败时的液晶显示、语音输出以及LED点阵输出。
(12)、难度选择函数void choose(void)根据液晶显示的提示,选择游戏难度等级。
在按确认键后开中断。
程序流程图如下:(13)、中断程序SIGNAL(SIG_OVERFLOW3)用于限制游戏进行的时间,在规定时间内完成游戏任务,则关中断,中断程序不在执行,如果在规定时间没有完成,则调用失败函数(lose()),游戏失败。
程序流程图如下:五.c程序代码:/****************************************************DOS 游戏,贪吃蛇。
编辑器Win-TC,编译器TC 2内核。
作者:樊毅。
时间:年10 月10 日。
注意:贪吃蛇的数据结构要用双向链表实现,因为蛇没有吃到食物时,是在蛇头前加一个节点作为新的蛇头,把蛇尾删去,实现移动一格,同时,蛇长不变。
从尾部删除链表的一个节点就必须用双向链表了。
****************************************************/#include<graphics.h>#include<bios.h>#include<stdio.h>#include<conio.h>#include<dos.h>#include<alloc.h>#include<stdlib.h>#include<time.h>/*定义地图小格的边长*/#define SIZE 10#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4B00#define RIGHT 0x4D00#define ENTER 0x1C0Dvoid fill(int x,int y,int xx,int yy,int color); void initg();void win_title();int win_menu();void block(int x,int y,int color);void draw_map();void init_snake();void prints();void free_snake();void snake_move();void init_map();void food();void game();void print_scores();void pr_warn(int x,int y);void help();enum {d_up,d_down,d_left,d_right} DIR=d_left; /*定义一个全局的方向类型的枚举变量DIR,初始方向为左。
其值前面加"d_"和全局变量的键值区分。
*/struct snake/*定义蛇体的每个小方块的数据结构。
*/{char x; /*每个蛇体方块结构的x,y记录蛇体方块的方块坐标。
方块坐标就是以一个方块为单位的坐标。
*/char y;struct snake *pre; /*蛇体前指针,指向前一个蛇体方块结构的开始*/struct snake *next; /*蛇体后指针,指向后一个蛇体方块结构的开始*/} *HEAD=NULL,*TAIL=NULL; /*定义两个全局的结构体指针用于保存蛇头和蛇尾的位置*/ char OVER[]="Game Over !"; /*用于游戏失败输出的字符串。
*/char WIN[]="You Win !"; /*用于游戏胜利输出的字符串。
*/char MAP[40][60]; /*定义一个全局变量数组,用于标记地图方格属性.空地,蛇身,食物.*/int GAME=0; /*定义一个全局变量GAME 对游戏状态进行记录。
,不结束游戏.1,结束游戏.*/int LENGTH=3; /*定义一个全局变量LENGTH 记录蛇体长度。
初始长度为.*/int DIFF=0; /*定义游戏难度全局变量。
*/int DELAY=20; /*定义延时时间全局变量。
单位是百分之一秒,即,0.01秒.初始值,表示延时.2秒。
*/int S_SIZE=sizeof(struct snake); /*定义一个全局变量用来存放struct snake 结构所占字节数,方便使用。
*//*****************************************下面是,填充一定范围的函数,x,y是填充范围的左上角坐标,xx,yy是右下角坐标。
color是填充颜色。
bar()函数中,x,y加, xx,yy减,是因为边框线有宽度,所以,要把填充范围往内缩一点。
*****************************************/void fill(int x,int y,int xx,int yy,int color) /*以(x+1,y+1)为左上角,以(xx-1,yy-1)为右下角,用指定颜色填充此范围。
*/{setfillstyle(SOLID_FILL,color); /*SOLID_FILL表示以单一的实体颜色填充,color是填充颜色。
*/bar(x+1,y+1,xx-1,yy-1); /*以(x+1,y+1)为左上角,以(xx-1,yy-1)为右下角画条形。
*/}void initg() /*把显示器初始化成图像模式,屏幕的大小为640 * 480 像素。
函数中还有错误检查程序。
*/{int gdriver,gmode,errorcode;gdriver=VGA; /*图形驱动器*/gmode=VGAHI; /*图形模式*/registerbgidriver(EGAVGA_driver); /*该函数告诉连接程序在连接时把EGAVGA 的驱动程序装入到用户的执行程序中*/initgraph(&gdriver,&gmode,""); /*初始化图形系统*/errorcode = graphresult(); /*返回最后一次不成功的图形操作的错误代码,没有错误返回*/if (errorcode !=0){printf("\n\terror:\t%s\n", grapherrormsg(errorcode));/*grapherrormsg返回一个错误信息串的指针*/getch(); /*从控制台无回显地取一个字符,不需要回车。
就是为了等待用户按键以后,退出整个程序。
*/exit(1);}}void win_title() /*绘制游戏主菜单页面的标题字符串。