贪吃蛇项目毕业论文设计
发布时间:
不懂 说明白点游戏设计的目的? 那不就是为了娱乐吗?
程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇目的 本程序实现主要技巧在于C程序二维数组的应用。目的在于提高编程的水平。
随着动画技术的不断发展,网络传播速度越来越快,Flash游戏已经成为现在人生活娱乐,打发时间,缓解压力的一项不可或缺的项目。而一个优秀的Flash游戏离不开游戏画面、程序脚本以及后期音效的共同作用。因此,越来越多有着引人入胜的剧情,丰富有趣的画面,好听难忘的音乐的Flash小游戏在互联网上被越来越多的玩家喜爱和分享。当这些兼具艺术性与流行性的元素都由一个游戏组合到一起,人们可以从中得到娱乐和放松,同时有得到一些对生活对人生的启发,让人会心一笑。而创作者也可以选择不同的风格,不同的手法用计算机的一系列数码艺术创作手法实现自己的创意,然后在一些交流互动网站上发表,供他人娱乐或者借鉴,同时也可以得到广大互联网用户的意见,从而提高自身的创作水品。由此可见,Flash游戏设计的意义就在于:集合不同的艺术门类,把艺术与技术相结合。从而让人可以在游戏中的到美的享受。给广大的互联网用户提供了一个娱乐,休闲,放松身心的地方。让设计师之与玩家之间产生交流,从而完善游戏。操作便捷,文件携带方便,无需安装,符合了现在很多快餐式的生活要求便于大众随时的下载,游戏。有丰富的图像,画面不受软件的限制。富有创意,风格多变。是其他电子游戏没有的。国内外研究现状及分析:目前利用Flash开发出了许多夸平台的网络游戏,甚至可以匹敌大型MMOR,在3G时代到来以后,我们很快可以在手机上玩到大型网络游戏,现有的Flash制作网络游戏有:SLG类(热血三国),体育类(热血球球),RPG类(凡人修真),桌面(德州扑克),TD类(保卫家园)等等.在日本和美国,动画和游戏这一类的技术超出国内比较多,日本的动漫位居世界前列是众所周知的。要想在这一方面能有所作为,仍需加倍努力。
写单片机贪吃蛇游戏毕业设计开题报告文献综述方法如下。1、文献综述,研究思路研究方法及手段。2、参考文献进度安排。3、文献综述是开题报告中的最重要部分。
主要内容就是设计蛇的形状和方向,以及食物的产生与位置,先创建一个Point对象point,由多个point 组合成蛇身,当蛇吃到食物时,则增加一个point在蛇身上,使蛇身不断加长,同时利用随机函数在游戏面板上产生一个新的Food对象代替原来被“吃掉”的food,其次,玩家使用方向键来控制蛇的行进,当蛇吃到 food 就给玩家加分作为奖励,最后就可以得出用户的分数。 设计的目的在于学习Java程序设计基本技术,学习用MyEclipse开发Java程序的相关技术,以及熟悉项目开发的完整过程。学会怎样进行一个项目的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的基本技术和方法,以及熟练地掌握MyEclipse开发环境的使用方法,培养初步的项目分析能力和程序设计能力。 游戏实现的具体任务如下:1) 游戏的开始,停止,暂停,继续。 根据用户单击的按钮(开始,停止,暂停,继续),游戏实现具体相应的功能。2) 游戏难度的调整。 用户可以通过选择相应难度地形来设置游戏的难度级别,级别越高,游戏难度也越大。3) 游戏帮助。单击游戏帮助按钮弹出一个消息框提供相应的游戏介绍。另外在游戏中提供了网格对每一块小方块进行包裹,玩家可以选择是否显示网格,可以帮助刚入门的玩家比对蛇头与食物的位置。4) 蛇身和背景颜色的设置。可以通过单击相应的设置按钮让蛇身或背景的颜色以用户喜欢的颜色输出。另外如果玩家选择显示网格,也可以单击相应按钮设置网格线的颜色。5) 游戏奖励。当蛇吃到一颗食物时则得到10分作为奖励,同时如果吃到特殊的食物则会得到普通食物三倍的奖励。但特殊的食物会在一定时间内自动消失。
能。1、贪吃蛇简单些,而且可扩展的不少,方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。2、在这个游戏设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用c语言的图形库函数。3、在设计开发过程中,要对c语言的图形库函数有一定的了解,利用图形库函数实现一些功能。
价格最低:QQ:498278887
报告,2种方法。1.数组,2.链表。送你7个大字:动身、去尾,加上头。报告完毕。请给楼上仁兄分。代码很清晰。有代码就能出报告的,写报告比写代码容易。上课要认真听讲,别人代码要认真看,这样才能进步。
能。1、贪吃蛇简单些,而且可扩展的不少,方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。2、在这个游戏设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用c语言的图形库函数。3、在设计开发过程中,要对c语言的图形库函数有一定的了解,利用图形库函数实现一些功能。
我可以帮你搞定.
一份基于C语言的贪吃蛇我就可以写的
写单片机贪吃蛇游戏毕业设计开题报告文献综述方法如下。1、文献综述,研究思路研究方法及手段。2、参考文献进度安排。3、文献综述是开题报告中的最重要部分。
#include #include #include using namespace std;void gotoxy(int x,int y) {COORD pos={x,y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}//光标定位class Food {//食物类private: int m_x; int m_y;public: void randfood() {//随机产生一个食物 srand((int)time(NULL));//利用时间添加随机数种子,需要ctime头文件 L1:{m_x=rand()%(85)+2;//2~86 m_y=rand()%(25)+2;//2~26 if(m_x%2) goto L1;//如果食物的x坐标不是偶数则重新确定食物的坐标 gotoxy(m_x,m_y);//在确认好的位置输出食物 cout << "★";}} int getFoodm_x() {return m_x;}//返回食物的x坐标 int getFoodm_y() {return m_y;}};//返回食物的y坐标class Snake {private: struct Snakecoor {int x; int y;};//定义一个蛇的坐标机构 vector snakecoor;//将坐标存入vector容器中 //判断并改变前进方向的函数 void degdir(Snakecoor&nexthead) {//定义新的蛇头变量 static char key='d';//静态变量防止改变移动方向后重新改回来 if(_kbhit()) { char temp=_getch();//定义一个临时变量储存键盘输入的值 switch(temp) {//如果临时变量的值为wasd中的一个,则赋值给key default: break;//default是缺省情况,只有任何条件都不匹配的情况下才会执行 必须写在前面!不然蛇无法转向 case'w': case'a': case's': case'd': //如果temp的方向和key的方向不相反则赋值 因为两次移动方向不能相反 将蛇设置为初始向右走 if(key=='w' && temp!='s' || key=='s' && temp!='w' || key=='a' && temp!='d' || key=='d' && temp!='a') key=temp;}} switch (key) {//根据key的值来确定蛇的移动方向 case'd': nexthead.x=snakecoor.front().x+2; nexthead.y=snakecoor.front().y; break; //新的蛇头的头部等于容器内第一个数据(旧蛇头)x坐标+2 因为蛇头占两个坐标,移动一次加2 case'a': nexthead.x=snakecoor.front().x-2; nexthead.y=snakecoor.front().y; break; case'w': nexthead.x=snakecoor.front().x; nexthead.y=snakecoor.front().y-1; break; //因为控制台的x长度是y的一半,所以用两个x做蛇头,需要的坐标是二倍 case's': nexthead.x=snakecoor.front().x; nexthead.y=snakecoor.front().y+1;}} //游戏结束时设计一个界面输出“游戏结束”以及分数 void finmatt(const int score) { system("cls"); gotoxy(40, 14);//清屏然后输出 cout << "游戏结束"; gotoxy(40, 16); cout << "得分:" << score; gotoxy(0, 26); exit(0);}//exit为C++的退出函数 exit(0)表示程序正常退出,非0表示非正常退出 void finishgame(const int score) {//游戏结束 if(snakecoor[0].x>=88 || snakecoor[0].x<0 || snakecoor[0].y>=28 || snakecoor[0].y<0) finmatt(score);//撞墙 for(int i=1;i=0;i--) {//反向创建初始蛇身,初始蛇头朝右 temp.x=16+(i<<1); temp.y=8;//偶数 在蛇头左移生成蛇身 snakecoor.push_back(temp);}}//在蛇尾尾插入临时变量 void move(Food&food, int& score) {//蛇运动的函数 Snakecoor nexthead;//新蛇头变量 degdir(nexthead);//判断和改变蛇前进的方向 snakecoor.insert(snakecoor.begin(), nexthead);//将蛇头插入容器的头部 gotoxy(0, 0); cout << "得分:" << score;//每次移动都在左上角刷新得分 gotoxy(0, 2); cout << "蛇的长度为:" << snakecoor.size();//长度用来测试 finishgame(score);//判断游戏结束,输出分数 //吃到食物蛇的变化 if(snakecoor[0].x==food.getFoodm_x() && snakecoor[0].y==food.getFoodm_y()) {//蛇头与食物重合 gotoxy(snakecoor[0].x, snakecoor[0].y); cout << "●";//吃到食物时这次蛇没有移动,所以蛇会卡顿一下gotoxy(snakecoor[1].x, snakecoor[1].y); cout << "■";//重新输出一下蛇头和第一节蛇身让蛇不卡顿 score++; food.randfood(); return;}//吃到食物得分+1,如果蛇头坐标和食物坐标重合则重新产生一个食物并直接结束本次移动 for(int i=0;i//******友情提示:如想速度快点,请改小_sleep(500)函数中参数***** #include #include #include #include #include const int H = 8; //地图的高 const int L = 16; //地图的长 char GameMap[H][L]; //游戏地图 int key; //按键保存 int sum = 1, over = 0; //蛇的长度, 游戏结束(自吃或碰墙) int dx[4] = {0, 0, -1, 1}; //左、右、上、下的方向 int dy[4] = {-1, 1, 0, 0}; struct Snake //蛇的每个节点的数据类型 { int x, y; //左边位置 int now; //保存当前节点的方向, 0,1,2,3分别为左右上下 }Snake[H*L]; const char Shead = '@'; //蛇头 const char Sbody = '#'; //蛇身 const char Sfood = '*'; //食物 const char Snode = '.'; //'.'在地图上标示为空 void Initial(); //地图的初始化 void Create_Food(); //在地图上随机产生食物 void Show(); //刷新显示地图 void Button(); //取出按键,并判断方向 void Move(); //蛇的移动 void Check_Border(); //检查蛇头是否越界 void Check_Head(int x, int y); //检查蛇头移动后的位置情况 int main() { Initial(); Show(); return 0; } void Initial() //地图的初始化 { int i, j; int hx, hy; system("title 贪吃蛇"); //控制台的标题 memset(GameMap, '.', sizeof(GameMap)); //初始化地图全部为空'.' system("cls"); srand(time(0)); //随机种子 hx = rand()%H; //产生蛇头 hy = rand()%L; GameMap[hx][hy] = Shead; Snake[0].x = hx; Snake[0].y = hy; Snake[0].now = -1; Create_Food(); //随机产生食物 for(i = 0; i < H; i++) //地图显示 { for(j = 0; j < L; j++) printf("%c", GameMap[i][j]); printf("\n"); } printf("\n小小C语言贪吃蛇\n"); printf("按任意方向键开始游戏\n"); getch(); //先接受一个按键,使蛇开始往该方向走 Button(); //取出按键,并判断方向 } void Create_Food() //在地图上随机产生食物 { int fx, fy; while(1) { fx = rand()%H; fy = rand()%L; if(GameMap[fx][fy] == '.') //不能出现在蛇所占有的位置 { GameMap[fx][fy] = Sfood; break; } } } void Show() //刷新显示地图 { int i, j; while(1) { _sleep(500); //延迟半秒(1000为1s),即每半秒刷新一次地图 Button(); //先判断按键在移动 Move(); if(over) //自吃或碰墙即游戏结束 { printf("\n**游戏结束**\n"); printf(" >_<\n"); getchar(); break; } system("cls"); //清空地图再显示刷新吼的地图 for(i = 0; i < H; i++) { for(j = 0; j < L; j++) printf("%c", GameMap[i][j]); printf("\n"); } printf("\n小小C语言贪吃蛇\n"); printf("按任意方向键开始游戏\n"); } } void Button() //取出按键,并判断方向 { if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 { while(kbhit() != 0) //可能存在多个按键,要全部取完,以最后一个为主 key = getch(); //将按键从控制台中取出并保存到key中 switch(key) { //左 case 75: Snake[0].now = 0; break; //右 case 77: Snake[0].now = 1; break; //上 case 72: Snake[0].now = 2; break; //下 case 80: Snake[0].now = 3; break; } } } void Move() //蛇的移动 { int i, x, y; int t = sum; //保存当前蛇的长度 //记录当前蛇头的位置,并设置为空,蛇头先移动 x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.'; Snake[0].x = Snake[0].x + dx[ Snake[0].now ]; Snake[0].y = Snake[0].y + dy[ Snake[0].now ]; Check_Border(); //蛇头是否越界 Check_Head(x, y); //蛇头移动后的位置情况,参数为: 蛇头的开始位置 if(sum == t) //未吃到食物即蛇身移动哦 for(i = 1; i < sum; i++) //要从蛇尾节点向前移动哦,前一个节点作为参照 { if(i == 1) //尾节点设置为空再移动 GameMap[ Snake[i].x ][ Snake[i].y ] = '.'; if(i == sum-1) //为蛇头后面的蛇身节点,特殊处理 { Snake[i].x = x; Snake[i].y = y; Snake[i].now = Snake[0].now; } else //其他蛇身即走到前一个蛇身位置 { Snake[i].x = Snake[i+1].x; Snake[i].y = Snake[i+1].y; Snake[i].now = Snake[i+1].now; } GameMap[ Snake[i].x ][ Snake[i].y ] = '#'; //移动后要置为'#'蛇身 } } void Check_Border() //检查蛇头是否越界 { if(Snake[0].x < 0 || Snake[0].x >= H || Snake[0].y < 0 || Snake[0].y >= L) over = 1; } void Check_Head(int x, int y) //检查蛇头移动后的位置情况 { if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.') //为空 GameMap[ Snake[0].x ][ Snake[0].y ] = '@'; else if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*') //为食物 { GameMap[ Snake[0].x ][ Snake[0].y ] = '@'; Snake[sum].x = x; //新增加的蛇身为蛇头后面的那个 Snake[sum].y = y; Snake[sum].now = Snake[0].now; GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#'; sum++; Create_Food(); //食物吃完了马上再产生一个食物 } else over = 1; }
/*贪吃蛇游戏,由于是C++源码 且 用到Windows API ,是控制台界面不是图形界面,需要用VC++6.0 或 VC++2010 在windows环境编译运行。如果符合上述条件一定可以编译运行zjlj,2015.3.16*/#define DEBUG 0 //当程序在调试阶段时 DEBUG为 1#include#include#include#includeusing namespace std;void readini(FILE **fphead, int *score, char *argv[]) //创建或打开一个和运行文件对应的ini文件,读取最高纪录{ char filename[200],*pfilename; int flag=-1,i; strcpy(filename,argv[0]); for(i=0;filename[i]!='\0';i++) { if ('.'==filename[i])flag=1; } if(1==flag) { filename[i-1]='i'; filename[i-2]='n'; filename[i-3]='i'; } else { filename[i]='.'; filename[i+1]='i'; filename[i+2]='n'; filename[i+3]='i'; filename[i+4]='\0'; } for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i]; if ( (*fphead=fopen(pfilename, "rb+"))==NULL) { if ( (*fphead=fopen(pfilename, "wb+"))==NULL) { printf("无法创建或打开\"%s\"文件\n",pfilename); system("pause"); exit(0); } } else { fread(score,sizeof(int),1,*fphead); }}void writeini(FILE **fphead, int *score, char *argv[]) //打开一个和运行文件对应的ini文件,写入最高纪录{ char filename[200],*pfilename; int flag=-1,i; strcpy(filename,argv[0]); for(i=0;filename[i]!='\0';i++) { if ('.'==filename[i])flag=1; } if(1==flag) { filename[i-1]='i'; filename[i-2]='n'; filename[i-3]='i'; } else { filename[i]='.'; filename[i+1]='i'; filename[i+2]='n'; filename[i+3]='i'; filename[i+4]='\0'; } for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i]; if ( (*fphead=fopen(pfilename, "wb+"))==NULL) { printf("无法写入\"%s\"文件,磁盘写保护!\n",pfilename); system("pause"); exit(0); } else { rewind(*fphead); fwrite(score,sizeof(int),1,*fphead); fclose(*fphead); }}void gotoxy(int x,int y)//光标定位,光标定位函数SetConsoleCursorPosition是左上角位置是0,0然后向左向下延伸{COORD pos;pos.X=2*y;pos.Y=x;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}void color(int a)//颜色函数{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);} void Refresh(int q[][22], int grade, int gamespeed, int length,int score) // 输出贪吃蛇棋盘{ int i,j; for(i=0;i<22;i++) { for(j=0;j<22;j++) { if(q[i][j]==0)//输出棋盘空白 { gotoxy(i,j); color(11); cout<<"■"; } if(q[i][j]==1||q[i][j]==2)//输出棋盘墙壁 { gotoxy(i,j); color(11); cout<<"□"; } if(q[i][j]==3)//输出蛇头 { gotoxy(i,j); color(14); cout<<"★"; } if(q[i][j]==4)//输出蛇身 { gotoxy(i,j); color(12); cout<<"◆"; } if(q[i][j]==5)//输出果子 { gotoxy(i,j); color(12); cout<<"●"; } } if(i==0) cout << "\t***********************"; if(i==1) cout << "\t等级为:" << grade;//显示等级 if(i==3) cout << "\t自动前进时间"; if(i==4) cout << "\t间隔为:" << gamespeed << "ms";//显示时间 if(i==6) cout << "\t历史最高分为:" << score << "分"; if(i==7) cout << "\t你现在得分为:" << (length+(grade-1)*8)*10 << "分"; if(i==8) cout << "\t**********************"; if(i==9) cout << "\t游戏说明:"; if(i==10) cout << "\t(1)用小键盘方向键控制"; if(i==11) cout << "\t蛇头运动方向;"; if(i==12) cout << "\t(2)蛇每吃一个果子蛇身"; if(i==13) cout << "\t增加一节;"; if(i==14) cout << "\t(3)蛇咬到自己或碰到墙"; if(i==15) cout << "\t壁游戏结束。"; if(i==18) cout << "\t**********************"; if(i==19) cout << "\tC/C++语言作业:"; if(i==20) cout << "\tzjlj,2015.03.16 "; }} int main(int argc, char *argv[]){ int tcsQipan[22][22]; // 贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁) int i,j,score,directiontemp; FILE *fpini;//*fpini 信息文件 readini(&fpini, &score, argv);//读取ini文件的最高纪录 if (score<0)//最高成绩小于零设置为零,初建文件会是负数 score=0; while(1) { for(i=1;i<=20;i++) for(j=1;j<=20;j++) tcsQipan[i][j]=0; //贪吃蛇棋盘相应坐标标上中间空白部分的标志0 for(i=0;i<=21;i++) tcsQipan[0][i] = tcsQipan[21][i] = 1; //贪吃蛇棋盘相应坐标标上上下墙壁的标志1 for(i=1;i<=20;i++) tcsQipan[i][0] = tcsQipan[i][21] = 2; //贪吃蛇棋盘相应坐标标上左右墙壁的标志2 int tcsZuobiao[2][500]; //蛇的坐标数组 for(i=0; i<4; i++) { tcsZuobiao[0][i] = 1;//蛇身和蛇头的x坐标 tcsZuobiao[1][i] = i + 1;//蛇身和蛇头的y坐标 } int head = 3,tail = 0;//标示蛇头和蛇尾的数组偏移量 for(i=1;i<=3;i++) tcsQipan[1][i]=4; //蛇身 tcsQipan[1][4]=3; //蛇头 int x1, y1; // 随机出果子 srand(time(0));//设置随机种子 do { x1=rand()%20+1; y1=rand()%20+1; } while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子 tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5 color(12); cout<<"\n\n\t\t\t\t贪吃蛇游戏即将开始 !"<=0;i--) { start=clock(); while(clock()-start<=1000); system("cls"); if(i>0) cout << "\n\n\t\t\t\t进入倒计时:" << i << endl; //倒计时显示 else Refresh(tcsQipan,grade,gamespeed,length,score); //初始棋盘显示 } int timeover=1,otherkey=1;//初始化超时时间和按键判断参数 char direction = 77; // 设置初始情况下,向右运动 int x=tcsZuobiao[0][head],y=tcsZuobiao[1][head];//保存蛇头坐标到x,y变量 while(1)//运行一局游戏 { start = clock(); while((timeover=((starttemp=clock())-start<=gamespeed))&&!kbhit());//如果有键按下或时间超过自动前进时间间隔则终止循环 if(direction==72||direction==80||direction==75 ||direction==77) directiontemp=direction;//保留上一次方向按键 //starttemp=gamespeed+start-starttemp;//保留停留时间 if(timeover) { #if (DEBUG==1) direction = getch();//调试代码 #else if((direction =getch())==-32) direction = getch(); #endif } #if (DEBUG==1)//调试代码 start=clock(); while(clock()-start<=2000); gotoxy(24,4); cout << "\t按键ASCII代码"<<(int)direction<<" "<=(length+(grade-1)*8)*10)//判断是否破记录 { gotoxy(10,7); color(12); cout << "闯关失败 加油耶!" << endl; fclose(fpini);//关闭ini文件 } else { gotoxy(10,7); color(12); cout << "恭喜您打破记录" << endl; score=(length+(grade-1)*8)*10; writeini(&fpini, &score, argv);//写入ini文件的最高纪录 } gotoxy(23,12); cout << "按回车键重新开始,按ESC退出游戏" << endl;//显示的提示 break;//退出该局游戏 } if(tcsQipan[x][y]!=0&&!(x==x1&&y==y1)&&tcsQipan[x][y]!=3) // 蛇头碰到蛇身,结束本局游戏 { gotoxy(22,12); cout << "\t游戏已结束!" << endl; if(score>=(length+(grade-1)*8)*10)//判断是否破记录 { gotoxy(10,7); color(12); cout << "闯关失败 加油耶!" << endl; fclose(fpini);//关闭ini文件 } else { gotoxy(10,7); color(12); cout << "恭喜您打破记录" << endl; score=(length+(grade-1)*8)*10; writeini(&fpini, &score, argv);//写入ini文件的最高纪录 } gotoxy(23,12); cout << "按回车键重新开始,按ESC退出游戏" << endl;//显示的提示 break;//退出该局游戏 } /* 游戏运行时的核心算法开始 */ if(x==x1 && y==y1) // 吃果子,长度加1 { length ++; if(length>=8)//长度大于等于8重新计算长度,等级加1 { length -= 8;//重新计算长度 grade ++;//等级加1 if(gamespeed>50)//控制最快速度为50 gamespeed = 550 - grade * 50; // 改变自动前进时间间隔 } tcsQipan[x][y]= 3;//贪吃蛇棋盘相应坐标现在蛇头标志改为蛇头标志3 tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = 4;//贪吃蛇棋盘相应坐标原来蛇头标志改为蛇身标志4 head = (head+1)%400;//防止数组越界 tcsZuobiao[0][head] = x;//蛇头的x坐标 tcsZuobiao[1][head] = y;//蛇头的y坐标 do//随机出果子 { x1=rand()%20+1; y1=rand()%20+1; } while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子 tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5 gotoxy(22,12); cout << "\t游戏进行中!" << endl; Refresh(tcsQipan,grade,gamespeed,length,score); } else // 不吃果子 { if(otherkey) { tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=0; tail=(tail+1)%400;//防止数组越界 tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]=4; head=(head+1)%400;//防止数组越界 tcsZuobiao[0][head]=x;//蛇头的x坐标 tcsZuobiao[1][head]=y;//蛇头的y坐标 tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=3; gotoxy(22,12); cout << "\t游戏进行中!" << endl; Refresh(tcsQipan,grade,gamespeed,length,score); } else { gotoxy(22,12); cout << "\t游戏暂停中!" << endl; } } /* 游戏运行时的核心算法结束 */ } while(1) { while(!kbhit()); if((direction =getch())==13)//按回车键开始下一局 break; if(direction ==27)//按ESC退出游戏 exit(0); } system("cls");//清除屏幕重新开始 } return 0;}
贪吃蛇 #define N 200 #include #include #include #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; 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;i595||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