一个简单的吃豆子游戏 (MFC)
      这是我的第一个自己写的小游戏,这其中借鉴了很多网上的思路,也向学长,同学寻求了不少的帮助,能最终完成也是出乎了我的意料,虽然它看起来非常的简单,但从这之中我收获巨大。编程是痛苦的,从来没有一步到位的程序,特别是有时候觉得自己就要到达终点,但突然发现原来自己走偏了,此路不通!每当此时就要重新修改,那种感觉相当难受,然而当做完的时候又会有一种巨大的成就感
        下面就具体谈谈我对这个游戏的具体思路及其实现方法
         
        吃豆子游戏的基本构思:
        1.添加控件的消息响应
        2.添加在View类中的消息响应
         (在本次游戏中,主要用到了 WM_KEYDOWN ,WM_RBUTTONDOWN 和WM_TIMER)
        3.利用CView类实现游戏的具体内容
        4.具体实现游戏,包括创建豆子类,嘴类,并实例化(其中豆子实例化为对象数组,因为有多个豆子)以及嘴的图形,撞界判断,吃完食物进行判断等等功能
        5.一定注意一个程序永远不可能一步到位,途中必定会遭遇各种错误,所以建议大家一定要走一步看(运行)一步,否则会死的很惨难过
        
        具体实现方法:
        第一步:创建一个MFC工程(我是用VC++做的微笑,可能版本有点老,不过不要介意
        如图:
       
       选择单文档,然后双击完成
      
      

第二步:添加必要的Windows响应消息,控件以及类和成员函数
      在已有工程下的 CView类中添加以下Windows响应信息
     1 WM_KEYDOWN
     2 WM_RBUTTONDOWN
     3 WM_TIMER

并且add一个虚函数OnInitialUpdate()

这个函数是视图窗口建立后第一个被调用的函数,所以我们用这个函数来实现嘴巴和豆子的初始化。          
             再接下来就是控件的设计了,在Menu文件夹下的IDR_MAINFRAME中可以进行控件的设计。如图:
             

删除原有的控件后右击“属性”,并分别填写控件名和ID,并选择可否弹出。

其中:

游戏开始 IDM_START

游戏暂停 IDM_PAUSE
                       游戏继续 IDM_CONTINUE
                       游戏退出 IDM_EXIT                      (也可以改为其他的ID)

另外,要在类向导中生成响应函数(同样是右键“建立类向导”):

在CView类下COMMAND双击即可生成响应函数。
             最后在CView类中添加一个成员函数oninit()函数

至此,该添加的都已添加,第二部分告一段落。

第三步:为各个函数添加代码,实现各种功能

1.建立豆子类和嘴巴类
          class Mouth
{
public:
int x;
int y;
int len;
int direct;
}mouth;                       //实例化一个嘴巴的对象mouth

class Bean
{
public:
int x;
int y;
int isBean;
}bean[2];                      //实例化一个豆子的对象数组(数组中的每一个元素都是对象)

2. 紧接着就在OnInitialUpdate()中进行初始化
void CEatView::OnInitialUpdate()        //初始化嘴巴与豆子
{
CView::OnInitialUpdate();
mouth.x=10;
mouth.y=10;
mouth.direct=3;                       //方向
bean[0].isBean=1;                   //豆子有无(1有0无)
bean[1].isBean=1;                   //这里就只创建了两个豆子大笑

// TODO: Add your specialized code here and/or call the base class

}

3.画嘴巴和豆子
CEatView::oninit()                 //利用CDC类来画嘴和srand()随机生成豆子
{
CDC *pDC=GetDC();              //用一个指向CDC类的指针去接受与该窗口相关联的DC句柄
        CBrush DrawBrush=(RGB(100,100,100));                //用定义画刷一个DrawBrush对象
        CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
        pDC->Pie(mouth.x*20,mouth.y*20,(mouth.x+1)*20,(mouth.y+1)*20,mouth.x*20,mouth.y*20,(mouth.x+1)*20,mouth.y*20);       //画嘴
srand((unsigned)time(NULL));             //随机生成豆子
for(int i=0;i<2;i++)
{
bean[i].x=rand()%20+2;
        bean[i].y=rand()%20+2;
}
for(int j=0;j<2;j++)
{
        pDC->Ellipse(bean[j].x*20,bean[j].y*20,(bean[j].x+1)*20,(bean[j].y+1)*20);         //豆子是圆形的
}
        pDC->SelectObject(DrawBrush);

}

4.实现控件

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

AfxMessageBox("游戏开始");
}

