手把手教学mfc吃豆子教程

大师兄啦啦啦 大师兄啦啦啦     2022-12-07     152

关键词:

手把手教学MFC吃豆子教程

本教程适用于零基础学员制作C++课程设计

编程工具:VC++6.0. 本次教学主要知识点: 1.控件消息响应。 2.CDC类函数的使用。


下面开始教学: 吃豆子的基本思想: 1.定义脸和食物类. 2.不断将脸的上一个坐标重绘为白色,将新的脸绘制出来,从而在宏观上实现脸的移动. 3.运用OnTimer()函数制作时钟更新画面, 运用OnKeyDown()接收键盘消息.

首先创建工程:我们选择的是MFC AppW的单文档工程.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 下面我们添加三个windows 消息如图

添加方式:右键CView类选择 Add Window Message Hander
添加结果: 共需要这三个消息
1.WM_KEYDOWN (键盘消息,用来接收键盘反馈) 2.WM_RBUTTONDOWN(鼠标消息,用于后续一个函数方便读者理解程序使用) 3.WM_TIMER
下面我们开始添加函 添加方式:右键CView类选择 Add Virtual Function 从左边找到OnlitialUpdate函数按Add Handler添加到右边 添加成功图如下:添加完后记得按确定

OnInitialUpdate()函数主要是用于脸和食物的初始化,因为这个函数在OnDraw()函数之前调用. 具体说明读者可以自行Bai度; 最后我们再自己添加一个OnFace initialization()(脸的初始化)函数用来对脸进行初始化. 依然是右键CView类选择Add Member Function
在弹出菜单里输入如图信息.中间最好不要加空格不然到时候不好找函数在哪里,此图就不做修改了.
好了基本游戏框架就算是做好了。 那么我们现在先做一个游戏界面的控件设计吧。 首先我们先选择右边菜单底部的RESOURCE VIEW 双击IDR_MAINFRAME如图
右键空白的格子选择属性
输入标注
然后在游戏菜单栏的扩展栏分别创建下面的扩展选项
扩展选项的属性分别为



ID成功设置之后我们就开始对这些控件进行消息的响应处理 具体方法如下图
注意一定要在Class name:选项中选择CVIEW类 赋予Begin   COMMAND的Message:

其他控件也如上例子添加函数

添加完毕后我们就可以检查一下所添加的函数是否有遗漏 读者可以参照此图,如果有遗漏可以自行返回上面再次学习添加.

下面我们要向所添加的函数体里面添加代码了,教程也快到尾声了大家坚持.
1.我们在如图位置添加脸和食物的全局变量
class Face

     public:
int x,y;//坐标
int direct;//方向
Face;
class Food

      public:
     int x;
     int y;
     int flag;//flag(标志)后用于防止食物坐标重复访问造成游戏结束的问题
Food[2];
int flag =2;//这个flag用于计算食物的个数,当flag等于0那么游戏将结束


插入在如图的地方,代码是源程序里面复制的读者可以选择复制粘贴到自己的程序中.


对食物和脸进行初始化 void CEatbeanView::OnInitialUpdate() 

CView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class
Face.x=10;
Face.y=10;
Face.direct=2;
//本次设计两个食物,初始化坐标.

Food[0].x=40;
Food[0].y=40;
    Food[0].flag=0;
Food[1].x=100;
Food[1].y=100;
Food[1].flag=0;






2.找到刚才我们定义的Faceinitialization函数做脸的初始化和食物的初始化
void CEatbeanView::OnFaceinitialize()//脸外观设计

CDC *pDC=GetDC();//建立一个CDC指针pDC指向窗口句柄
CBrush DrawBrush=(RGB(255,48,48)); //创建一个画刷需要用RBG进行初始化,RBG的色彩可以百度
     CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
     pDC->Ellipse(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20);
//食物循环绘图
for(int i=0;i<2;i++)
 pDC->Ellipse(Food[i].x,Food[i].y,Food[i].x+20,Food[i].y+20);
     pDC->SelectObject(DrawBrush);

结果图

3.对OnKeyDown()函数中添加代码
void CEatbeanView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) //nChar用来从键盘接收消息

