




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课 程 设 计 报 告 课程名称:面向对象程序设计C+ 设计题目: 贪吃蛇游戏 专 业:计算机科学与技术 姓 名: 学 号: 指导教师: 李 晓 虹 2016 年 1 月 6 日1. 系统需求分析1.1程序功能贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。用方向键盘控制蛇的移动。1.2设计要求1) 能实现蛇吃了食物后蛇身能够增长。2) 能随机产生食物,且不能是在蛇身上。3) 需要对蛇出界做相应的处理。2. 总体设计2.1设计思想程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇。2.2 流程图流程图如图2-1:图2-13. 详细设计3.1数据结构表示食物与蛇的矩形块设计为10*10个像素单位,食物的基本数据域为他所出现的位置,用x和y座标表示,则矩形块用函数rectangle(x,y,x+10,y+10)或rectangle(x,y,x+10,y-10)可以画出。由于每次只出现一个食物,所以设定yes表示是否要出现食物。蛇的一节身体为一个矩形块,表示矩形块只需起点座标x,y。身体不断增长,用数组存放每节座标,最大设定为N=100,node表示当前节数。保存蛇的移动方向的变量direction和生命的变量life,一旦life为1,表示蛇死,结束。struct Food int x;/*食物的横坐标*/ int y;/*食物的纵坐标*/ int yes;/*1表示需要出现新食物,0表示已经存在食物*/ food;/*食物的结构体*/ struct Snake int xN; int yN; int node;/*蛇的节数*/ int direction;/*蛇移动方向*/ int life;/* 蛇的生命,0活着,1死亡*/ snake; 3.2初始化函数BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)1) 在初始化函数中,完成主界面。主界面是一个封闭的围墙,用两循环语句分别在水平和垂直方向输出连续的宽度和高度均为10单位的矩形方块,围成密闭图形,表示围墙。2) 在初始化函数中,对蛇的各个参数进行初始化,设定文字输出字体,用TextOut( )在矩形围墙旁边输出score=。3) 在初始化函数中,随机产生一个食物。4) 在初始化函数中,设下定时器。BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) HWND hWnd; hInst = hInstance; / Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 200, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); for(int k=0;kN;k+) snake.xk=-10;snake.yk=-10; HDC hdc; hdc=GetDC(hWnd); for(int i=150;i800;i=i+10)for(int j=50;j0;i-) / 蛇在移动的过程中,从蛇尾开始,把上一节的蛇身坐标付给下一节,实现蛇的移动过程 snake.xi=snake.xi-1; snake.yi=snake.yi-1; 3.4游戏函数void GamePlay(HDC hdc)对蛇是否吃到食物及蛇是否死亡进行判断,在蛇活着的情况下,如果蛇吃到食物,就将旁边的score加1,然后再随机产生一个食物。(确保食物不产在蛇身上)。void GamePlay(HDC hdc) /开始游戏 LOGFONT logfont; ZeroMemory(&logfont, sizeof(LOGFONT); logfont.lfCharSet = GB2312_CHARSET; logfont.lfHeight = -25; _tcscpy(logfont.lfFaceName, _T(宋体); HFONT hFont = CreateFontIndirect(&logfont); SelectObject(hdc, hFont); /以上是选择输出的字体的颜色if(food.yes=1) food.x=(rand()%65+15)*10; /随机产生食物 food.y=(rand()%35+5)*10; for(int m=0;msnake.node;m+) /确保食物不产生在蛇身上 if(food.x=snake.xm&food.y=snake.ym) food.x=(rand()%65+15)*10; food.y=(rand()%35+5)*10; Rectangle(hdc,food.x,food.y,food.x+10,food.y+10); food.yes=0;if(food.yes=0) if(snake.x0=food.x&snake.y0=food.y) snake.node+; sprintf(score,%d,snake.node-1); SetTextColor(hdc,RGB(255,0,255); TextOut(hdc,900,200,score,strlen(score); /输出分数 food.yes=1; PlaySound(attack.wav,NULL,SND_FILENAME|SND_ASYNC); /吃到食物后发出声音3.5游戏结束函数void Gameover(HDC hdc)在游戏结束函数中,实现游戏结束后的任务。在游戏结束后,画出一个矩形边框,出现GameOver,并产生音乐。void Gameover(HDC hdc) /游戏结束 HBRUSH hBru; HPEN hPen; hPen=CreatePen(1,4,RGB(255,0,0); SelectObject(hdc,hPen); hBru=CreateSolidBrush(RGB(255,255,255); SelectObject(hdc,hBru); Rectangle(hdc,100,40,820,420); LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)switch (message)case WM_INITDIALOG:return TRUE;case WM_COMMAND:if (LOWORD(wParam) = IDOK | LOWORD(wParam) = IDCANCEL) EndDialog(hDlg, LOWORD(wParam);return TRUE;break; return FALSE;3.6 Mesage handler for about box.LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;TCHAR szHelloMAX_LOADSTRING;LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);switch (message) case WM_COMMAND:wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); / Parse the menu selections:switch (wmId)case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break;case IDM_EXIT: DestroyWindow(hWnd); break;default: return DefWindowProc(hWnd, message, wParam, lParam);break;case WM_KEYDOWN:switch(wParam)case VK_UP:if(snake.direction!=1)snake.direction=3;break; case VK_DOWN: if(snake.direction!=3)snake.direction=1;break; case VK_LEFT:if(snake.direction!=0) snake.direction=2; break; case VK_RIGHT:if(snake.direction!=2)snake.direction=0;break;default:break; break;case WM_TIMER:hdc=GetDC(hWnd);if(snake.life=0) MyPaint(hdc);if(snake.life=1):KillTimer(hWnd,1); /关闭定时器Gameover(hdc);PlaySound(dks.wav,NULL,SND_FILENAME|SND_ASYNC); /游戏结束后产生一段音乐SetTextColor(hdc,RGB(255,0,255);TextOut(hdc,400,200,Game Over,strlen(Game Over);break; case WM_PAINT:hdc = BeginPaint(hWnd, &ps);/ TODO: Add any drawing code here.RECT rt;GetClientRect(hWnd, &rt);DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam); return 0;3.7定时器函数void MyPaint(HDC hdc)void MyPaint(HDC hdc) /定时器每过一段时间就执行的部分 if(snake.direction=0) change(hdc); snake.x0=snake.x0+10;for(int j=0;jsnake.node;j+) Rectangle(hdc,snake.xj,snake.yj,snake.xj+10,snake.yj+10); if(snake.direction=1) change(hdc); snake.y0=snake.y0+10; for(int j=0;jsnake.node;j+) Rectangle(hdc,snake.xj,snake.yj,snake.xj+10,snake.yj+10); if(snake.direction=2) change(hdc); snake.x0=snake.x0-10; for(int j=0;jsnake.node;j+) Rectangle(hdc,snake.xj,snake.yj,snake.xj+10,snake.yj+10); if(snake.direction=3) change(hdc);snake.y0=snake.y0-10; for(int j=0;jsnake.node;j+) Rectangle(hdc,snake.xj,snake.yj,snake.xj+10,snake.yj+10); GamePlay(hdc); if(snake.x0=800) /如果蛇出界,则游戏结束 snake.life=1; if(snake.y0=400) /如果蛇出界,则游戏结束 snake.life=1; for(int k=1;ksnake.node;k+)/如果蛇头碰到自己的身体,则游戏结束 if(snake.x0=snake.xk&snake.y0=snake.yk) snake.life=1;4. 系统调试可以按照程序运行的错误提示对原程序进行修改,在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新乡职业技术学院《分子细胞生物学专论》2023-2024学年第二学期期末试卷
- 浙江横店影视职业学院《流体输配管网课程设计》2023-2024学年第一学期期末试卷
- 浙江省慈溪市六校2024-2025学年高中毕业班联考生物试题含解析
- 湖南省长沙市天心区长郡中学2024-2025学年高三3月月考生物试题理试卷含解析
- 山西省晋南地区达标名校2025届初三调研试题(一)生物试题含解析
- 浙江省金华市义乌市2025届高三下学期第十二次重点考试历史试题含解析
- 新疆新源县2025年高中毕业生五月供题训练(二)化学试题含解析
- 星海音乐学院《合成生物技术》2023-2024学年第二学期期末试卷
- 山东省济宁地区(SWZ)重点中学2025年初三下学期第八次模拟考试物理试题试卷含解析
- 江苏省南京玄武区十三中学集团科利华2024-2025学年初三考前全真模拟密卷数学试题试卷(6)含解析
- 2023届高考作文模拟写作:“成器”和“不器”导写及范文
- GB/T 8237-2005纤维增强塑料用液体不饱和聚酯树脂
- GB/T 14713-2009旋切机通用技术条件
- 低成本自动化的开展与案例课件
- 不予受理反诉民事上诉状(标准版)
- 高中英语语法之虚拟语气(课件3份)
- 粤教版2022年小学六年级科学下册期中测试试卷及答案2022-2023
- 北师大六年级下册数学第三单元《图形的运动》教学设计
- 国际石油合作主要合同模式课件
- 桥梁加固改造工程施工质量管理体系与措施
- 第二十六章慢性肾小球肾炎演示文稿
评论
0/150
提交评论