版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、包罗万象网一用Java编写的贪吃蛇代码下面是我用java编写的一个贪吃蛇游戏源代码我个人是比较喜欢玩游戏的,所以学习编程二年多了,很想做个游戏程序,由于能力有限,一直没能做好,后来突然看同学在手机上玩“贪吃蛇”,故想做出来,其一是因为此游戏界面容易设计,算法也比较简单,今天我就把我程序的代码和算法介绍一下,顺便把程序界面皮肤设计说一下程序中一个关于游戏信息的类如下,由于类的说明在程序中写的很清楚了,就不再多解释了: #include "time.h"/方向定义const CPoint UP(CPoint(0,-1);con st CPoi nt DOWN(CPoi nt(0
2、,1);con st CPoi nt LEFT(CPoi nt(-1,0);con st CPoi nt RIGHT(CPoi nt(1,0);/速度快慢定义con st i nt HIGH = 75;con st i nt NORMAL = 180;con st int SLOW = 300;const int MAX = 80; / 表示转向数con st i nt LENGTH = 10;class GameMsgpublic:GameMsg(void):m_ic on(0)In itGame();void InitGame(int up = VK_UR int down = VK_DO
3、WN, int left = VK_LEFT,int right =VK_RIGHT)sran d( un sig ned)time(NULL);m_gameSpeed = NORMAL;m_speedNum = 2;m_sn akeNum = 4;for(i nt i=0; i<m_s nakeNum; +i)m_sn akePoi nti = CPoi nt(5+LENGTH*2*5+LENGT H, LENGTH*2*(i+5);m_ru n = true;m_direction = RIGHT;turnUP = up;turnDOWN = dow n;turnLEFT = lef
4、t;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 turnL
5、EFT;/用来表示玩家“左”键设的键 int turnRIGHT;/用来表示玩家“右”键设的键int m_num;用来记录所选水果的编号;再让读者看一下程序主干类的设计,其中以下只列出由我们自己添加的一些变量的说 明,其他的是由程序向导自动生成的,我就不说了:public:afx_msg void On Timer(UINT_PTR nIDEve nt);程序中运行函数,即是一个定时器,时间就 是上面类中的 m_gameSpeed来控制的 CStatic *m_staticArray;这是一个蛇定义,是用来显示 蛇的,上面只告诉蛇身结点的中心点位置坐标,然后在此中心画一个控件就类似于蛇身了af
6、x_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对应,但是没有标记成功a
7、fx_msg void OnU pdateNormal(CCmdUI *pCmdUI);afx_msg void OnU pdateSlow(CCmdUI *pCmdUI);afx_msg void OnNormal(); 菜单选项,设定为普通速度 afx_msg void OnSlow();/ 菜单选 项,设定为慢速度afx_msg void OnQuick();/菜单选项,设定为快速度afx_msg voidOnlntroduce();/游戏介绍,就是弹出一个对话框而以afx_msg void OnMoreprogram(); 进入我的博客的函数包罗万象网一afx_msg void OnA
8、bout();关于"贪吃蛇”说明的对话框afx_msg void OnExit();/ 退出游戏CFont m_font;/这就是上图中显示"空心字体”的字体设置void ShowHollowFont(int cx,int cy, CString str);/显示空心字体函数,在( Cx, Cy)处显示字符串 strafx_msg void OnBn ClickedExit(); 退出游戏private:int mcon1;表明蛇吃第1种水果的个数int m_icon2;表明蛇吃第2种水果的个数int m_icon3;表明蛇吃第3种水果的个数然后给读者写的是我程序运行很重要
9、的一个函数,WM_TIMER显示函数,里面有食物位置随机出现,判断蛇死,蛇移动等:void CSn akeDlg:O nTimer(UINT_PTR nIDEve nt)if(game.m_s nakePoi ntO.x<0|game.m_s nakePoi ntO.y< LENGTH |game.m_snakePointO.x > 700 | game.m_snakePointO.y > 500)/ 当蛇跑出边界,游戏结束GameOver();for(int j=game.m_snakeNum-1; j>0; -j)/蛇移动的量的变化,当重新设定这些控件的位置
10、时也就是让蛇移动起来game.m_s nakePo in tj = game.m_s nakePoi ntj-1;game.m_snakePoint0.x += game.m_direction.x* LENGTH * 2;/ 蛇头移动game.m_s nakePo in t0.y += game.m_directi on.y * LENGTH * 2;for(i nt i=0; i<game.m_s nakeNum; +i)包罗万象网一m_staticArrayi.SetWi ndowPos( NULL,game.m_s nakePoi nti.x- LENGTH,game.m_s n
11、akePo in ti.y - LENGTH, game.m_s nakePo in ti.x + LENGTH, game.m_s nakePo in ti.y + LENGTH,SW_SHOW);for(int j=1; j<game.m_snakeNum; +j) 当蛇撞到自己也结束游戏if(game.m_snakePointO=game.m_s nakePoi ntj)GameOver();m_staticArrayMAX.ModifyStyle(OxF,SS_ICON |SS_CENTERIMAGE); 显示水果m_staticArrayMAX.Setlco n( AfxGet
12、App()->LoadIco n(game.mcon);m_staticArrayMAX.SetWindowPos( NULL, game.m_foodPoint.x, game.m_foodPoint.y, 32, 32,SW_SHOW);/当蛇吃到水果if(game.m_s nakePoi ntO.x<game.m_foodPoi nt.x+20+LENGTH&&game.m_s nakePo in t0.x> game.m_foodPo in t.x-LENGTH && game.m_s nakePo in t0.y<game.m_
13、foodPoi nt.y+20+LENGTH && game.m_s nakePoi ntO.y > game.m_foodPoi nt.y-LENGTH)game.m_foodPoi nt=CPoi nt(LENGTH*game.Ra ndNum(2,37),LENGTH*game.Ra ndNum(2,27);CStri ng str;if(game.m _num = 0)+m_ic on1;包罗万象网一str.Format("%d",mcon 1);GetDlgltem(IDC_EDIT1)->SetWi ndowTextA(str);el
14、se if(game.m _num = 1)+m_ic on2;str.Format("%d",mcon 2);GetDlgltem(IDC_EDIT2)->SetWi ndowTextA(str);else+m_ic on3;str.Format("%d",mcon 3);GetDlgltem(IDC_EDIT3)->SetWi ndowTextA(str);game.m _num = game.Ra ndNum(0,3);game.mcon = IDI_ICON1 + game.m_num; 重新加 1 个水果 game.m_snakeN
15、um+; 蛇的 长度加 1 str.Format("%d",game.m_s nakeNum);GetDlgltem(IDC_EDIT4)->SetWi ndowTextA(str);CDialog:O nTimer( nIDEve nt);,代码如下:如下再介绍应用在对话框中来响应键盘消息,我写的是一个键盘“钩子”包罗万象网一HH00K g_hKeyboard = NULL;HWND g_hWnd = NULL;LRESULT CALLBACK KeyboardProc(int code,/ hook code WPARAM wParam, / virtual-ke
16、y codeLPARAM lParam / keystroke-message in formatio n)if(wParam = game.tur nUP)if(game.m_directi on.y = 0) game.m_directi on = UP;else if(wParam = game.tur nDOWN)if(game.m_directi on.y = 0) game.m_directi on = DOWN;else if(wParam = game.turn LEFT)if(game.m_directi on.x = 0) game.m_directi on = LEFT;
17、else if(wParam = game.turnRIGHT)if(game.m_directio n.x = 0) game.m_directi on = RIGHT;包罗万象网一 elsereturn 1;然后介绍一下,点击鼠标右键出现菜单:void CSnakeDlg:OnRButtonDown(UINT nFlags,CPoi nt poi nt)if(game.m_ru n)KillTimer(1);CMe nu oMenu;if (oMe nu.LoadMe nu(IDR_MENU1)CMe nu* pPopup = oMe nu.GetSubMe nu(O);ASSERT(pP
18、opup != NULL);CPoi nt oPoi nt;GetCursorPos(&oPoi nt);SetForegro undWin dow();pPopup->TrackPopupMe nu(TPM_LEFTALIGN,oPoi nt.x,oPoi nt.y,this);if(game.m_run) SetTimer(1,game.m_gameSpeed,NULL);CDialog:O nRButto nDow n(n Flags, poi nt);然后来介绍一下程序中是怎样来改变按键的,首先说一下,我开始用EDIT控件来让用户输入,但是程序中我用的是键盘“钩子”来处理
19、消息的,所以EDIT控件在程序中是不可以输入信息的,所以我选的是下拉列表,代码如下,解释也在程序中相应给出:int keyNum40=/定义玩家可以设的键,把所有的键信息存在这个数组中 VK_URVK_DOWN,VK_LEFT,VK_RIGHT, 'A','B',C,'D','E','F','G','H', T,'J','K','L','M','N','0','P', Q,
20、'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 CSn akeDlg:O nKeyset()键盘设置响应消息函数/ TODO:在此添加命令处理程序代码if(game.m_ru n)KillTimer(1);CKeySetDlg dlg;if(dlg.
21、DoModal() = IDOK)if(dlg.m_up = dlg.m_down | dlg.m_up = dlg.m_left | dlg.m_up = dlg.m_right | dlg.m_dow n = dlg.m_left | dlg.m_dow n = dlg.m_right | dlg. meft = dlg.m_right)MessageBox("键位不能设置为重复的,设置失败!");if(game.m_run) SetTimer(1,game.m_gameSpeed,NULL);return;game.turnUP = keyNumGetMarkNum(
22、dlg.m_up); 重新设置键 game.turnDOWN = keyNumGetMarkNum(dlg.m_dow n);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;elseCStri ng ss;for(char i='A' i<='Z' +i)ss.Format("%c",i);if(ss = str.Right(1)backNum = i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 我错了记叙文
- 个人主管述职报告范文集锦十篇
- 小区物业委托管理协议(34篇)
- 花园小区物业管理投标书
- 借款合同范本(2篇)
- 工业用地租赁协议
- 场地设备租用协议书
- 2025年运载火箭控制系统仿真实时处理系统项目建议书
- 八年级语文上册第四单元16散文二篇教案新人教版1
- 2025年聚甲醛、聚甲醛合金及改性材料项目建议书
- 获奖一等奖QC课题PPT课件
- 企业中高层人员安全管理培训--责任、案例、管理重点
- 人教版小学三年级数学上册判断题(共3页)
- 国际项目管理手册The Project Manager’s Manual
- 小学五年级思政课教案三篇
- 高强螺栓施工记录
- 一亿以内的质数表(一)
- 华为内部虚拟股管理暂行条例
- 大剧院建设项目设计投资造价估算
- (完整版)倒插、翻口、评点文件
- 病理生理学缺氧
评论
0/150
提交评论