“贪吃蛇”游戏程序代码.doc_第1页
“贪吃蛇”游戏程序代码.doc_第2页
“贪吃蛇”游戏程序代码.doc_第3页
“贪吃蛇”游戏程序代码.doc_第4页
“贪吃蛇”游戏程序代码.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

“贪吃蛇”游戏程序代码 我个人是比较喜欢玩游戏的,所以学习编程二年多了,很想做个游戏程序,由于能力有限,一直没能做好,后来突然看同学在手机上玩“贪吃蛇”,故想做出 来,其一是因为此游戏界面容易设计,算法也比较简单,今天我就把我程序的代码和算法介绍一下,顺便把程序界面皮肤设计说一下. 程序中一个关于游戏信息的类如下,由于类的说明在程序中写的很清楚了,就不再多解释了:#include time.h /方向定义 const CPoint UP(CPoint(0,-1); const CPoint DOWN(CPoint(0,1); const CPoint LEFT(CPoint(-1,0); const CPoint RIGHT(CPoint(1,0); /速度快慢定义 const int HIGH = 75; const int NORMAL = 180; const int SLOW = 300; const int MAX = 80; /表示转向数 const int LENGTH = 10; class GameMsg public: GameMsg(void) : m_icon(0) InitGame(); void InitGame(int up = VK_UP, int down = VK_DOWN, int left = VK_LEFT, int right = VK_RIGHT) srand(unsigned)time(NULL); m_gameSpeed = NORMAL; m_speedNum = 2; m_snakeNum = 4; for(int i=0; im_snakeNum; +i) m_snakePointi = CPoint(5+LENGTH*2*5+LENGTH,LENGTH*2*(i+5); m_run = true; m_direction = RIGHT; turnUP = up; turnDOWN = down; turnLEFT = left; turnRIGHT = right; public: int m_gameSpeed;/游戏速度 int m_speedNum;/游戏速度数 CPoint m_foodPoint; /食物定义 bool m_run;/游戏状态,运得态还是暂停(结束)态 CPoint m_snakePointMAX; /蛇身定义 CPoint m_direction;/蛇运动方向 int m_snakeNum; /蛇身结点数 int m_icon;/用来设定食物是那种图标的 int turnUP;/用来表示玩家“上”键设的键int turnDOWN;/用来表示玩家“下”键设的键int turnLEFT;/用来表示玩家“左”键设的键int turnRIGHT;/用来表示玩家“右”键设的键 int m_num;/用来记录所选水果的编号 ; 再让读者看一下程序主干类的设计,其中以下只列出由我们自己添加的一些变量的说明,其他的是由程序向导自动生成的,我就不说了: public: afx_msg void OnTimer(UINT_PTR nIDEvent);/程序中运行函数,即是一个定时器,时间就是上面类中的m_gameSpeed来控制的CStatic *m_staticArray;/这是一个蛇定义,是用来显示蛇的,上面只告诉蛇身结点的中心点位置坐标,然后在此中心画一个控件就类似于蛇身了 afx_msg void OnClose();/结束,主要是在其中销毁定时器的 void GameOver(void);/游戏结束函数 afx_msg void OnRButtonDown(UINT nFlags, CPoint point);/当点击鼠标右键出现菜单afx_msg void OnNewGame();/菜单选项,新游戏afx_msg void OnPauseOrStart();/菜单选项,暂停/开始 游戏afx_msg void OnUpdateQuick(CCmdUI *pCmdUI);/这3个函数本来是来标记速度的,和上面类中的m_speedNum对应,但是没有标记成功 afx_msg void OnUpdateNormal(CCmdUI *pCmdUI); afx_msg void OnUpdateSlow(CCmdUI *pCmdUI); afx_msg void OnNormal();/菜单选项,设定为普通速度afx_msg void OnSlow();/菜单选项,设定为慢速度afx_msg void OnQuick();/菜单选项,设定为快速度afx_msg void OnIntroduce();/游戏介绍,就是弹出一个对话框而以 afx_msg void OnMoreprogram();/进入我的博客的函数 afx_msg void OnAbout();/关于“贪吃蛇”说明的对话框 afx_msg void OnExit();/退出游戏 CFont m_font;/这就是上图中显示“空心字体”的字体设置void ShowHollowFont(int cx, int cy, CString str);/显示空心字体函数,在(Cx,Cy)处显示字符串str afx_msg void OnBnClickedExit();/退出游戏 private: int m_icon1;/表明蛇吃第1种水果的个数 int m_icon2;/表明蛇吃第2种水果的个数 int m_icon3;/表明蛇吃第3种水果的个数然后给读者写的是我程序运行很重要的一个函数,WM_TIMER显示函数,里面有食物位置随机出现,判断蛇死,蛇移动等: void CSnakeDlg:OnTimer(UINT_PTR nIDEvent) if(game.m_snakePoint0.x 0 | game.m_snakePoint0.y 700 | game.m_snakePoint0.y 500)/当蛇跑出边界,游戏结束 GameOver(); for(int j=game.m_snakeNum-1; j0; -j)/蛇移动的量的变化,当重新设定这些控件的位置时也就是让蛇移动起来game.m_snakePointj = game.m_snakePointj-1; game.m_snakePoint0.x += game.m_direction.x * LENGTH * 2;/蛇头移动game.m_snakePoint0.y += game.m_direction.y * LENGTH * 2; for(int i=0; igame.m_snakeNum; +i) m_staticArrayi.SetWindowPos( NULL, game.m_snakePointi.x - LENGTH, game.m_snakePointi.y - LENGTH, game.m_snakePointi.x + LENGTH, game.m_snakePointi.y + LENGTH, SW_SHOW); for(int j=1; jLoadIcon(game.m_icon); m_staticArrayMAX.SetWindowPos( NULL, game.m_foodPoint.x, game.m_foodPoint.y, 32, 32, SW_SHOW); /当蛇吃到水果 if(game.m_snakePoint0.x game.m_foodPoint.x-LENGTH & game.m_snakePoint0.y game.m_foodPoint.y-LENGTH) game.m_foodPoint = CPoint(LENGTH*game.RandNum(2,37), LENGTH*game.RandNum(2,27); CString str; if(game.m_num = 0) +m_icon1; str.Format(%d,m_icon1); GetDlgItem(IDC_EDIT1)-SetWindowTextA(str); else if(game.m_num = 1) +m_icon2; str.Format(%d,m_icon2); GetDlgItem(IDC_EDIT2)-SetWindowTextA(str); else +m_icon3; str.Format(%d,m_icon3); GetDlgItem(IDC_EDIT3)-SetWindowTextA(str); game.m_num = game.RandNum(0,3); game.m_icon = IDI_ICON1 + game.m_num;/重新加1个水果game.m_snakeNum+;/蛇的长度加1 str.Format(%d,game.m_snakeNum); GetDlgItem(IDC_EDIT4)-SetWindowTextA(str); CDialog:OnTimer(nIDEvent); 如下再介绍应用在对话框中来响应键盘消息,我写的是一个键盘“钩子”,代码如下: HHOOK g_hKeyboard = NULL; HWND g_hWnd = NULL; LRESULT CALLBACK KeyboardProc( int code, / hook code WPARAM wParam, / virtual-key code LPARAM lParam / keystroke-message information ) if(wParam = game.turnUP) if(game.m_direction.y = 0) game.m_direction = UP; else if(wParam = game.turnDOWN) if(game.m_direction.y = 0) game.m_direction = DOWN; else if(wParam = game.turnLEFT) if(game.m_direction.x = 0) game.m_direction = LEFT; else if(wParam = game.turnRIGHT) if(game.m_direction.x = 0) game.m_direction = RIGHT; else ; return 1; 然后介绍一下,点击鼠标右键出现菜单:void CSnakeDlg:OnRButtonDown(UINT nFlags, CPoint point) if(game.m_run) KillTimer(1); CMenu oMenu; if (oMenu.LoadMenu(IDR_MENU1) CMenu* pPopup = oMenu.GetSubMenu(0); ASSERT(pPopup != NULL); CPoint oPoint; GetCursorPos(&oPoint); SetForegroundWindow(); pPopup-TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,this); if(game.m_run) SetTimer(1,game.m_gameSpeed,NULL); CDialog:OnRButtonDown(nFlags, point); 然后来介绍一下程序中是怎样来改变按键的,首先说一下,我开始用EDIT控件来让用户输入,但是程序中我用的是键盘“钩子”来处理消息的,所以 EDIT控件在程序中是不可以输入信息的,所以我选的是下拉列表,代码如下,解释也在程序中相应给出:int keyNum40 = /定义玩家可以设的键,把所有的键信息存在这个数组中VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT, A,B,C,D,E,F,G,H, I,J,K,L,M,N,O,P, Q,R,S,T,U,V,W,X, Y,Z, VK_NUMPAD0,VK_NUMPAD1,VK_NUMPAD2, VK_NUMPAD3,VK_NUMPAD4,VK_NUMPAD5, VK_NUMPAD6,VK_NUMPAD7,VK_NUMPAD8, VK_NUMPAD9; void CSnakeDlg:OnKeyset()/键盘设置响应消息函数 / TODO:在此添加命令处理程序代码 if(game.m_run) KillTimer(1); CKeySetDlg dlg; if(dlg.DoModal() = IDOK) if(dlg.m_up = dlg.m_down | dlg.m_up = dlg.m_left | dlg.m_up = dlg.m_right | dlg.m_down = dlg.m_left | dlg.m_down = dlg.m_right | dlg.m_left = dlg.m_right) MessageBox(键位不能设置为重复的,设置失败!); if(game.m_run) SetTimer(1,game.m_gameSpeed,NULL); return; game.turnUP = keyNumGetMarkNum(dlg.m_up);/重新设置键game.turnDOWN = keyNumGetMarkNum(dlg.m_down); game.turnLEFT = keyNumGetMarkNum(dlg.m_left); game.turnRIGHT = keyNumGetMarkNum(dlg.m_right); if(game.m_run) SetTimer(1,game.m_gameSpeed,NULL); int CSnakeDlg:GetMarkNum(CString str)/返回重新设置键对应数组的“索引” int backNum = 0; if(str = 上) backNum = 0; else if(str = 下) backNum = 1; else if(str = 左) backNum = 2; else if(str = 右) backNum = 3; else CString ss; for(char i=A; i=Z; +i) ss.Format(%c,i); if(ss = str.Right(1) backNum = i - A + 4; return backNum; for(int i=0; i=9; +i) ss.Forma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论