void CEatView::OnPause() 
{
// TODO: Add your command handler code here
KillTimer(1);
    AfxMessageBox("游戏暂停");
}

void CEatView::OnContinue() 
{
// TODO: Add your command handler code here
SetTimer(1,10,NULL);
}

void CEatView::OnExit() 
{
// TODO: Add your command handler code here
AfxMessageBox("退出游戏");
    exit;
}

5.为OnRButtonDown()添加代码
void CEatView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)            //实现嘴的上下左右移动
{
// TODO: Add your message handler code here and/or call default
switch(nChar)
{
        case VK_UP:mouth.direct=1;break;            //上
        case VK_DOWN:mouth.direct=2;break;     //下
        case VK_LEFT:mouth.direct=3;break;       //左
        case VK_RIGHT:mouth.direct=4;break;     //右
}
    CView::OnKeyDown(nChar, nRepCnt, nFlags);
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}             
              我们利用这个函数来实现键盘(上下左右)对嘴的控制
           6. 为OnDraw()添加代码
               这个函数是用画刷画出背景并且通过调用oninit()函数来画嘴和豆子
void CEatView::OnDraw(CDC* pDC)        //画背景
{
CEatDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CBrush backBrush(RGB(100,100,0));
        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(19,19,501,501);
        oninit();
// TODO: add draw code for native data here
}