// TODO: Add your message handler code here and/or call default
switch(nChar)//用一个stitch接收按键并转化为数字方便运算

   case VK_UP:Face.direct=1;break;//     上1
case VK_DOWN:Face.direct=2;break;//   下2
case VK_LEFT:Face.direct=3;break;//   左3
case VK_RIGHT:Face.direct=4;break;//  右4

CView::OnKeyDown(nChar, nRepCnt, nFlags);//自己生成


添加结果图
OnKeyDown函数的第一个参数UINT nChar是键盘输入的信息,这里我们用switch进行判断 对不同按键我们将脸的朝向Face.direct变量进行不同的初始化.不同的方向用不同的数字代表 之后我们方面判断.
4.因为读者可能不了解坐标所以我这里添加了一个函数,这个函数的作用是: 当你右键游戏窗口会弹窗此处坐标,方便于读者理解程序所用,没有这个函数游戏也能愉快运行. 添加方式和上面几个函数一样在右边找到然后输入代码 void CEatbeanView::OnRButtonDown(UINT nFlags, CPoint point) 

// TODO: Add your message handler code here and/or call default
    CString str;
    str.Format("%d,%d",point.x,point.y);
    AfxMessageBox(str);
CView::OnRButtonDown(nFlags, point);

结果图
5.对游戏开始游戏暂停等控件添加代码 void CEatbeanView::Onbegin() 

// TODO: Add your command handler code here
SetTimer(1,1000,NULL);
AfxMessageBox("游戏即将开始!");


void CEatbeanView::Onexit() 

// TODO: Add your command handler code here
AfxMessageBox("退出游戏");
AfxGetMainWnd()->SendMessage(WM_CLOSE);//关闭窗口

void CEatbeanView::Onpause() 

// TODO: Add your command handler code here
KillTimer(1);
AfxMessageBox("游戏暂停中!");

void CEatbeanView::OnGameContinue() 

// TODO: Add your command handler code here
SetTimer(1,1000,NULL);


AfxMessageBox是弹窗消息的函数. SetTimer函数的说明:创建或设置一个定时器,该函数创建的定时器与Timer控件(定时器控件)效果相同。 里面一共有三个参数SetTimer(计时器名字,时间间隔单位毫秒,指定窗口句柄)
6.对OnDraw函数进行代码添加
我们用这个函数进行界面的初始绘制 void CEatbeanView::OnDraw(CDC* pDC)

CEatbeanDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
       CBrush backBrush(RGB(255,222,173));
       CBrush* pOldBrush = pDC->SelectObject(&backBrush);//
       CRect rect;
       pDC->GetClipBox(&rect);
       pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY);
       pDC->SelectObject(pOldBrush);//
       pDC->Rectangle(18,18,400,400);//501
       OnFaceinitialize();


7.对OnTimer函数的代码添加 void CEatbeanView::OnTimer(UINT nIDEvent) 

// TODO: Add your message handler code here and/or call default
   
   //撞界判断,食物吃完
CDC *pDC=GetDC();
     if(Face.x*20<=20||Face.y*20<=20||Face.x*20>=380||Face.y*20>=380||flag==0)

         KillTimer(1);
         AfxMessageBox("游戏结束");
 
//判断食物的剩余
  
 

//先擦除前一个位置
     pDC->SelectStockObject(WHITE_PEN);
     pDC->Rectangle(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20);
 
//后画出新的脸
//行走方向判断
      if(Face.direct==1)Face.y--;
      if(Face.direct==2)Face.y++;
      if(Face.direct==3)Face.x--;
      if(Face.direct==4)Face.x++;
  pDC->SelectStockObject(BLACK_PEN);
  
  CBrush DrawBrush=(RGB(255,48,48));
  CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
  /
   if(Face.x*20==Food[0].x&&Face.y*20==Food[0].y&&Food[0].flag==0)

flag--;
Food[0].flag=1;

   else if(Face.x*20==Food[1].x&&Face.y*20==Food[1].y&&Food[1].flag==0)

