很好玩的贪吃蛇_第1页
很好玩的贪吃蛇_第2页
很好玩的贪吃蛇_第3页
很好玩的贪吃蛇_第4页
很好玩的贪吃蛇_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

18/18C++课程实训系别:软件学院班级:软工一班姓名:赵波//贪吃蛇Dlg。cpp:implementationfile//#include"stdafx.h"#include”贪吃蛇.h"#include"贪吃蛇Dlg。h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_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节///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg: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//Implementationprotected:ﻩ//{{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_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyDlgdialogCMyDlg::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_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMyDlgmessagehandlersBOOLCMyDlg::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()//中级{ CMenu*p=GetMenu(); ﻩ//获得菜单窗口 CMenu*pm=p->GetSubMenu(0);//获得第一级菜单下拉ID pm->EnableMenuItem(IDM_S1,MF_ENABLED);//设置初级按钮可用 pm->EnableMenuItem(IDM_S2,MF_GRAYED);//设置中级按钮不可用ﻩpm->EnableMenuItem(IDM_S3,MF_ENABLED);//设置高级按钮可用ﻩKillTimer(1);//暂停游戏 abt.spend=2;//改为中级ﻩOnPaint();//回到初始状态}voidCMyDlg::OnS3()//高级{ CMenu*p=GetMenu();ﻩﻩ//获得菜单窗口 CMenu*pm=p->GetSubMenu(0);//获得第一级菜单下拉IDﻩpm-〉EnableMenuItem(IDM_S1,MF_ENABLED);//设置初级按钮可用 pm-〉EnableMenuItem(IDM_S2,MF_ENABLED);//设置中级按钮可用ﻩpm->EnableMenuItem(IDM_S3,MF_GRAYED);//设置高级按钮不可用 KillTimer(1);//暂停游戏ﻩ abt。spend=3;//改为高级 OnPaint();//回到初始状态}voidCMyDlg::OnMax()//最大值{ﻩKillTimer(1);//暂停游戏 GetDlgItem(IDC_STATIC)—>SetWindowText("暂停游戏");//修改提示ﻩFILE*fp;//由于使用C++文件找不到直接读取整数的方法,所以改为用C语言操作文件 if(!(fp=fopen("max","rb”)))//若没有文件记录高分则设置弹出都为空 {ﻩ MessageBox(”初级:0\n中级:0\n高级:0");ﻩ}ﻩelse {ﻩﻩCStringmax;//定义提示框提示所用的字符串ﻩ intm1,m2,m3;//接受文件提供的三个级别最高分数 fscanf(fp,"%d,%d,%d",&m1,&m2,&m3);//获取文件三个整数 max。Format("初级:%d\n中级:%d\n高级:%d\n”,m1,m2,m3);//设置弹出框内容 ﻩMessageBox(max,”英雄榜”);//弹出框提示三个级别不同的最高分ﻩﻩfclose(fp);//关闭文件 } }voidCMyDlg::OnExit()//结束{exit(1);ﻩ}voidCMyDlg::OnArea()//空地{ CMenu*p=GetMenu();ﻩ //获得菜单窗口 CMenu*pm=p->GetSubMenu(1);//获得第一级菜单下拉IDﻩpm->EnableMenuItem(IDM_AREA,MF_GRAYED);//设置暂停按钮不可用 pm—>EnableMenuItem(IDM_BOX,MF_ENABLED);//设置暂停按钮可用 pm->EnableMenuItem(IDM_ROOM,MF_ENABLED);//设置暂停按钮可用 abt.mode=1;//修改类型 refurbich();//刷新}voidCMyDlg::OnBox(){ CMenu*p=GetMenu();ﻩﻩ//获得菜单窗口ﻩCMenu*pm=p—>GetSubMenu(1);//获得第一级菜单下拉IDﻩpm—>EnableMenuItem(IDM_AREA,MF_ENABLED);//设置暂停按钮可用ﻩpm->EnableMenuItem(IDM_BOX,MF_GRAYED);//设置暂停按钮不可用ﻩpm-〉EnableMenuItem(IDM_ROOM,MF_ENABLED);//设置暂停按钮可用 abt.mode=2;//修改类型ﻩrefurbich();//刷新ﻩCDC*pDC=GetDC();//获取窗口对象 CBrushmode1=(RGB(0,0,0)); //设置方盒的颜色ﻩCBrush*mode11=pDC—>SelectObject(&mode1);//替换当前样式 for(intmd1=1;md1〈=18;md1++)//绘制方盒 {ﻩﻩpDC-〉Rectangle(md1*20,1*20,(md1+1)*20,2*20); pDC->Rectangle(md1*20,13*20,(md1+1)*20,14*20);ﻩ} for(intmd11=1;md11<=13;md11++)ﻩ{ﻩ pDC->Rectangle(0*20,md11*20,1*20,(md11+1)*20);ﻩ pDC—>Rectangle(18*20,md11*20,19*20,(md11+1)*20);ﻩ}ﻩpDC-〉SelectObject(mode1);}voidCMyDlg::OnRoom(){ﻩCMenu*p=GetMenu(); ﻩ//获得菜单窗口ﻩCMenu*pm=p->GetSubMenu(1);//获得第一级菜单下拉ID pm—>EnableMenuItem(IDM_AREA,MF_ENABLED);//设置暂停按钮可用 pm—〉EnableMenuItem(IDM_BOX,MF_ENABLED);//设置暂停按钮可用ﻩpm-〉EnableMenuItem(IDM_ROOM,MF_GRAYED);//设置暂停按钮不可用 abt.mode=3;//修改类型ﻩrefurbich();//刷新ﻩCDC*pDC=GetDC();//获取窗口对象 CBrushmode1=(RGB(0,0,0));ﻩ//设置颜色(黑)ﻩCBrush*mode11=pDC->SelectObject(&mode1);ﻩfor(intmd1=0;md1<=18;md1++)//绘制格子 { ﻩif(md1<7)pDC—〉Rectangle(md1*20,12*20,(md1+1)*20,13*20);ﻩ if(md1>10)pDC->Rectangle(md1*20,2*20,(md1+1)*20,3*20); }ﻩfor(intmd11=1;md11〈=14;md11++) {ﻩ if(md11<7)pDC—>Rectangle(6*20,md11*20,7*20,(md11+1)*20);ﻩﻩif(md11〉7)pDC-〉Rectangle(11*20,md11*20,12*20,(md11+1)*20); }ﻩpDC->SelectObject(mode1);}voidCMyDlg::OnWhite(){ﻩCMenu*p=GetMenu();ﻩ //获得菜单窗口ﻩCMenu*pm=p->GetSubMenu(2);//获得第一级菜单下拉ID pm->EnableMenuItem(IDM_WHITE,MF_GRAYED);//设置白色按钮不可用 pm->EnableMenuItem(IDM_GREY,MF_ENABLED);//设置灰色按钮可用 pm—〉EnableMenuItem(IDM_ORANGE,MF_ENABLED);//设置橙色按钮可用ﻩabt.clor=1;//修改颜色值 refurbich();//刷新}voidCMyDlg::OnGrey(){ CMenu*p=GetMenu(); ﻩ//获得菜单窗口 CMenu*pm=p->GetSubMenu(2);//获得第一级菜单下拉IDﻩpm->EnableMenuItem(IDM_WHITE,MF_ENABLED);//设置暂停按钮可用 pm—>EnableMenuItem(IDM_GREY,MF_GRAYED);//设置暂停按钮不可用 pm-〉EnableMenuItem(IDM_ORANGE,MF_ENABLED);//设置暂停按钮可用 abt。clor=2;//修改颜色值 refurbich();//刷新ﻩOnSnake();//绘制蛇}voidCMyDlg::OnOrange()//橙色{ CMenu*p=GetMenu(); ﻩ//获得菜单窗口 CMenu*pm=p->GetSubMenu(2);//获得第一级菜单下拉IDﻩpm->EnableMenuItem(IDM_WHITE,MF_ENABLED);//设置暂停按钮可用ﻩpm->EnableMenuItem(IDM_GREY,MF_ENABLED);//设置暂停按钮可用ﻩpm-〉EnableMenuItem(IDM_ORANGE,MF_GRAYED);//设置暂停按钮不可用 abt.clor=3;//修改颜色值 refurbich();//刷新 OnSnake();//绘制蛇}voidCMyDlg::OnHelp()//帮助{ﻩMessageBox(”按上,下,左,右控制蛇前进方向\n按空格控制蛇开始,暂停与继续\n吃掉食物,同时避开障碍物。”,"贪食蛇操作说明”);}voidCMyDlg::OnAbout()//关于{ﻩMessageBox(”嘿嘿","关于贪吃蛇");ﻩ}voidCMyDlg::OnFood(){ CDC*pDC=GetDC();//获取对话框 ﻩ if(Snake[0].x*20==abt.x*20&&Snake[0].y*20==abt。y*20)//判断吃豆的条件,撞到就吃 {ﻩﻩ abt.isabt=1;//食物被吃 ﻩﻩabt.len++;//蛇身+1ﻩ ﻩSnake[abt.len—1].x=Snake[abt.len—2]。x;//增加一节蛇身跟随蛇尾坐标xﻩﻩﻩSnake[abt。len—1]。y=Snake[abt.len—2].y;//增加一节蛇身跟随蛇尾坐标y }ﻩﻩ if(abt.isabt==1) //如果食物被吃了就生成新食物ﻩ {ﻩ ﻩﻩabt。isabt=0;//改为有食物状态 ﻩﻩsrand((unsigned)time(NULL));//食物随时间变化随机出现的种子ﻩ ms://重新设置食物出现的位置,防止食物出现在蛇身上 abt。x=rand()%17;//随机出现食物x坐标,防止食物出现在边界x+1 abt.y=1+rand()%13;//随机出现食物y坐标,防止食物出现在边界y+1 ﻩ ﻩfor(intisfo=abt.len—1;isfo>=0;isfo-—)//遍历蛇 ﻩ ﻩif(Snake[isfo]。x==abt.x&&Snake[isfo]。y==abt.y)//判断食物是否在蛇身上 ﻩﻩ ﻩgotoms;//重新设置食物ﻩﻩﻩif(abt.mode==2)//类型为2,方盒模式,食物不应出现在盒子上ﻩ ﻩ{ﻩ ﻩ for(intmd1=0;md1<=18;md1++)ﻩ { ﻩﻩﻩif(abt.x==md1&&abt。y==1) ﻩﻩﻩﻩﻩgotoms;ﻩ ﻩﻩﻩif(abt.x==md1&&abt.y==13) ﻩ gotoms;ﻩﻩﻩﻩ} ﻩﻩ for(intmd11=2;md11<14;md11++)ﻩ ﻩﻩ{ ﻩﻩ if(abt.x==0&&abt。y==md11)ﻩ ﻩ ﻩgotoms;ﻩ ﻩﻩif(abt。x==18&&abt.y==md11)ﻩ ﻩﻩ ﻩﻩgotoms; ﻩ} ﻩ ﻩﻩﻩﻩ} ﻩﻩif(abt。mode==3)//类型为3,食物不能显示到格子模式的格子上ﻩﻩ {ﻩﻩ for(intmd1=0;md1<=18;md1++)ﻩ ﻩ{ ﻩ ﻩif(md1〈7)ﻩﻩ if(abt。x==md1&&abt.y==12) ﻩ ﻩgotoms;ﻩﻩﻩ ﻩif(md1>10) ﻩﻩﻩﻩﻩif(abt。x==md1&&abt.y==2) ﻩﻩﻩ gotoms; ﻩ }ﻩﻩﻩﻩfor(intmd11=1;md11〈=14;md11++) ﻩ ﻩ{ﻩ ﻩif(md11<7) ﻩ if(abt。x==6&&abt。y==md11)ﻩﻩ ﻩ ﻩ gotoms;ﻩ ﻩ ﻩif(md11>10)ﻩﻩ ﻩif(abt.x==11&&abt.y==md11)ﻩﻩﻩﻩﻩ gotoms; ﻩ ﻩ} ﻩ } } ﻩCBrushDrawBrush=(RGB(255,0,0));//设置食物的颜色 ﻩCBrush*Drawbrush=pDC->SelectObject(&DrawBrush);//绘制方框 ﻩpDC-〉Rectangle(abt.x*20,abt.y*20,(abt.x+1)*20,(abt.y+1)*20);//食物显示ﻩ}voidCMyDlg::OnFile(){ FILE*fp;//定义C语言文件 if(!(fp=fopen(”max”,"rb")))//若无文件记录最高分ﻩ{ fp=fopen(”max",”wb”);//新建以max为名称的最高分记录文件 ﻩfprintf(fp,”0,0,0");//初始化三个级别的最高分问为0 ﻩfclose(fp);//关闭文件ﻩﻩfp=fopen(”max",”rb");//以读的方式打开新建的max文件 } ﻩ intm1,m2,m3,s=(abt。len—3)*100;//定义三个变量接受文件存储的三个级别分数及一个变量定义当次游戏的分数ﻩ fscanf(fp,”%d,%d,%d",&m1,&m2,&m3);//接受三个级别记录的整数 ﻩfclose(fp);//关闭文件ﻩﻩif(abt。spend==1)if(s>m1)m1=s;//当游戏级别为初级时.判断当次分数以历史初级最高,保存比较后最大的数 if(abt.spend==2)if(s>m2)m2=s;//当游戏级别为高级时。判断当次分数以历史初级最高,保存比较后最大的数 ﻩif(abt.spend==3)if(s>m3)m3=s;//当游戏级别为高级时。判断当次分数以历史初级最高,保存比较后最大的数 ﻩfp=fopen(”max”,”wb”);//以写的方式打开max文件ﻩﻩfprintf(fp,"%d,%d,%d",m1,m2,m3);//删除以往记录,保存目前记录的分数 ﻩfclose(fp);//关闭文件}voidCMyDlg::OnAway()//行走{ﻩfor(inti=abt.len-1;i〉0;i--)//使蛇身跟着蛇头走 { Snake[i].x=Snake[i-1]。x;//传递x坐标ﻩﻩSnake[i]。y=Snake[i—1]。y;//传递y坐标 }ﻩ if(abt。direction==1)Snake[0].y--;//判断蛇头的方向(向上)ﻩif(abt.direction==2)Snake[0]。y++;//判断蛇头的方向(向下)ﻩif(abt.direction==3)Snake[0]。x-—;//判断蛇头的方向(向左) if(abt。direction==4)Snake[0].x++;//判断蛇头的方向(向右)ﻩ if(Snake[0]。x==-1)Snake[0]。x=18;//设置左穿墙ﻩif(Snake[0].x==19)Snake[0].x=0;//设置右穿墙 if(Snake[0]。y==0)Snake[0]。y=13;//设置上穿墙 if(Snake[0]。y==14)Snake[0].y=1;//设置下穿墙ﻩrefurbich();//刷新 if(abt。mode==1)OnArea();//绘制空地模式 elseif(abt.mode==2)OnBox();//绘制方盒模式 elseOnRoom();//绘制格子模式 OnDelet();//调用判定是否结束函数ﻩ}voidCMyDlg::OnSnake()//绘制蛇{ﻩCDC*pDC=GetDC();//初始颜色绘制 CBrushDrawBrush=(RGB(100,100,100));ﻩ//设置蛇的颜色ﻩCBrush*Drawbrush=pDC->SelectObject(&DrawBrush);//替换当前样式ﻩfor(inti=0;i<=abt。len-1;i++)ﻩ pDC—〉Rectangle(Snake[i]。x*20,Snake[i].y*20,(Snake[

温馨提示

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

评论

0/150

提交评论