贪吃蛇程序文档
C语言贪吃蛇程序设计说明书
![C语言贪吃蛇程序设计说明书](https://img.taocdn.com/s3/m/8ba8e81b69eae009591bec04.png)
C语言贪吃蛇程序设计说明书题目:贪吃蛇游戏学校: 系别: 专业班级: 姓名: 学号: 指导老师: 日期:一、设计题目:贪吃蛇是一款经典的休闲游戏,一条蛇在密闭的围墙内,随机出现一个食物,通过控制方向键操作小蛇不停的朝着食物前进,直到吃掉食物。
每吃一个食物,小蛇都会长长一截,随之难度增大;当小蛇头撞到墙或自己时,小蛇死亡。
二、功能设计:本游戏要求实现以下几个功能:(1) 用上、下、左、右键控制游戏区蛇的运动方向,使之吃食而使身体变长;(2) 用户可以调节蛇的运行速度来选择不同的难度;(3) 游戏分多个难度级别;(4) 用户可自选颜色;(5) 记录成绩前五名的游戏玩家;(6) 增加背景音乐;(7) 提高障碍物和游戏级别。
三、程序模块图:贪吃蛇游戏初画控设帮始图制置助模模模模化块块块块墙蛇食移食死变成等音体身物动物亡长绩级效2四、算法流程图:开始初始化界面和蛇身放置食物获取按键开始运动碰到边界是否否蛇吃到食是蛇长大蛇死亡是继续否结束3五、函数原型与功能 1.主函数:void main()启动程序,触动其他函数。
2.初始化:void init ()设置背景框大小、蛇体初始值,随机产生食物。
3.随机产生食物:void setfoodcrd()设置食物生成坐标,0表示食物被吃。
4.画食物:void showfood()用矩形框来画食物5.画蛇:void showsnake()根据蛇的坐标和节数,循环用矩形框来画蛇。
6.蛇移动:void snakemove() 根据按键,重设坐标7.改变蛇的方向:void changeskdir()响应用户的运动方向8.判断蛇是否死亡:void judgeslod判断蛇是否碰到自己或墙。
9.判断蛇是否吃到食物:void judgefood()判断是否吃到食物,吃食后变0,蛇增长一节。
10.结束游戏:void gameover()结束话语,并执行下一步。
六、基本代码#include<graphics.h> #include<conio.h>#include<stdio.h>#pragma comment(lib,"Winmm.lib")#include "MyTimer.h" #define SIZEMAX 100 /*蛇最大长度*/ #define SPEED 100 /*初始速度*/ #define len 20 /*蛇宽度*/#define lm 10 /*蛇每次移动距离*/ #define initlen 600 /*初始化窗口正方形的长度*/ #define Min_snakelen 2 /*蛇的最小长度*/typedef struct {int x,y;}DIR;int snakelen=Min_snakelen; /*蛇的长度*/4int isfood=1; /*食物状态*/ int isover=0; /*游戏状态*/int ispause=1; /*暂停状态*/int ismusic=1; /*音乐播放状态*/ char dir; /*记录蛇运动的方向*/ char c='d';DIR snake[500],food; /*定义蛇节点和食物的类型*/ int speed=SPEED;void drawmap() /*画地图函数*/ {IMAGE img;char str[10];loadimage(&img,"贪吃蛇.jpg"); /*游戏界面*/putimage(0,0,&img);loadimage(&img,"7.jpg"); /*侧栏提示*/putimage(600,0,&img);sprintf(str,"%d",snakelen);setfont(30,0,"宋体");setbkmode(TRANSPARENT);outtextxy(620,10,"操作说明:");setfont(20,0,"宋体");outtextxy(615,50,"awsd控制方向键");outtextxy(615,80,"p键暂停");outtextxy(615,110,"o键继续");outtextxy(615,200,"esc键退出");outtextxy(615,140,"l键暂停音乐");outtextxy(615,170,"k键继续播放");outtextxy(730,250,str);outtextxy(620,250,"蛇当前长度");}void init() /*初始化蛇函数*/ {int i;IMAGE img;snake[0].x=9*len+lm;snake[0].y=4*len+lm;loadimage(&img,"1.jpg");putimage(snake[0].x-lm,snake[0].y-lm,&img); for(i=1;i<snakelen;i++){snake[i].x=len*(9-i)+lm;snake[i].y=len*4+lm;5loadimage(&img, "2.jpg");putimage(snake[i].x-lm,snake[i].y-lm, &img); }}void showsnake() /*画蛇函数*/ {int i;IMAGE img;loadimage(&img, "1.jpg");putimage(snake[0].x-lm,snake[0].y-lm , &img);loadimage(&img, "2.jpg");for(i=1;i<snakelen;i++)putimage(snake[i].x-lm,snake[i].y-lm, &img); }void snakemove() /*画动蛇函数*/ {int i;int mx=snake[0].x;int my=snake[0].y;switch(dir){case 'a':mx-=len;break;case 'd':mx+=len;break;case 'w':my-=len;break;case 's':my+=len;break;default:break;}for(i=snakelen-1;i>=0;i--){snake[i+1].x=snake[i].x;snake[i+1].y=snake[i].y;}snake[0].x=mx;snake[0].y=my;showsnake();}int ceshiover() /*检测游戏结束函数*/ {int i;if(snake[0].x<0||snake[0].x>30*len-lm||snake[0].y<0||snake[0].y>30*len-lm)return 1;for(i=1;i<snakelen;i++)6{if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y) return 1;}return 0;}int foodinsnake() /*检测食物是否在蛇上函数*/ {for(int i=0;i<snakelen;i++)if(food.x==snake[i].x&&food.y==snake[i].y)return 1;elsereturn 0;}void showfood() /*画食物函数*/{IMAGE img;do{food.x=(rand()%30)*len+lm;food.y=(rand()%30)*len+lm;}while(foodinsnake());loadimage(&img, "3.jpg");putimage(food.x-lm,food.y-lm , &img);isfood=0;}void kmusic(){if(ismusic==0)mciSendString("pause mymusic",NULL,0,NULL);if(ismusic==1)mciSendString("resume mymusic",NULL,0,NULL);}void playbkmusic() /*播放背景音乐函数*/{mciSendString("open 超级玛丽.mp3 alias mymusic", NULL, 0, NULL); mciSendString("play mymusic repeat", NULL, 0, NULL);}void playgame() /*玩游戏函数*/{c='d'; //蛇开始向右移动isover=0;7snakelen=Min_snakelen;dir='d';IMAGE img;MyTimer t; //定义精确延时对象int T=200; // 延长时间drawmap(); //画游戏地图init(); //画小蛇初始位置while(!isover){if(ispause){snakemove();FlushBatchDraw(); //批量绘图EndBatchDraw(); //结束批量绘图if(snake[0].x==food.x&&snake[0].y==food.y){ snakelen++;isfood=1;}if(isfood)showfood();if(snakelen<35)T=200-3*snakelen;t.Sleep(T);BeginBatchDraw(); // 开始批量绘图模式,防止闪烁问题drawmap();loadimage(&img, "3.jpg"); // 加载食物图片putimage(food.x-lm,food.y-lm , &img);};//按键控制if(kbhit())c=getch();switch(c){case 'a':if(dir!='d'){dir=c;}break;case 'd':if(dir!='a'){dir=c;}break;case 'w':if(dir!='s'){8dir=c;}break;case 's':if(dir!='w'){dir=c;}break;case 27: exit(0); break; //游戏退出case 'p': ispause=0;break; //p暂停case 'o': ispause=1;break; //o继续游戏case 'l': ismusic=0;break; //l暂停音乐case 'k': ismusic=1;break; //k继续播放default:break;}kmusic(); //音乐控制播放//判断游戏结束if(ceshiover())isover=1;//判断是否重新再来HWND wnd = GetHWnd(); //获取窗口句柄if(isover)if (MessageBox(wnd, "游戏结束。
贪吃蛇设计文档.doc
![贪吃蛇设计文档.doc](https://img.taocdn.com/s3/m/5b1a85a159eef8c75ebfb332.png)
贪吃蛇游戏的设计文档目录一、需求分析 ................................................. 错误 ! 未定义书签。
1.功能需求 . .............................................. 错误 ! 未定义书签。
2.非功能需求错误 ! 未定义书签。
. ............................................二、系统设计 ................................................. 错误 ! 未定义书签。
1. 实际思路 . ............................................... 错误 ! 未定义书签。
2,结构设计 . .............................................. 错误 ! 未定义书签。
(1), main(), 主函数; . ................................ 错误 ! 未定义书签。
(2), init() , 图形化驱动函数 . ......................... 错误 ! 未定义书签。
(3), help(), 帮助信息函数 . ............................ 错误 ! 未定义书签。
(4), drawfence(), 周围墙壁函数 . ....................... 错误 ! 未定义书签。
(5), printscore(), 得分显示函数 . ...................... 错误 ! 未定义书签。
(6), playgame(), 游戏控制函数 . ........................ 错误 ! 未定义书签。
(7), gameover(), 游戏结束函数 . ........................ 错误 ! 未定义书签。
c语言程序贪吃蛇课程设计报告范文
![c语言程序贪吃蛇课程设计报告范文](https://img.taocdn.com/s3/m/a00ba0cc998fcc22bcd10d4a.png)
高级语言程序设计课程设计报告Experiment Designing reporter课程名称:高级语言程序设计英文名称 : C Program Experiment Designing专业:自动化 111学号: XXX姓名: XXX指导教师: XXX日期: 2012 年 6月 17日至 2011 年6 月 20 日山东工商学院信电学院山东工商学院信电学院自动111班第一组“贪吃蛇课程设计报告“一:课程设计内容程序功能介绍贪吃蛇游戏是一个经典小游戏,深受众多玩家喜爱,其规则是:一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
此游戏不仅能锻炼人的思维敏捷性,而且还可以提高玩家的逻辑判断能力。
设计思路我们小组称设计本次课题——贪吃蛇的思路为“贪快速上手贪吃蛇三步曲”:第一步:寻找到一个真正可以运行的已用C编好的贪吃蛇。
因为我们毕竟从未看到过用C编游戏的程序,让我们两手一抹黑的开始编写是有一定的困难的,如果我们自己找一个已经设计好的程序,以此为跳板实现我们想要达到的效果,那么肯定是高效的。
所以我们组统一决定,去寻找一个可以运行的C编译的贪吃蛇。
第二步:运行游戏并了解游戏程序。
我们认为,只有你运行并了解一个游戏,才能知道游戏里需要什么样的改进和创新,如果你自己本身就没玩过这个游戏,那么你就是再有技术,你也永远改进和改编不了一个游戏,因为你根本不知道你在干什么。
同样重要的是了解游戏程序。
因为只有看懂了程序,才能实现对他的改编,才能游刃有余。
第三步:寻找模块并分类,而后进行改编。
寻找到你想要改变的游戏内容的控制模块,比如,我想要增加一堵墙,那第一页共十六页自动化 111么就应该找到void DrawK(void){setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);for(i=200;i<=500;i+=10)rectangle(i,200,i+10,209);}然后要找到:改变蛇初始长度、颜色、初始位置的模块,改变苹果出现位置的模块,让蛇见墙死的模块,让蛇吃苹果加长的模块……….并且进行分类,这样下次再想实现某个目标时,可以一目了然的进行改编。
贪吃蛇游戏程序设计实验报告
![贪吃蛇游戏程序设计实验报告](https://img.taocdn.com/s3/m/cc9af60f5b8102d276a20029bd64783e08127d69.png)
贪吃蛇游戏程序设计实验报告贪吃蛇游戏程序设计实验报告1、引言1.1 文档目的1.2 背景介绍1.3 项目概述2、需求分析2.1 用户需求2.2 功能需求2.3 非功能需求3、总体设计3.1 系统结构3.2 使用的开发工具和技术3.3 程序流程图3.4 数据结构设计4、模块设计4.1 游戏界面模块设计4.2 蛇的移动模块设计4.3 食物模块设计4.4 游戏结束判定模块设计5、开发过程5.1 编码规范5.2 界面设计与实现5.3 功能模块实现5.4 联合测试与整合调试6、测试结果与分析6.1 单元测试6.2 集成测试6.3 性能测试6.4 用户验收测试7、部署与运维7.1 系统环境要求7.2 安装步骤7.3 运行与维护8、问题与解决方案8.1 开发中的问题8.2 解决方案9、结论9.1 实验总结9.2 实现目标9.3 后续改进方向附件:- 源代码文件- 参考文献法律名词及注释:- 版权:保护原创作品的独有权利,防止他人未经授权使用、复制或传播。
- 许可证:授权他人在特定条件下使用受版权保护的作品。
- 商标:用于标识特定产品或服务来源的标识,可以是文字、图形、颜色或声音。
- 专利:通过创造一种新的发明而获得的对该发明的独有权利,防止他人在未获许可的情况下制造、使用或销售该发明。
- 使用条款:规定使用软件、服务或作品的条件和限制。
- 免责声明:声明作者或提供者对使用软件、服务或作品时可能产生的损害不承担责任。
全文结束 \。
贪吃蛇游戏开发文档(最终)
![贪吃蛇游戏开发文档(最终)](https://img.taocdn.com/s3/m/09baefccec3a87c24128c404.png)
gotoxy(iRow,iColoum); printf("-->"); } if(i==-1) return -1; if(i==1) break; } return iResult; }
*********************************END****************************** ********************Tools.h函数END********************************
Snakedd *pSnake=NULL;//存储蛇的头节点地址 Snakedd *pFooted = NULL;//消失的蛇身的节点 int iFooted_x=0; int iFooted_y=0;//新增蛇体的位置 CRITICAL_SECTION hade;//用于线程锁 ///////////////////////////////////////////////////////////////// **********************第一次完成函数:***************************
*************************void GameWord(void)********************* void GameWord(void) {
int x=5; int y=3; int i=0; system("cls"); Block(0,0,25,30); Block(52,0,10,30); gotoxy(10,12); //游戏区域绘制 //printf("游戏开始!"); Snakedd *pResult = ProduceSnake(7); PrintList(pResult); DeleteList(pResult); RandomCoordinate();
C语言贪吃蛇全部程序及说明Word版
![C语言贪吃蛇全部程序及说明Word版](https://img.taocdn.com/s3/m/a1edae5783d049649a6658cb.png)
#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>#include <time.h>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("你的得分:%d\n",sum=10*(sum-1));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 ] = '@';elseif(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(); //食物吃完了马上再产生一个食物}elseover = 1;}。
贪吃蛇程序
![贪吃蛇程序](https://img.taocdn.com/s3/m/d283fca7a0116c175f0e4886.png)
可以使用Invalidate()来重绘整个窗口, 量是很大的,这会导致屏幕出现闪烁, • // 以用InvalidateRect()来替代Invalidate(), 要绘制的内容计算量会要小很多。
刷新游戏区域中pPoint处的一个
• void CSnakeView::ReDisplay(CPoint p 绘的窗口的句柄 { 重绘的矩形区域 /重绘矩形的方式。 InvalidateRect (CRect (m_nLeft + pPoi 个参数是需要重绘的窗口的句柄,但是 m_nTop + pPoint. x * m_nSize, 生类中可以不要填写,第二个参数是 m_nLeft + (pPoint. y + 1) * m_nSize, m 的坐标必须是逻辑坐标。第三个参数是 + 1) * m_nSize) ); SE是重绘传入的矩形,为TRUE的时候 }
1
• (2)在CSnakeView. Cpp文件,添加3个成员函数 IniAim、IniGame和ReDiaplay:
// 该函数随机产生一个供蛇吃的目标,如果该目标恰巧与蛇身重合,则 重新产生一个 • void CSnakeView::IniAim() { int uX, uY; // 目标位置 while (1) { uX=rand ( ) % m_nHeight; uY=rand ( ) % m_nWidth; int uTag = 0; // 0-不与蛇身重合,1-重合 for (int i=0;i <= m_aBody. GetUpperBound ( );i++) { CPoint uPoint = m_aBody. GetAt (i); if (uPoint. x == uX ||uPoint. y == uY ) // 目标与蛇身重合 { uTag = 1; break; } } if (uTag == 0) break; } m_pAim = CPoint (uX, uY); // 产生的目标存放在成员变量中 }
贪吃蛇游戏单片机程序
![贪吃蛇游戏单片机程序](https://img.taocdn.com/s3/m/04f065650622192e453610661ed9ad51f11d5478.png)
贪吃蛇游戏单片机程序贪吃蛇游戏是一款经典的游戏,其简洁的规则和有趣的玩法使其成为了许多人喜爱的游戏之一。
在单片机中实现贪吃蛇游戏需要利用单片机的输入输出功能以及控制算法来完成游戏的控制和显示。
下面是一个简单的贪吃蛇游戏单片机程序的实现。
首先,我们需要定义一些常量和变量来表示游戏中的一些参数和状态。
比如,我们可以定义一个常量来表示屏幕的宽度和高度,以及一个变量来表示蛇的长度和当前的移动方向。
c#define SCREEN_WIDTH 16#define SCREEN_HEIGHT 8#define SNAKE_MAX_LENGTH 64int snake_length;int snake_direction;接着,我们需要定义一个数据结构来表示蛇的身体,可以使用一个数组来表示蛇的每一节身体的位置。
同时,我们还需要定义一个数据结构来表示食物的位置。
cstruct point {int x;int y;};struct point snake[SNAKE_MAX_LENGTH];struct point food;然后,我们可以编写一个函数来初始化游戏的状态。
在这个函数中,我们需要初始化蛇的位置和长度,以及随机生成食物的位置。
void init_game{// 初始化蛇的位置和长度snake[0].x = SCREEN_WIDTH / 2;snake[0].y = SCREEN_HEIGHT / 2;snake_length = 1;// 随机生成食物的位置food.x = rand% SCREEN_WIDTH;food.y = rand% SCREEN_HEIGHT;}接下来,我们需要编写一个函数来处理用户输入,并更新蛇的移动方向。
这个函数可以通过读取按键的状态来实现,比如可以通过一个变量来记录当前的按键状态。
cvoid handle_input{// 读取按键状态int key = read_key// 根据按键状态更新蛇的移动方向if (key == 'W' && snake_direction != 'S') {snake_direction = 'W';} else if (key == 'S' && snake_direction != 'W') {snake_direction = 'S';} else if (key == 'A' && snake_direction != 'D') {snake_direction = 'A';} else if (key == 'D' && snake_direction != 'A') {snake_direction = 'D';}然后,我们可以编写一个函数来更新蛇的位置。
贪吃蛇源程序
![贪吃蛇源程序](https://img.taocdn.com/s3/m/e523100f5f0e7cd18425364f.png)
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19);
printf("空格:暂停游戏");
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);
printf("Esc :退出游戏");
gotoxy(hOut,FrameX,FrameY);
随机产生方块类型的序号voidgetflagstructtetris制作俄罗斯方块voidmaketetrisstructtetris打印俄罗斯方块voidprinttetrishandlehoutstructtetris清除俄罗斯方块的痕迹voidcleartetrishandlehoutstructtetris判断是否能移动返回值为1能移动否则不动intifmoveablestructtetris判断是否满行并删除满行的俄罗斯方块voiddelfullhandlehoutstructtetris开始游戏voidstartgame
void gotoxy(HANDLE hOut, int x, int y)
{
COORD pos;
pos.X = x; //横坐标
pos.Y = y; //纵坐标
SetConsoleCursorPosition(hOut, pos);
}
/******
制
作
游
戏
窗
口
******************************************************************/
a[tetris->x+2][tetris->y]=b[3];
贪吃蛇程序
![贪吃蛇程序](https://img.taocdn.com/s3/m/d1cb462fccbff121dd36837c.png)
贪吃蛇程序游戏说明:1、在英文状态下用w、a、s、d键操纵蛇头上下左右移动。
2、操控蛇头吃到食物时蛇长便增加1。
3、蛇头不能碰到四周墙壁和自己身体。
4、当蛇身长度达到45时(可自行调节),游戏成功。
源代码:(可直接复制到VC6.0里运行程序)#include <iostream.h> //标准输入输出流#include <windows.h> //win32下的函数#include <stdlib.h> //常用系统函数,此处产生随机数#include <conio.h> //控制台输入输出函数#include <time.h> //时间函数,使用当前时间做种子enum dir{up,down,left,right}; //枚举类型enum dir// 1、围墙的制作class Fence //定义出一个类:围墙{public:void InitFence(); //定义边界函数的组成void OutputF(); //输出边界函数public:char game[30][30]; //game定义为游戏框,注意类型为字符}f; //定义对象//画框框void Fence::InitFence(){for(int i=0;i<21;i++)for(int j=0;j<25;j++){if(i==0||i==20||j==0||j==24) game[i][j]= '*'; //画出边框else game[i][j]= ' '; //将内部点设置为空}}//显示框框void Fence::OutputF(){for(int i=0; i<21; i++){for(int j=0; j<25; j++){cout<<game[i][j]<<' ';}cout<<endl;}}// 2、蛇结点的构建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;}// 3、定义移动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() //对类中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==20||b==24||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{if(f.game[a][b]=='*'){cout<<"game over!!!"<<endl;exit(0);}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() //定义得到食物函数{for(int v=0;;v++){srand((unsigned int) time(NULL)); //做种子(程序运行时间)food_x= rand()%19+1;food_y= rand()%23+1;if(f.game[food_x][food_y]!='*'){f.game[food_x][food_y]= '@';break;}else continue;}}//主函数int main(){cout<<"Using 'w,s,a,d'to control direction!!!\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;}游戏截图:。
贪吃蛇的源程序
![贪吃蛇的源程序](https://img.taocdn.com/s3/m/e579358ecc22bcd126ff0c91.png)
贪吃蛇main(int argc,char *argv[]){if (argc!=1){if (argv[1]!="") Heng=atoi(argv[1]);if (argv[2]!="") Shu=atoi(argv[2]);}Init(); /*初始化界面*/PreAct=random(8); /*取得当前的方块*/for(;;) /*以下是游戏流程*/{NextAct=random(8); /*取得下一个方块*/DrawNext(1); /*画出下一个方块*/Act=PreAct;if (Heng%2==0) ActH=Heng/2; else ActH=(Heng-1)/2;ActS=0; /*方块开始从游戏空间的中间下落*/Staus=0; /*取开始的状态*/NoPass=CAN; /*物体可以下落*/Give(); /*取得当前的方块*/Display(Act+1); /*显示当前的方块,每种方块的颜色不同*/GoOn(); /*游戏的算法精髓所在*/PreAct=NextAct; /*方块下落完毕,取得下一个方块*/DrawNext(0);}}c2.0中怎么样设置图形显示?Tc2.0中有两种显示模式,一种是我们所熟知的字符模式,另一种是图形模式。
在字符模式下只能显式字符,如ASCII字符。
一般是显示25行,每行80个字符。
程序缺省的是字符模式。
在字符模式下不能显式图形和进行绘图操作。
要想进行图形显示和绘图操作,必须切换到图形模式下。
Tc2.0中用initgraph()函数可以切换到图形模式,用closegraph()可以从图形模式切换回字符模式。
initgraph()和closegraph()都是图形函数,使用图形函数必须包括头文件"graphics.h"。
void far initgraph(int far *graph driver,int far *graphmode,char far *pathtodriver);graphdriver是上涨指向图形驱动序号变量的指针;graphmo de是在graphdriver选定后指向图形显示模式序号变量的指针。
贪吃蛇游戏 C程序 报告
![贪吃蛇游戏 C程序 报告](https://img.taocdn.com/s3/m/6ca6ccc058f5f61fb7366656.png)
一、读程序题部分(贪吃蛇)1、程序的功能设计游戏界面,包括画墙、画蛇、画食物,并且设置蛇和食物的属性,编写蛇的运动方式和游戏方式。
2、主函数分析主函数中前两行与编写图形程序有关,第三行中调用Speed函数,把Speed 函数的返回值付给变量speed;第五行dwall函数的作用是画墙,函数中又调用wall函数来画墙上的砖块3、函数的调用关系4、数据变量定义作用定义食物的横坐标food.x和食物的纵坐标food.y可以有效的随机设置食物出现在界面的任何地方;定义snake.life表示蛇的生死以否,好判断是否结束游戏snake.dir=1;/*方向向右*/定义snake.x[0]和snake.y[0]表示蛇头的坐标,在后面蛇撞墙死的问题上用的到蛇头的坐标;定义蛇的节数snake.node,方便蛇每吃到食物节数增加;定义snake.level,显示蛇的闯关数5、主要函数的功能、流程图dwall():画墙wall():画组成墙的砖Speed():选择贪吃蛇的速度line():画线函数,画砖的线条gotoxy():定位坐标Play():调用各函数,开始完游戏GameOver():结束游戏6、程序的不足及改进没有障碍墙,游戏过于简单;没有游戏奖励,游戏趣味性不高;改进:设置障碍墙,蛇撞到墙也死;代码:for(j=200;j<=300;j+=10){wall(j,300);/*画横的障碍墙*/}for(j=300;j<=350;j+=10){wall(300,j);/*画竖的障碍墙*/}不足:没有游戏奖励,游戏趣味性不高;改进:增加生命值,蛇每吃到三颗食物,则增加一个生命值;代码:定义food.level,在Play函授中初始化,在设置蛇每吃到一颗食物就增长一节身体的代码后加上if(snake.node%3==0){snake.level++; /*除第一关外,其余每吃3颗食物,就增加一个生命值*/gotoxy(5,2);printf("The level is %d",snake.level); /*左上角显示出生命值(级别)*/}7、加上注释、改进后的完整代码#include <graphics.h>#include <stdlib.h>#include <dos.h>#include<conio.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#define N 100/*贪吃蛇的最大长度*/#define P 0x1970/*定义暂停功能键*/int i,key;int speed;/*游戏速度*/struct FOOD{int x;/*食物的横坐标*/int y;/*食物的纵坐标*/int flag;/*标志是否要出现食物*/}food;struct Snake{int x[N];int y[N];int node;/*蛇的节数*/int dir;/*蛇移动方向*/int life;/*标志是死是活*/int level;/*定义生命值(级别)*/}snake;void GameOver();/*结束游戏*/void Play();/*玩游戏过程*/void dwall();/*画墙*/void wall(int x,int y);/*画组成墙的砖*/int Speed();/*选择贪吃蛇的速度*/main(){int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"");speed=Speed();/*将函数返回值赋给speed*/cleardevice();/*清屏*/dwall();/*开始画墙*/Play();/*开始完游戏*/getch();closegraph();/*退出图形界面*/}void wall(int x,int y){int sizx=9;int sizy=9;setcolor(15);/*白色画砖的上边和左边*/line(x,y,x+sizx,y);line(x,y+1,x+sizx-1,y+1);line(x,y,x,y+sizy);line(x+1,y,x+1,y+sizy-1);setcolor(4);/*红色画砖的右面和下面*/line(x+1,y+sizy,x+sizx,y+sizy);line(x+2,y+sizy-1,x+sizx,y+sizy-1);line(x+sizx-1,y+2,x+sizx-1,y+sizy-1);line(x+sizx,y+1,x+sizx,y+sizy);setfillstyle(1,12);/*用淡红色填充砖的中间部分*/ bar(x+2,y+2,x+sizx-2,y+sizy-2);}void dwall()/*用前面画好的砖来画墙*/{int j;for(j=50;j<=600;j+=10){wall(j,40);/*画上面墙*/wall(j,451);/*画下面墙*/}for(j=40;j<=450;j+=10){wall(50,j);/*画左面墙*/wall(601,j);/*画右面墙*/}for(j=200;j<=300;j+=10){wall(j,300);/*画横的障碍墙*/}for(j=300;j<=350;j+=10){wall(300,j);/*画竖的障碍墙*/}}int Speed()/*选择贪吃蛇运行的速度*/ { int m;gotoxy(20,10);printf("level 1\n");gotoxy(20,12);printf("level 2\n");gotoxy(20,14);printf("level 3\n");gotoxy(20,16);/*增加一个速度选项*/ printf("level 4\n\t\tplease choose:");scanf("%d",&m);switch(m){case 1:return 60000;case 2:return 40000;case 3:return 20000;case 4:return 10000;default:cleardevice();Speed();}}void Play(void)/*游戏实现过程*/{srand((unsigned long)time(0));food.flag=1;/*1表示需出现新食物,0表示食物已存在*/ snake.life=0;/*标志贪吃蛇活着*/snake.dir=1;/*方向向右*/snake.x[0]=300;snake.y[0]=240;/*定位蛇头初始位置*/ snake.x[1]=300;snake.y[1]=240;snake.node=2;/*贪食蛇节数*/snake.level=1; /*生命值(级别)初始化*/do{while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/ {if(food.flag==1)/*需要出现新食物*/do{food.x=rand()%520+60;food.y=rand()%370+60;food.flag=0;/*标志已有食物*/}while(food.x%10!=0||food.y%10!=0);if(food.flag==0)/*画出食物*/{setcolor(WHITE);/*设置食物的颜色*/setlinestyle(3,0,3);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.dir){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]<60||snake.x[0]>590||snake.y[0]<50||snake.y[0]>440)/*蛇是否撞到墙壁*/{GameOver();/*游戏结束*/snake.life=1; /*蛇死*/break;}if(snake.y[0]==300&&snake.x[0]>200&&snake.x[0]<=300)/*蛇是否撞到横的障碍墙*/ {GameOver();/*游戏结束*/snake.life=1; /*蛇死*/break;}if(snake.x[0]==300&&snake.y[0]>300&&snake.y[0]<=350)/*蛇是否撞到竖的障碍墙*/ {GameOver();/*游戏结束*/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.node++;/*蛇的身体长一节*/if(snake.node%3==0){snake.level++; /*除第一关外,其余每吃3颗食物,就增加一个生命值*/gotoxy(5,2);printf("The level is %d",snake.level); /*左上角显示出生命值(级别)*/}food.flag=1;/*需要出现新的食物*/}setcolor(YELLOW);/*画蛇(设置蛇的颜色)*/for(i=0;i<snake.node;i++){ setlinestyle(0,0,1);rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]+10);}delay(speed);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==UP&&snake.dir!=4)/*判断是否往相反的方向移动*/snake.dir=3;elseif(key==DOWN&&snake.dir!=3)/*判断是否往相反的方向移动*/ snake.dir=4;elseif(key==RIGHT&&snake.dir!=2)/*判断是否往相反的方向移动*/snake.dir=1;elseif(key==LEFT&&snake.dir!=1)/*判断是否往相反的方向移动*/ snake.dir=2;elseif(key==P) getch();/*若按P键,则游戏暂停*/}while(key!=ESC);/*ESC键退出游戏*/}void GameOver(void){cleardevice();setcolor(RED);settextstyle(0,0,4);outtextxy(50,200,"GAME OVER,BYE BYE!");sleep(3);}。
贪吃蛇开发文档
![贪吃蛇开发文档](https://img.taocdn.com/s3/m/4021c90f7cd184254b353532.png)
【名称】贪吃蛇开发文档【日期】2011-1-24 星期一1【需求文档】1.1 主界面1.2 菜单游戏菜单【开始】:重新开始。
【暂停、开始】:停止一下游戏,游戏开始。
【退出】:退出程序。
帮助菜单【关于】弹出关于对话框1.3 游戏界面【蛇】:蛇头黑色,蛇身白色,蛇每吃一次食物,蛇身就变长一格。
【食物】:黑色一点,每次被蛇吃掉,就在游戏界面上随机产生。
1.4 右边界面得分:每吃一个食物加一分。
游戏说明:上:W键下:S键左:A键右:D键暂停:空格键1.5 关于对话框2【全中文建模】2.1 类图1.蛇2.食物3.主窗口4.关于窗口5.得分2.2.1蛇2.2.2食物2.2.4主窗口2.2.5关于窗口2.3 序列图2.4 伪代码伪代码编写原理:你按照序列图去做伪代码,序列图怎么相互调用就怎么写函数。
2.4.1显示游戏流程主界面::显示(){蛇.得到坐标();食物.得到坐标();得分.得到坐标();}2.4.2蛇移动流程主界面::开始菜单(){键盘消息();}主界面::键盘消息(){蛇.移动();}蛇::移动(){食物.吃掉();得分.设置得分();}食物::吃掉(){产生();}2.4.3关于对话框流程主界面::关于菜单(){关于对话框.显示();}3【全英文建模】3.1 类图3.2 用例图3.3 序列图3.4 伪代码3.4.1显示游戏流程CMainDialog::Show(){CSnake.GetPoint();CFood.GetPoint();CScore.GetScore();}3.4.2蛇移动流程CMainDialog::StartMenu(){KeyboardMessage();}CMainDialog::KeyboardMessage() {CSnake.Move();}CSnake::Move(){CFood.Eat();CScore.SetScore();}CFood::Eat(){Make();}3.4.3关于对话框流程CMainDialog::AboutMenu(){CAboutDialog.Show();}4【真正代码】。
贪吃蛇C程序及流程图和模块设计说明
![贪吃蛇C程序及流程图和模块设计说明](https://img.taocdn.com/s3/m/370058791711cc7931b71613.png)
#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;/* 蛇的生命,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)/*食物整个坐标大小需要符合10*10的大小否则社无法迟到*/ 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;/*判断是否往相反的方向移动(向相反方向移动会死亡)第三类死亡条件*/ elseif(key==UP&&snake.direction!=4)snake.direction=3;elseif(key==RIGHT&&snake.direction!=2)snake.direction=1;elseif(key==LEFT&&snake.direction!=1)snake.direction=2;elseif(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();}本系统分为:初始化即图形驱动函数init()模块、图形界面设计Drawk()模块、游戏GamePlay()模块、输出成绩PrScore()模块、退出游戏Close模块、在游戏模块中通过3个控制语句判断游戏中的蛇是否死亡(3中死亡方式),不出现死亡在游戏结束时候打出成绩,如果出现死亡则跳出循环并打出成绩并进行初始化设定,如果不玩游戏按ESC则退出游戏。
贪吃蛇游戏程序设计
![贪吃蛇游戏程序设计](https://img.taocdn.com/s3/m/74db9110b7360b4c2e3f6438.png)
/*定义整条蛇的数据类型*/ typedef struct { TANCHISHE Snakeh;/*头部数据*/ TANCHISHE Snakeb[MAXSIZE];/*刷新蛇体数据*/ TANCHISHE old_Snakeb[MAXSIZE];/*保存上一次蛇体数据*/ TANCHISHE Snaket;/*尾巴数据*/ int cx;/*恢复屏幕数据位置 x 分量*/ int cy;/*恢复屏幕数据位置 y 分量*/ int hx;/*头部位置 x 分量*/ int hy;/*头部位置 y 分量*/ int size;/*每节长度大小*/ int front;/*队列头指针*/ int rear;/*队列尾指针*/ }TCsQueue; static char *TCShead[4]={headt,headd,headl,headr}; static char *TCSbody[6]={leftt,leftd,rightt,rightd,lf_rh,tp_dn}; static char *TCStail[4]={re_lf,re_rh,re_tp,re_dn}; /*定义食物的数据类型*/ typedef struct FOOD { int fx;/*食物 x 坐标位置分量*/ int fy;/*食物 y 坐标位置分量*/ int fns;/*食物种类标识符*/ int fkey;/*游戏区是否有食物标识符*/ int fnew_t;/*投放食物时间分量*/ }FOOD; /*设置蛇头运动方向*/ void SetSnakeHeadMove(int top,int down,int left,int right,TCsQueue *st) { st->Snakeh.top=top; st->Snakeh.down=down; st->Snakeh.left=left; st->Snakeh.right=right; } /*初始化蛇*/ void init_TCs(TCsQueue *st) { int nt,sx=320,sy=240,size=12; srand((unsigned) time(NULL)); nt=rand()%4; st->front=-1; st->rear=0;
《贪吃蛇》游戏程序代码
![《贪吃蛇》游戏程序代码](https://img.taocdn.com/s3/m/927b9f6091c69ec3d5bbfd0a79563c1ec4dad77a.png)
《贪吃蛇》游戏程序代码1. 游戏初始化:设置游戏窗口、蛇的初始位置和长度、食物的初始位置等。
2. 蛇的移动:根据用户输入的方向键,更新蛇的位置。
确保蛇的移动不会超出游戏窗口的边界。
3. 食物的:在游戏窗口中随机食物的位置。
确保食物不会出现在蛇的身体上。
4. 碰撞检测:检测蛇头是否撞到食物或自己的身体。
如果撞到食物,蛇的长度增加;如果撞到自己的身体,游戏结束。
5. 游戏循环:不断更新游戏画面,直到游戏结束。
6. 游戏结束:显示游戏结束的提示,并询问用户是否重新开始游戏。
import random游戏窗口大小WIDTH, HEIGHT = 800, 600蛇的初始位置和长度snake = [(WIDTH // 2, HEIGHT // 2)]snake_length = 1食物的初始位置food = (random.randint(0, WIDTH // 10) 10,random.randint(0, HEIGHT // 10) 10)蛇的移动方向direction = 'RIGHT'游戏循环while True:更新蛇的位置if direction == 'UP':snake.insert(0, (snake[0][0], snake[0][1] 10)) elif direction == 'DOWN':snake.insert(0, (snake[0][0], snake[0][1] + 10)) elif direction == 'LEFT':snake.insert(0, (snake[0][0] 10, snake[0][1])) elif direction == 'RIGHT':snake.insert(0, (snake[0][0] + 10, snake[0][1]))检测碰撞if snake[0] == food:food = (random.randint(0, WIDTH // 10) 10, random.randint(0, HEIGHT // 10) 10)else:snake.pop()检测游戏结束条件if snake[0] in snake[1:] or snake[0][0] < 0 or snake[0][0] >= WIDTH or snake[0][1] < 0 or snake[0][1] >= HEIGHT:break游戏画面更新(这里使用print代替实际的游戏画面更新) print(snake)用户输入方向键direction = input("请输入方向键(WASD): ").upper() print("游戏结束!")。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.需求分析1.1问题的描述本程序主要是一个交互式的游戏程序,通过玩家的键盘上下左右键控制贪吃蛇的运动方向。
程序会根据您按下的键判断贪吃蛇走向。
这个程序的关键是表示蛇的图形以及蛇的移动。
用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。
移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。
如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有清屏的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现和消失也是画圆形和覆盖圆形。
1.2基本要求应用Visual C++的MFC进行可视化编程,完成一个贪吃蛇小程序。
程序包含snake.EXE可执行文件和所有的可编译程序源码;能够实行游戏的开始、结束、得分和计时;屏幕上能够显示游戏规则和游戏的注意事项。
2.概要设计2.1数据结构数据结构是指相互之间存在一定关系的数据元素的集合。
按照视点的不同,数据结构分为逻辑结构和存储结构。
数据的逻辑结构(logical structure)是指数据元素之间逻辑关系的整体。
所谓逻辑关系是指数据元素之间的关联方式或邻接关系。
根据数据元素之间逻辑关系的不同,数据结构分为四类:集合;线性结构;树结构;图结构。
数据的逻辑结构属于用户视图,是面向问题的,反映了数据内部的构成方式。
为了区别于数据的存储结构,常常将数据的逻辑结构称为数据结构。
数据的存储结构(storage structure)又称为物理结构,是数据及其逻辑结构在计算机中的表示,换言之,存储结构除了数据元素之外,必须隐式或显示地存储数据元素之间的逻辑关系。
通常有两种存储结构:顺序存储结构和链接存储结构[1]。
贪吃蛇程序中的重要代码如下:动态数组:CArray<CPoint,CPoint> m_aBody // 保存蛇身点类:CPoint m_pAim / /保存一个食物目标的坐标函数:void CSnakeView::IniAim() //随机函数生成食物的X 和Y坐标voidCSnakeView::IniGame()//改函数对游戏初始化定义游戏的初始状态void CSnakeView::ReDisplay(CPoint pPoint)//刷新游戏区域中pPoint处的一个小方格void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) //判断键盘按钮事件CView::OnTimer(nIDEvent) //计时器函数来重画屏幕程序的功能是实现对贪吃蛇游戏的开始,如下图所示2.3各模块之间的调用关系及算法设计用流程图示出程序的主要控制流程和处理流程,其图形如下:3 详细设计构思如下:首先,设计者考虑设计一个可以游动的蛇。
其次,通过寻找规律,对实际对象进行抽象概括建立对象模型,从物理的角度来分析蛇得运动规律,其运动规律如下:1.它是蠕动的,像水一样流动。
2.它有个特性就是身体的每一个点都经过它头部所在的点。
3.它每一个时刻骨节所要运动的目的地是它前一个骨节所在的位置。
再次,根据蛇的实际图形描绘它的抽象模型,其过程如下图所示:注:由图A 到图B 可以看到实际对象的模型到抽象模型图A 实际的蛇的照片图B 蛇抽象成为骨骼状态(头和骨节)程序的骨骼结构图其中蛇的全身都是一样的绿边的正方形构成但是在分析时注意到头部与其它的骨节不同,只有蛇头才能控制整个蛇的运动方向。
3.1 游动的蛇的程序此贪吃蛇游戏中首先必须编写一条游动的蛇,此游动的蛇的程序代码如下所经过抽象化示:for (int loop=0;loop<m_snakeBody.GetSize();loop++){CPoint temp=m_snakeBody.GetAt(loop);pDC->Rectangle(CRect(m_initialLeft+temp.x*m_size,m_initialTop+temp.y*m_s ize,m_initialLeft+(temp.x+1)*m_size,m_initialTop+(temp.y+1)*m_size));}3.2判断游戏是否结束游戏是否结束有两种情况,一是蛇碰到了四周的墙壁,二是蛇碰到了自身。
蛇是否越界的代码,如下所示:switch(m_direction){case 1: //leftsnakehead.x--;if (snakehead.x<0) //判断蛇是否越界{fail=TRUE;}break;case 2: //rightsnakehead.x++;if (snakehead.x>=m_width)//判断蛇是否越界{fail=TRUE;}break;case 3: //upsnakehead.y--;if (snakehead.y<0)//判断蛇是否越界{fail=TRUE;}break;case 4: //downsnakehead.y++;if (snakehead.y>=m_height)//判断蛇是否越界{fail=TRUE;}break;default:break;}蛇是否碰到自身的代码,如下所示:if (!fail) //判断蛇是否配到了自身{for (int i=0;i<m_snakeBody.GetSize();i++){CPoint temp=m_snakeBody.GetAt(i);if (snakehead.x==temp.x && snakehead.y==temp.y){fail=TRUE;break;}}3.3游戏得分蛇吃到一个食物游戏得分就加一分,此代码如下所示:if (snakehead.x==m_aim.x && snakehead.y==m_aim.y) //碰到目标{m_count++;CreateAim();Invalidate();}else{CPoint tail=m_snakeBody.GetAt(m_snakeBody.GetUpperBound());m_snakeBody.RemoveAt(m_snakeBody.GetUpperBound());DrawTailReat(tail);}3.4游戏计时游戏一开始,计时器开始启动,其代码如下:if (++m_timeNumber==10){m_timeCost++;m_timeNumber=0;Invalidate();}4.调试与分析4.1程序调试刚开始设计程序的时候,我们先从最为简单的游戏模式开始,除了编写一个可以运行出来的贪吃蛇游戏外没有任何的修饰性的东西。
编写的程序简单,运行的结果空白太多,让人玩耍起来都没有兴趣。
刚开始编写的程序无法显示游戏规则和注意事项,也没有图形的格数显示,只会显示计时和得分。
缺少了如下的函数,因而无法显示游戏规则和注意事项。
缺少的函数代码如下所示:static char *lpsz[]={"关于游戏的介绍:贪吃蛇游戏是一个深受人们喜欢的游戏:","一条蛇在密闭的围墙内,在围墙内随机出现一个食物,","通过键盘上的四个光标键控制蛇向上下左右四个方向移动,","游戏中蛇是通过不停游动的不断的捕食来达到自身的增长,","但是若蛇碰到自身的身体或者碰到了任何障碍物,则游戏结束。
","单击菜单条上的那个【游戏】—>【开始】开始游戏","祝您愉快","","","游戏注意事项:","蛇相对当前的前进方向只能前进,或者向左右转弯。
","不能按相对当前前进方向的后退键,不能让蛇碰到边框。
"}刚开始做的程序也可以运行,得到的结果如下图:我们希望自己的程序能够更加完美和有新意,所以在此基础上进行了许多的改进和添加函数,才得到我们现在的运行结果。
4.2数据分析程序一执行就可以看到游戏的界面,可以通过菜单栏下的开始和工具栏中的玩开始游戏。
丰富之后的函数然我们的游戏界面更加的赏心悦目了,也使得游戏的玩耍者玩的更尽兴。
5.用户手册5.1运行环境在本课程设计中,系统开发平台为Windows2000,程序设计语言为VisualC++6.0,程序的运行环境为Visual C++ 6.0。
Visual C++一般分为三个版本:学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。
实验中可以使用这三个版本的任意一种,在本课程设计中,以Visual C++ 6.0为编程环境。
Microsoft Visual C++ 6.0是Microsoft公司的Microsoft Visual Studio 6.0开发工具箱中的一个C++程序开发包。
Visual C++包中除包括C++编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。
自1993年Microsoft 公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。
Visual C++从最早期的1.0版本,发展到最新的7.0版本,Visual C++已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。
最新的7.0版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。
虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。
所以实际中,更多的是以Visual C++6.0为平台。
Visual C++ 6.0是Microsoft公司推出的目前使用最广泛的基于Windows平台的可视化编程环境。
Visual C++ 6.0是在以往版本不断更新的基础上形成的,由于其功能强大,灵活性好,完全课扩展以及具有强大的Internet支持,因而在各种C++语言开发工具中脱颖而出,成为目前最为流行的C++语言集成开发环境。
Visual C++ 6.0秉承Visual C++以前版本的优异特性,为用户提供了一套良好的可视化开发环境:主要包括文本编辑器、资源编辑器、工程创建工具、Debugger调试器等等。