flag--;
Food[1].flag=1;



  if(Face.direct==1)//上
 
 if((Face.x+Face.y)%2==0)
 pDC->Ellipse(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20);//闭嘴重绘
 else  

 pDC->Pie(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20,Face.x*20+5,Face.y*20,Face.x*20+15,Face.y*20);


 
  
  if(Face.direct==2)//下//
 
 if((Face.x+Face.y)%2==0)
      pDC->Ellipse(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20);//闭嘴重绘
 else
 pDC->Pie(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20,/**/Face.x*20+15,Face.y*20+20,Face.x*20+5,Face.y*20+20);
 
  if(Face.direct==3)//左/
 
 if((Face.x+Face.y)%2==0)   //我们用脸的横纵坐标之和对2取余进行不同的绘制从而实现嘴巴的开合.
 
 pDC->Ellipse(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20);//闭嘴重绘
 
 else
         //pDC->SelectStockObject(BLACK_BRUSH);
 pDC->Pie(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20,Face.x*20,Face.y*20+15,Face.x*20,Face.y*20+5);
 
  if(Face.direct==4)//右
 
 if((Face.x+Face.y)%2==0)
 pDC->Ellipse(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20);//闭嘴重绘
 else
 pDC->Pie(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20,Face.x*20+20,Face.y*20+5,Face.x*20+20,Face.y*20+15);
 
 pDC->SelectObject(DrawBrush);
CView::OnTimer(nIDEvent);
这里我对代码进行说明一下  if((Face.x+Face.y)%2==0)   //我们用脸的横纵坐标之和对2取余进行不同的绘制从而实现嘴巴的开合.  //先擦除前一个位置
     pDC->SelectStockObject(WHITE_PEN);
     pDC->Rectangle(Face.x*20,Face.y*20,(Face.x+1)*20,(Face.y+1)*20);

这段函数的作用就是画矩形我们用,画白色矩形的方法来擦除上一个位置,当然当脸吃到食物之后食物就成了上一个位置 我们就用这个矩形覆盖食物同时覆盖原来的脸,这样就实现的食物的删除.



本次教程就到这里了,已经详细之至了,实在不懂的地方就请
者自行度娘了.


手把手教学mfc吃豆子教程

手把手教学MFC吃豆子教程本教程适用于零基础学员制作C++课程设计编程工具:VC++6.0.本次教学主要知识点:1.控件消息响应。2.CDC类函数的使用。下面开始教学:吃豆子的基本思想:1.定义脸和食物类.2.... 查看详情

制作吃豆子有问题吗?

】制作吃豆子有问题吗?【英文标题】:Havingsomeissueswithmakingpacman?【发布时间】:2011-12-2809:19:44【问题描述】:编辑:完全忘记提及我正在使用Java编码我很难制作某种检测系统或某种方法来让我的pacman精灵/角色在游戏中顺利通... 查看详情

安装tortoisegit教程保姆级教程手把手教学

一、下载TortoiseGit官网链接:https://tortoisegit.org/选择自己对应的版本下载下来即可二、安装1、双击刚刚下载好的msi文件进入安装2、连续两次next之后,到如下页面基于Putty,对TortoiseGit做了优化/Git默认的SSH客户端,... 查看详情

手把手干货教学matlab载波调制

前言以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟!MATLAB-30天带你从入门到精通MATLAB深入理解高级教程(附源码)tableau可视化数据分析高级教程本文对simulink模块部分不做过... 查看详情

『python开发实战菜鸟教程』工具篇:手把手教学使用vscode开发python(代码片段)

文章目录:0X01:引子Python学习资料及开发工具介绍 0x02:实操基于Conda的Python安装VSCode的安装使用安装插件管理按钮使用介绍VSCode如何管理项目文件VSCode如何切换使用PythonVSCode如何执行Python文件 0x03:尾巴0X01࿱... 查看详情

1v1手把手实战教学,微搭低代码中如何上传图片

低码的教程已经创作了230多篇了,日常其实和粉丝的互动非常少,总是我自顾自的写教程,然后自顾自的发表。有时候没有反馈其实不知道教程写的如何。这不,有个热心的学生加了好友,他也积极的反馈教... 查看详情

『python开发实战菜鸟教程』工具篇:手把手教学使用vscode开发python(代码片段)

...鸟教程』实战篇:一文带你了解人脸识别应用原理及手把手教学实现自己的人脸识别项目上面主要讲述了,如何一步步编程实现具体功能。同时也有些朋友咨询笔者用的开发工具是什么,如何开发Python。为了方便进一... 查看详情