7.实现OnTime()的代码(这是最后一步,也是最难的一步
void CEatView::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
    //撞界判断
    if(mouth.x*20<=37||mouth.y*20<=37||mouth.x*20>=462||mouth.y*20>=462)
{
        KillTimer(1);
        AfxMessageBox("游戏结束");              //??????
        // s=0;
}

pDC->SelectStockObject(WHITE_PEN);                                         //重绘
pDC->Rectangle(mouth.x*20,mouth.y*20,(mouth.x+1)*20,(mouth.y+1)*20);       //用白笔擦除

//判断行走方向,并重绘
    if(mouth.direct==1)            //上
{
mouth.y--; 
        pDC->SelectStockObject(BLACK_PEN);
        CBrush DrawBrush=(RGB(100,100,100));
        CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
        pDC->Pie(mouth.x*20,mouth.y*20,(mouth.x+1)*20,(mouth.y+1)*20,mouth.x*20,mouth.y*20,(mouth.x+1)*20,mouth.y*20);
        pDC->SelectObject(DrawBrush);
}
    if(mouth.direct==2)              //下
{
mouth.y++;
pDC->SelectStockObject(BLACK_PEN);
        CBrush DrawBrush=(RGB(100,100,100));
        CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
        pDC->Pie(mouth.x*20,mouth.y*20,(mouth.x+1)*20,(mouth.y+1)*20,(mouth.x+1)*20,(mouth.y+1)*20,mouth.x*20,(mouth.y+1)*20);
        pDC->SelectObject(DrawBrush);

    if(mouth.direct==3)            //左
{
mouth.x--;  
pDC->SelectStockObject(BLACK_PEN);
        CBrush DrawBrush=(RGB(100,100,100));
        CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
        pDC->Pie(mouth.x*20,mouth.y*20,(mouth.x+1)*20,(mouth.y+1)*20,mouth.x*20,(mouth.y+1)*20,mouth.x*20,mouth.y*20);
        pDC->SelectObject(DrawBrush);
}
    if(mouth.direct==4)              //右
{
mouth.x++;
pDC->SelectStockObject(BLACK_PEN);
        CBrush DrawBrush=(RGB(100,100,100));
        CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
        pDC->Pie(mouth.x*20,mouth.y*20,(mouth.x+1)*20,(mouth.y+1)*20,(mouth.x+1)*20,mouth.y*20,(mouth.x+1)*20,(mouth.y+1)*20);
        pDC->SelectObject(DrawBrush);
}

if(mouth.x*20==bean[0].x*20&&mouth.y*20==bean[0].y*20)
{
bean[0].isBean=0;
}
    if(mouth.x*20==bean[1].x*20&&mouth.y*20==bean[1].y*20)
{
bean[1].isBean=0;
}
    //食物吃完后结束游戏并给出成绩
if((bean[0].isBean==0)&&(bean[1].isBean==0))
{
KillTimer(1);
        AfxMessageBox("游戏结束");
}
CView::OnTimer(nIDEvent);

}

这是游戏运行图(太简单了,有点不好意思

一个简单的吃豆子游戏相关推荐

  1. C++项目实战(二)——简化版 “吃豆子游戏---pacman” 实现

    本项目通过使用 windows 窗口应用程序 实现一个简化版的 吃豆子游戏,主要涉及的知识点包含有:面向对象编程思想.windows 消息循环的工作原理.windows 窗口应用程序实现.父类与子类的 ...

  2. c#吃豆子游戏,模仿百度在线应用吃豆子

    这是一款模仿百度在线吃豆子的应用,本人对于C#小游戏制作的理解不是很深.CSDN里面用c#做的吃豆子也实在是太少,有的也太过于简单,于是萌生了一个念头,做一款C#吃豆子游戏,希望互相学习. csdn下 ...

  3. 吃豆豆游戏的C语言程序码,C++实现基于控制台界面的吃豆子游戏

    本文实例讲述了C++实现基于控制台界面的吃豆子游戏.分享给大家供大家参考.具体分析如下: 程序运行界面如下所示: ESC键可退出游戏. main.cpp源文件如下: #include "li ...

  4. 用pygame做一个简单的python小游戏---贪吃蛇

    用pygame做一个简单的python小游戏-贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/artic ...

  5. 一个简单的贪吃蛇游戏 c

    一个简单的贪吃蛇游戏 #include "pch.h" #include <iostream> #include<stdio.h> #include< ...

  6. python游戏最简单代码-如何利用Python开发一个简单的猜数字游戏

    前言 本文介绍如何使用Python制作一个简单的猜数字游戏. 游戏规则 玩家将猜测一个数字.如果猜测是正确的,玩家赢.如果不正确,程序会提示玩家所猜的数字与实际数字相比是"大(high)&q ...

  7. python简单小游戏代码_一个简单的python小游戏---七彩同心圆

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 用pygame做一个简单的python小游戏-七彩同心圆 玩法:每次点击鼠标时,会以鼠标为圆心,不断 ...

  8. 用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便加强一下pygame库的学习. 玩法:每次点击鼠标时,会以鼠标 ...

  9. 用pygame做一个简单的python小游戏---生命游戏

    用pygame做一个简单的python小游戏-生命游戏 生命游戏(Game of Life) 生命游戏(Game of Life)是剑桥大学约翰·何顿·康威(John Horton Conway)教授 ...

  10. python七彩同心圆_用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏---七彩同心圆 用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便 ...

最新文章

  1. static String valueOf(XXX xxx)
  2. 微软私有云系列----证书配置
  3. WCF for .NET CF的一个应用及两个困惑的问题
  4. html 怎么让tr的css覆盖td的_html表格标签
  5. RabbitMQ基本概念(一)-RabbitMQ的优劣势及产生背景
  6. wwww harmonyos,【新版本发布】HarmonyOS 1.0.0.71(SP2)
  7. 强化学习笔记 experience replay 经验回放
  8. 临床科研设计的主要内容
  9. 2016秋季阅读计划
  10. The C Programming Language--可变参数的函数
  11. 开氏温度与摄氏度换算_【油品小知识】你不知道的“柴油密度”与“温度”的故事...
  12. inline函数的作用
  13. laravel5.5表单验证
  14. 点击微信网页的a标签直接跳转到淘宝APP打开怎么实现的?附:动图演示效果
  15. Unity3d 枚举某个目录下所有资源
  16. 一文剖析电影“流浪地球”推广营销方式
  17. ps滤镜下载大全-PSCC 64位滤镜收集
  18. c语言编程中分数怎么表示,用C语言编程平均分数
  19. solidworks2015安装教程
  20. 如何用uniapp+vue开发自定义相机插件——拍照+录像功能

热门文章

  1. 网站XSS跨站攻击脚本语法
  2. 电子设计大赛-室内可见光定位装置
  3. 三菱plc控制步进电机实例_【干货】plc控制步进电机逻辑思路,思路通了步步顺畅...
  4. cuteftp连不上Linux虚拟机和传输文件问题的解决方案
  5. 数据中台实战入门篇:双中台战略
  6. 软考软件设计师本人成功备考经验分享
  7. 什么是xserver和xclient
  8. 数据库学习--数据库基本概念
  9. 计算机右键 管理,鼠标右键菜单管理方法?
  10. 【优亿 Android前线快报】 第76期