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

下载本文档

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

文档简介

“贪吃蛇”游戏程序代码我个人是比较喜欢玩游戏的,所以学习编程二年多了,很想做个游戏程序,由于能力有限,一直没能做好,后来突然看同学在手机上玩“贪吃蛇”,故想做出来,其一是因为此游戏界面容易设计,算法也比较简单,今天我就把我程序的代码和算法介绍一下,顺便把程序界面皮肤设计说一下......

程序中一个关于游戏信息的类如下,由于类的说明在程序中写的很清楚了,就不再多解释了:#include"time.h"

//方向定义

constCPointUP(CPoint(0,-1));

constCPointDOWN(CPoint(0,1));

constCPointLEFT(CPoint(-1,0));

constCPointRIGHT(CPoint(1,0));

//速度快慢定义

constintHIGH=75;

constintNORMAL=180;

constintSLOW=300;

constintMAX=80;//表示转向数

constintLENGTH=10;

classGameMsg

{

public:

GameMsg(void)

:m_icon(0)

{

InitGame();

}

voidInitGame(intup=VK_UP,intdown=VK_DOWN,intleft=VK_LEFT,intright=VK_RIGHT)

{

srand((unsigned)time(NULL));

m_gameSpeed=NORMAL;

m_speedNum=2;

m_snakeNum=4;

for(inti=0;i<m_snakeNum;++i)

m_snakePoint[i]=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:

intm_gameSpeed;//游戏速度

intm_speedNum;//游戏速度数

CPointm_foodPoint;//食物定义

boolm_run;//游戏状态,运得态还是暂停(结束)态

CPointm_snakePoint[MAX];//蛇身定义

CPointm_direction;//蛇运动方向

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].y<LENGTH||game.m_snakePoint[0].x>700||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<game.m_snakeNum;++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<game.m_snakeNum;++j)//当蛇撞到自己也结束游戏if(game.m_snakePoint[0]==game.m_snakePoint[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].x<game.m_foodPoint.x+20+LENGTH&&game.m_snakePoint[0].x>game.m_foodPoint.x-LENGTH&&game.m_snakePoint[0].y<game.m_foodPoint.y+20+LENGTH&&game.m_snakePoint[0].y>game.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)//返回重新设置键对应数组的“索引”

{

intbackNum=0;

if(str=="上")

backNum=0;

elseif(str=="下")

backNum=1;

elseif(str=="左")

backNum=2;

elseif(str=="右")

backNum=3;

else

{

CStringss;

for(chari='A';i<='Z';++i)

{

ss.Format("%c",i);

if(ss==str.Right(1))

{

backNum=i-'A'+4;

returnbackNum;

}

}

for(inti=0;i<=9;++i)

{

ss.Format("%d",i);

if(ss==str.Right(1))

{

backNum=i+30;

returnbackNum;

温馨提示

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

评论

0/150

提交评论