『python开发实战菜鸟教程』实战篇:一文带你了解人脸识别应用原理及手把手教学实现自己的人脸识别项目(代码片段)

文章目录0x01:引子0x02:环境搭建0x03:开发实战 1.实现人脸检测标记2.人脸特征点提取3.人脸识别验证0x04:后记开源GitHub地址--> https://github.com/xiaosongshine/dlib_face_recognition推荐补充阅读:『Python开发实战菜鸟... 查看详情

ensp安装教程手把手教学

安装ENSP简介ENSP概述设备支持首先需要的环境安装顺序安装后的测试简介ENSP概述eNSP(EnterpriseNetworkSimulationPlatform)是一款由华为提供的免费的、可扩展的、图形化的网络设备仿真平台,主要对企业网路由器、交换机、WLAN等设备... 查看详情

7个python小项目,手把手教学——5分钟教会python新手

1.淘宝模拟登录使用教程点击这里下载下载chrome浏览器查看chrome浏览器的版本号,点击这里下载对应版本号的chromedriver驱动pip安装下列包pipinstallselenium点击这里登录微博,并通过微博绑定淘宝账号密码在main中填写chromedrive... 查看详情

dev-c++安装和使用教程(手把手傻瓜式教学)

关于Dev-C++的安装以及基本使用方法觉得Dev-C++是一款小巧方便的编译器,就给那些刚刚学习编程的同学讲一下这个软件的安装和基本的编译以及一些使用的技巧。(完全是傻瓜式的截图和教程,内容过于冗... 查看详情

技术群资源和教程汇总

...系列每日一练,在线代码练习场版块编辑:洋阳2、GItHub手把手教你玩转Git/GitHub手把手教你利用Git/GitHub进行写作手把手教你安装Git(Windows平台)github规范下的markdown板块编辑:Grit3、DOSDOS指定大全,密码:n6y8板块编辑:York4、CADAUTOC... 查看详情

『python开发实战菜鸟教程』实战篇:一文带你了解人脸识别应用原理及手把手教学实现自己的人脸识别项目(代码片段)

...补充阅读:『Python开发实战菜鸟教程』工具篇:手把手教学使用VSCode开发Python0x01:引子 Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口,功能类似于TensorFlow与PyTorch。但是由于Dlib对... 查看详情

zznuoj_用c语言编写程序实现1516:去师院的旅程:吃早饭先(附完整源码)(代码片段)

题目描述豆子又要去师院见MMQ了! 豆子早上早早就起来了准备去师院。刚出宿舍就看到HZK,LGZ等几个同学一起去吃早饭。经常不吃早饭的豆子想着今天反正早起了不如跟小伙伴一起去吃早饭。 刚到食堂豆子想帮小伙伴拿... 查看详情

手把手超详细教程教你scrapy爬达盖尔社区,有彩蛋哦!(代码片段)

手把手超详细教程教你Scrapy爬达盖尔社区,有彩蛋哦! 繁华落尽and曲终人散 2018-05-1719:11好了,废话不多说,学习代码就是要学以致用的。不能写了一遍代码就让代码吃灰。下面就跟我一起来搞吧。小草网站是个好网站,... 查看详情

犀牛产品建模实例视频教程教学视频

|犀牛产品建模教程|--|吸尘器产品建模|----|06总体倒角操作.avi|----|05其他细节部分处理.avi|----|04轮子部分处理.avi|----|03把手部分处理.avi|----|02顶部凹陷处理.avi|----|01基本主体建模.avi|--|实例文件|----|第5章|------|剃须刀渲染模型.3dm|-... 查看详情

14集超详细视频教程,手把手教你用数据神器hawk!

...重试!同时,文档也得到了更新,不过,有了沙漠君亲自手把手录制的视 查看详情

codeforces883d.packmenstrikeback(二分+dp)(代码片段)

传送门题意:一条长为n线上有几个吃豆人和几个豆子,你可以控制吃豆人的移动方向,选定方向之后吃豆人便会一直向这个方向走,问能吃到的最大豆子数和为了达到这个目标所需的最少时间。思路:最大的豆子数量其实就是... 查看详情