很好玩的贪吃蛇.docx
《很好玩的贪吃蛇.docx》由会员分享,可在线阅读,更多相关《很好玩的贪吃蛇.docx(24页珍藏版)》请在冰豆网上搜索。
很好玩的贪吃蛇
C++课程实训
系别:
软件学院
班级:
软工一班姓名:
赵波
//贪吃蛇Dlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"贪吃蛇.h"
#include"贪吃蛇Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
//定义全局变量的结构体
structsnakeabout//其他相关参数
{
intx,y;//食物坐标
boolisabt;//食物是否显示,1为不显示食物,0为显示食物
intspend;//等级记录1为初级,2为中级,3为高级
intlen;//蛇的长度初始为3节,最长为49节
intstatus;//游戏状态1为未开始,2为运行,3为暂停
intmode;//游戏类型记录1为空地,2为方盒,3为格子
intclor;//颜色选择1为灰色,2为白色,3为橙色
intdirection;//方向1为上,2为下,3为左,4为右
}abt;
structsnakes//蛇身体相关
{
intx,y;//每节蛇的坐标
}Snake[51];//最多51节
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMyDlgdialog
CMyDlg:
:
CMyDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMyDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMyDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
//NOTE:
theClassWizardwilladdDDXandDDVcallshere
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg,CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_COMMAND(IDM_STARY,OnStary)
ON_COMMAND(IDM_PAUSE,OnPause)
ON_COMMAND(IDM_CONTINUE,OnContinue)
ON_COMMAND(IDM_S1,OnS1)
ON_COMMAND(IDM_S2,OnS2)
ON_COMMAND(IDM_S3,OnS3)
ON_COMMAND(IDM_MAX,OnMax)
ON_COMMAND(IDM_EXIT,OnExit)
ON_COMMAND(IDM_AREA,OnArea)
ON_COMMAND(IDM_BOX,OnBox)
ON_COMMAND(IDM_ROOM,OnRoom)
ON_COMMAND(IDM_WHITE,OnWhite)
ON_COMMAND(IDM_GREY,OnGrey)
ON_COMMAND(IDM_ORANGE,OnOrange)
ON_COMMAND(IDM_HELP,OnHelp)
ON_COMMAND(IDM_ABOUT,OnAbout)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMyDlgmessagehandlers
BOOLCMyDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//初始默认值
CMenu*p=GetMenu();//获得菜单窗口
CMenu*pm=p->GetSubMenu(0);//获得第一级菜单下拉ID
pm->EnableMenuItem(IDM_S1,MF_GRAYED);//设置暂停按钮不可用
CMenu*pn=p->GetSubMenu
(1);//获得第一级菜单下拉ID
pn->EnableMenuItem(IDM_AREA,MF_GRAYED);//设置空地按钮不可用
CMenu*ps=p->GetSubMenu
(2);//获得第二级菜单下拉ID
ps->EnableMenuItem(IDM_WHITE,MF_GRAYED);//设置白色按钮不可用
abt.spend=1;//等级为初级
abt.mode=1;//类型为空地
abt.clor=1;//颜色为灰色
abt.direction=3;//设置游戏开始时,蛇向左移动
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCMyDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCMyDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CMenu*p=GetMenu();//获得菜单
CMenu*pm=p->GetSubMenu(0);//获得第一级菜单下拉ID
pm->EnableMenuItem(IDM_PAUSE,MF_GRAYED);//设置暂停按钮不可用
pm->EnableMenuItem(IDM_CONTINUE,MF_GRAYED);//设置继续按钮不可用
pm->ModifyMenu(0,MF_BYPOSITION,IDM_STARY,"开始游戏");//修改菜单《重新开始》文字,变成《开始游戏》文字
GetDlgItem(IDC_STATIC)->SetWindowText("贪吃蛇");//回复静态文本文字显示
Snake[0].x=7;//初始蛇头x坐标
Snake[0].y=7;//初始蛇头y坐标
Snake[1].x=8;//初始蛇身x坐标
Snake[1].y=7;//初始蛇身y坐标
Snake[2].x=9;//初始蛇尾x坐标
Snake[2].y=7;//初始蛇尾y坐标
abt.status=1;//初始化游戏状态(为未开始状态)
abt.len=3;//初始化蛇的长度
abt.isabt=1;//初始化为无食物
if(abt.clor==1)OnWhite();//背景为白色
elseif(abt.clor==2)OnGrey();//背景为灰色
elseOnOrange();//背景为橙色
if(abt.mode==1)OnArea();//空地类型
elseif(abt.mode==2)OnBox();//方盒模式
elseOnRoom();//格子模式
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCMyDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCMyDlg:
:
OnTimer(UINTnIDEvent)//时间轴
{
if(abt.spend==1)SetTimer(1,280,NULL);//选择初级时的速度设置
if(abt.spend==2)SetTimer(1,180,NULL);//选择中级时的速度设置
if(abt.spend==3)SetTimer(1,90,NULL);//选择高级时的速度设置
OnAway();//调用移动行走函数
OnFood();//食物判断函数
OnDelet();//判断结束函数
////////////////////////////////////////////////设置模式显示
CStringxs;
CStringms,jb,gk,clo;
if(abt.spend==1)jb="初级";
elseif(abt.spend==2)jb="中级";
elsejb="高级";
if(abt.mode==1)gk="自由模式:
空地";
elseif(abt.mode==2)gk="自由模式:
方盒";
elseif(abt.mode==3)gk="自由模式:
格子";
elsegk="<战役模式>";
if(abt.clor==1)clo="白色";
elseif(abt.clor==2)clo="灰色";
elseclo="橙色";
xs.Format("游戏状态:
%s%s%s%s",ms,jb,gk,clo);
GetDlgItem(IDC_STATIC)->SetWindowText(xs);//为防止蛇经过时把静态文本线覆盖所增加的设置静态文本框文字刷新,已达到刷新静态文本
////////////////////////////////////////////////设置模式显示
CDialog:
:
OnTimer(nIDEvent);
}
BOOLCMyDlg:
:
PreTranslateMessage(MSG*pMsg)//键盘控制
{
if(pMsg->message==WM_KEYDOWN)//获取键盘
switch(pMsg->wParam)//键盘按键
{
caseVK_UP:
if(abt.direction!
=2)abt.direction=1;break;//按上
caseVK_DOWN:
if(abt.direction!
=1)abt.direction=2;break;//按下
caseVK_LEFT:
if(abt.direction!
=4)abt.direction=3;break;//按左
caseVK_RIGHT:
if(abt.direction!
=3)abt.direction=4;break;//按右
caseVK_SPACE:
if(abt.status==1)OnStary();elseif(abt.status==2)OnPause();elseOnContinue();break;//按空格
caseVK_NUMPAD1:
if(abt.spend!
=1)OnS1();break;//按小键盘数字1,可以设置为初级
caseVK_NUMPAD2:
if(abt.spend!
=2)OnS2();break;//按小键盘数字2,可以设置为中级
caseVK_NUMPAD3:
if(abt.spend!
=3)OnS3();break;//按小键盘数字3,可以设置为高级
caseVK_NUMPAD4:
if(abt.spend!
=3)OnArea();break;//按小键盘数字4,可以设置为空地
caseVK_NUMPAD5:
if(abt.spend!
=3)OnBox();break;//按小键盘数字5,可以设置为方盒
caseVK_NUMPAD6:
if(abt.spend!
=3)OnRoom();break;//按小键盘数字6,可以设置为格子
caseVK_NUMPAD7:
if(abt.clor!
=1)OnWhite();break;//按小键盘数字7,可以设置为白色
caseVK_NUMPAD8:
if(abt.clor!
=2)OnGrey();break;//按小键盘数字8,可以设置为灰色
caseVK_NUMPAD9:
if(abt.clor!
=3)OnOrange();break;//按小键盘数字9,可以设置为橙色
}
returnCDialog:
:
PreTranslateMessage(pMsg);
}
voidCMyDlg:
:
OnStary()//开始按钮
{
CMenu*p=GetMenu();//获取菜单ID
CMenu*pm=p->GetSubMenu(0);//获取菜单第一级ID
if(abt.status==1)//判断是否是为未开始状态
{
SetTimer(1,200,NULL);//设置游戏等待0.2秒开始
GetDlgItem(IDC_STATIC)->SetWindowText("0.2秒后游戏开始");//修改提示
GetMenu()->GetSubMenu(0)->ModifyMenu(0,MF_BYPOSITION,IDM_STARY,"重新开始");//修改菜单《开始游戏》文字,变成《重新开始》文字
pm->EnableMenuItem(IDM_PAUSE,MF_ENABLED);//由于游戏开始,则让暂停键可用
abt.status=2;//设置游戏状态为开始后未暂停状态
}
else
{
KillTimer
(1);//停止程序时间跳动
pm->EnableMenuItem(IDM_PAUSE,MF_GRAYED);//由于重新开始,则设置暂停键不可用
pm->EnableMenuItem(IDM_CONTINUE,MF_GRAYED);//由于重新开始,则设置继续键不可使用
OnPaint();//游戏重新进入
}
}
voidCMyDlg:
:
OnPause()//暂停按钮
{
CMenu*p=GetMenu();//获取菜单ID
CMenu*pm=p->GetSubMenu(0);//获取菜单第一级ID
if(abt.status==2)//判断是否是为开始状态
{
KillTimer
(1);//停止程序时间跳动
GetDlgItem(IDC_STATIC)->SetWindowText("暂停游戏");//修改提示
pm->EnableMenuItem(IDM_PAUSE,MF_GRAYED);//由于使用完暂停,则设置暂停键不可用
pm->EnableMenuItem(IDM_CONTINUE,MF_ENABLED);//由于使用暂停,则设置继续键可使用
abt.status=3;//设置当前状态为开始后暂停未继续状态
}
}
voidCMyDlg:
:
OnContinue()//继续按钮
{
CMenu*p=GetMenu();//获取菜单ID
CMenu*pm=p->GetSubMenu(0);//获取菜单第一级ID
if(abt.status==3)//判断是否是为暂停状态
{
SetTimer(1,200,NULL);//开始程序时间跳动
GetDlgItem(IDC_STATIC)->SetWindowText("0.2秒后游戏继续");//修改提示
pm->EnableMenuItem(IDM_CONTINUE,MF_GRAYED);//由于使用完继续,则设置继续键不可用
pm->EnableMenuItem(IDM_PAUSE,MF_ENABLED);//由于使用完继续,则设置暂停键可用
abt.status=2;//设置游戏状态为开始未暂停状态
}
}
voidCMyDlg:
:
OnS1()//初级
{
CMenu*p=GetMenu();//获得菜单窗口
CMenu*pm=p->GetSubMenu(0);//获得第一级菜单下拉ID
pm->EnableMenuItem(IDM_S1,MF_GRAYED);//设置初级按钮不可用
pm->EnableMenuItem(IDM_S2,MF_ENABLED);//设置中级按钮可用
pm->EnableMenuItem(IDM_S3,MF_ENABLED);//设置高级按钮可用
KillTimer
(1);//暂停游戏
abt.spend=1;//改为初级值
OnPaint();//回到初始状态
}
voidCMyDlg:
:
OnS2()//中级
{
CMe