贪吃蛇游戏程序代码.docx
《贪吃蛇游戏程序代码.docx》由会员分享,可在线阅读,更多相关《贪吃蛇游戏程序代码.docx(10页珍藏版)》请在冰豆网上搜索。
贪吃蛇游戏程序代码
“贪吃蛇”游戏程序代码
afx_msgvoidOnExit();//退出游戏
CFontm_font;//这就是上图中显示“空心字体”的字体设置voidShowHollowFont(intcx,intcy,CStringstr);//显示空心字体函数,在(Cx,Cy)处显示字符串str
afx_msgvoidOnBnClickedExit();//退出游戏
private:
intm_icon1;//表明蛇吃第1种水果的个数
intm_icon2;//表明蛇吃第2种水果的个数
intm_icon3;//表明蛇吃第3种水果的个数
然后给读者写的是我程序运行很重要的一个函数,WM_TIMER显示函数,里面有食物位置随机出现,判断蛇死,蛇移动等:
voidCSnakeDlg:
:
OnTimer(UINT_PTRnIDEvent)
{
if(game.m_snakePoint[0].x<0||game.m_snakePoint[0].y700||game.m_snakePoint[0].y>500)//当蛇跑出边界,游戏结束
GameOver();
}
for(intj=game.m_snakeNum-1;j>0;--j)//蛇移动的量的变化,当重新设定这些控件的位置时也就是让蛇移动起来game.m_snakePoint[j]=game.m_snakePoint[j-1];
game.m_snakePoint[0].x+=game.m_direction.x*LENGTH*2;//蛇头移动game.m_snakePoint[0].y+=game.m_direction.y*LENGTH*2;
for(inti=0;i { m_staticArray[i].SetWindowPos(NULL,game.m_snakePoint[i].x-LENGTH,game.m_snakePoint[i].y-LENGTH,game.m_snakePoint[i].x+LENGTH,game.m_snakePoint[i].y+LENGTH, SW_SHOW); } for(intj=1;j { GameOver(); } m_staticArray[MAX].ModifyStyle(0xF,SS_ICON|SS_CENTERIMAGE);//显示水果m_staticArray[MAX].SetIcon(AfxGetApp()->LoadIcon(game.m_icon)); m_staticArray[MAX].SetWindowPos(NULL,game.m_foodPoint.x,game.m_foodPoint.y,32,32, SW_SHOW); //当蛇吃到水果 if(game.m_snakePoint[0].xgame.m_foodPoint.x-LENGTH&&game.m_snakePoint[0].ygame.m_foodPoint.y-LENGTH) { game.m_foodPoint=CPoint(LENGTH*game.RandNum(2,37),LENGTH*game.RandNum(2,27)); CStringstr; if(game.m_num==0) { ++m_icon1; str.Format("%d",m_icon1); GetDlgItem(IDC_EDIT1)->SetWindowTextA(str); } elseif(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++;//蛇的长度加1str.Format("%d",game.m_snakeNum); GetDlgItem(IDC_EDIT4)->SetWindowTextA(str); } CDialog::OnTimer(nIDEvent); } 如下再介绍应用在对话框中来响应键盘消息,我写的是一个键盘“钩子”,代码如下: HHOOKg_hKeyboard=NULL; HWNDg_hWnd=NULL; LRESULTCALLBACKKeyboardProc( intcode, //hookcodeWPARAMwParam,//virtual-keycode LPARAMlParam//keystroke-messageinformation ) { if(wParam==game.turnUP) { if(game.m_direction.y==0)game.m_direction=UP; } elseif(wParam==game.turnDOWN) { if(game.m_direction.y==0)game.m_direction=DOWN; } elseif(wParam==game.turnLEFT) { if(game.m_direction.x==0)game.m_direction=LEFT; } elseif(wParam==game.turnRIGHT) { if(game.m_direction.x==0)game.m_direction=RIGHT; } else ; return1; } 然后介绍一下,点击鼠标右键出现菜单:voidCSnakeDlg::OnRButtonDown(UINTnFlags,CPointpoint) { if(game.m_run) KillTimer(1); CMenuoMenu; if(oMenu.LoadMenu(IDR_MENU1)) { CMenu*pPopup=oMenu.GetSubMenu(0); ASSERT(pPopup!=NULL); CPointoPoint; 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控件在程序中是不可以输入信息的,所以我选的是下拉列表,代码如下,解释也在程序中相应给出:intkeyNum[40]={//定义玩家可以设的键,把所有的键信息存在这个数组中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}; voidCSnakeDlg::OnKeyset()//键盘设置响应消息函数 { //TODO:在此添加命令处理程序代码 if(game.m_run) KillTimer(1); CKeySetDlgdlg; 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=keyNum[GetMarkNum(dlg.m_up)];//重新设置键game.turnDOWN=keyNum[GetMarkNum(dlg.m_down)]; game.turnLEFT=keyNum[GetMarkNum(dlg.m_left)]; game.turnRIGHT=keyNum[GetMarkNum(dlg.m_right)]; } if(game.m_run)SetTimer(1,game.m_gameSpeed,NULL); } intCSnakeDlg::GetMarkNum(CStringstr)//返回重新设置键对应数组的“索引” { intbackNu
m_staticArray[i].SetWindowPos(NULL,game.m_snakePoint[i].x-LENGTH,game.m_snakePoint[i].y-LENGTH,game.m_snakePoint[i].x+LENGTH,game.m_snakePoint[i].y+LENGTH,
SW_SHOW);
for(intj=1;j { GameOver(); } m_staticArray[MAX].ModifyStyle(0xF,SS_ICON|SS_CENTERIMAGE);//显示水果m_staticArray[MAX].SetIcon(AfxGetApp()->LoadIcon(game.m_icon)); m_staticArray[MAX].SetWindowPos(NULL,game.m_foodPoint.x,game.m_foodPoint.y,32,32, SW_SHOW); //当蛇吃到水果 if(game.m_snakePoint[0].xgame.m_foodPoint.x-LENGTH&&game.m_snakePoint[0].ygame.m_foodPoint.y-LENGTH) { game.m_foodPoint=CPoint(LENGTH*game.RandNum(2,37),LENGTH*game.RandNum(2,27)); CStringstr; if(game.m_num==0) { ++m_icon1; str.Format("%d",m_icon1); GetDlgItem(IDC_EDIT1)->SetWindowTextA(str); } elseif(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++;//蛇的长度加1str.Format("%d",game.m_snakeNum); GetDlgItem(IDC_EDIT4)->SetWindowTextA(str); } CDialog::OnTimer(nIDEvent); } 如下再介绍应用在对话框中来响应键盘消息,我写的是一个键盘“钩子”,代码如下: HHOOKg_hKeyboard=NULL; HWNDg_hWnd=NULL; LRESULTCALLBACKKeyboardProc( intcode, //hookcodeWPARAMwParam,//virtual-keycode LPARAMlParam//keystroke-messageinformation ) { if(wParam==game.turnUP) { if(game.m_direction.y==0)game.m_direction=UP; } elseif(wParam==game.turnDOWN) { if(game.m_direction.y==0)game.m_direction=DOWN; } elseif(wParam==game.turnLEFT) { if(game.m_direction.x==0)game.m_direction=LEFT; } elseif(wParam==game.turnRIGHT) { if(game.m_direction.x==0)game.m_direction=RIGHT; } else ; return1; } 然后介绍一下,点击鼠标右键出现菜单:voidCSnakeDlg::OnRButtonDown(UINTnFlags,CPointpoint) { if(game.m_run) KillTimer(1); CMenuoMenu; if(oMenu.LoadMenu(IDR_MENU1)) { CMenu*pPopup=oMenu.GetSubMenu(0); ASSERT(pPopup!=NULL); CPointoPoint; 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控件在程序中是不可以输入信息的,所以我选的是下拉列表,代码如下,解释也在程序中相应给出:intkeyNum[40]={//定义玩家可以设的键,把所有的键信息存在这个数组中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}; voidCSnakeDlg::OnKeyset()//键盘设置响应消息函数 { //TODO:在此添加命令处理程序代码 if(game.m_run) KillTimer(1); CKeySetDlgdlg; 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=keyNum[GetMarkNum(dlg.m_up)];//重新设置键game.turnDOWN=keyNum[GetMarkNum(dlg.m_down)]; game.turnLEFT=keyNum[GetMarkNum(dlg.m_left)]; game.turnRIGHT=keyNum[GetMarkNum(dlg.m_right)]; } if(game.m_run)SetTimer(1,game.m_gameSpeed,NULL); } intCSnakeDlg::GetMarkNum(CStringstr)//返回重新设置键对应数组的“索引” { intbackNu
m_staticArray[MAX].ModifyStyle(0xF,SS_ICON|SS_CENTERIMAGE);//显示水果m_staticArray[MAX].SetIcon(AfxGetApp()->LoadIcon(game.m_icon));
m_staticArray[MAX].SetWindowPos(NULL,game.m_foodPoint.x,game.m_foodPoint.y,32,32,
//当蛇吃到水果
if(game.m_snakePoint[0].xgame.m_foodPoint.x-LENGTH&&game.m_snakePoint[0].ygame.m_foodPoint.y-LENGTH)
game.m_foodPoint=CPoint(LENGTH*game.RandNum(2,37),LENGTH*game.RandNum(2,27));
CStringstr;
if(game.m_num==0)
++m_icon1;
str.Format("%d",m_icon1);
GetDlgItem(IDC_EDIT1)->SetWindowTextA(str);
elseif(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++;//蛇的长度加1str.Format("%d",game.m_snakeNum);
GetDlgItem(IDC_EDIT4)->SetWindowTextA(str);
CDialog:
OnTimer(nIDEvent);
如下再介绍应用在对话框中来响应键盘消息,我写的是一个键盘“钩子”,代码如下:
HHOOKg_hKeyboard=NULL;
HWNDg_hWnd=NULL;
LRESULTCALLBACKKeyboardProc(
intcode, //hookcodeWPARAMwParam,//virtual-keycode
LPARAMlParam//keystroke-messageinformation
)
if(wParam==game.turnUP)
if(game.m_direction.y==0)game.m_direction=UP;
elseif(wParam==game.turnDOWN)
if(game.m_direction.y==0)game.m_direction=DOWN;
elseif(wParam==game.turnLEFT)
if(game.m_direction.x==0)game.m_direction=LEFT;
elseif(wParam==game.turnRIGHT)
if(game.m_direction.x==0)game.m_direction=RIGHT;
;
return1;
然后介绍一下,点击鼠标右键出现菜单:
OnRButtonDown(UINTnFlags,CPointpoint)
if(game.m_run)
KillTimer
(1);
CMenuoMenu;
if(oMenu.LoadMenu(IDR_MENU1))
CMenu*pPopup=oMenu.GetSubMenu(0);
ASSERT(pPopup!
=NULL);
CPointoPoint;
GetCursorPos(&oPoint);
SetForegroundWindow();
pPopup->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,this);
if(game.m_run)SetTimer(1,game.m_gameSpeed,NULL);
OnRButtonDown(nFlags,point);
然后来介绍一下程序中是怎样来改变按键的,首先说一下,我开始用EDIT控件来让用户输入,但是程序中我用的是键盘“钩子”来处理消息的,所以EDIT控件在程序中是不可以输入信息的,所以我选的是下拉列表,代码如下,解释也在程序中相应给出:
intkeyNum[40]={//定义玩家可以设的键,把所有的键信息存在这个数组中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};
OnKeyset()//键盘设置响应消息函数
//TODO:
在此添加命令处理程序代码
CKeySetDlgdlg;
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("键位不能设置为重复的,设置失败!
");
return;
game.turnUP=keyNum[GetMarkNum(dlg.m_up)];//重新设置键game.turnDOWN=keyNum[GetMarkNum(dlg.m_down)];
game.turnLEFT=keyNum[GetMarkNum(dlg.m_left)];
game.turnRIGHT=keyNum[GetMarkNum(dlg.m_right)];
intCSnakeDlg:
GetMarkNum(CStringstr)//返回重新设置键对应数组的“索引”
intbackNu
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1