设为首页 加入收藏

TOP

用VC++编写扫雷游戏(一)
2013-02-08 14:28:57 】 浏览:897
Tags:编写 扫雷 游戏

  首先分析扫雷的最基本功能。

  点击鼠标左键于未知区域,如果未知区域有雷,游戏停止,显示所有的地雷。如果没雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止并显示,这其实是一个递归过程。

  点击鼠标右键于未知区域,则将其置为有雷而不管是否真的有雷。可选择初、中、高三级并可自定义雷数和区域大小。

  雷区上部左侧显示总雷数减被标明有雷区域的数目。

  雷区上部中间位置显示一按钮用于开局和显示鼠标动作的结果。

  雷区上部右侧显示扫雷的时间。

  将雷全部扫清后,则显示一对话框将你的姓名记入排行榜。以时间排序。

  为完成上述功能,应用Visual C++(www.cppentry.com)的具体技术细节如下:

  1. 应用AppW

  izard创建基于SDI的应用程序CBombApp,去除打印和状态条支持,在资源编辑器中修改菜单和相应的加速键,使其与Windows扫雷游戏一致。具体为开局(ID-GAME-BEGIN)、初级(ID-GAME-JUNIOR)、中级(ID-GAME-MIDDLE)、高级(ID-GAME-SENIOR)、自定义(ID-GAME-CUSTOM)、颜色(ID-GAME-COLOR)、英雄榜(ID-GAME-SORT)、退出(ID-GAME-EXIT)、帮助(ID-HELP)。

  2. 在资源编辑器中对应于雷区的每个小区域的13个属性。用画笔或其他绘图工具绘制出相对应的13个10乘10的16色小位图,三个对应于小人表情的20乘20的16色小位图,供更换颜色时使用的一套与前16个对应的单色位图,显示时间和雷数的0~9十个数字位图(底色为黑色)。

  定制CUSTOMER对话框,内含三个静态文本控件和三个编辑控件,三个编辑控件分别对应成员m_iRowNum,m_iColumnNum,m_iBombNum。该对话框用于定制雷数,行列数,其相应的MFC类为CCustomer。定制SORT对话框,内含九个静态文本控件,其中六个显示排行榜的姓名和时间,其对应的MFC类为CSort。定制INPUT对话框,内含一个静态文本控件和一个编辑控件,编辑控件用于在游戏成功结束时输入姓名,其对应的MFC类为CInput。

  3. 定义类Bomb,封装每颗雷的相关属性。

  Class Bomb

  {

  public:

  int isbomb;//决定初始时是否是雷

  bool issel; //判断区域是否被处理过且周围有雷

  bool isdone;//判断递归时是否被处理过

  int num; //周围雷数

  bool findbomb; //排雷者认为是雷时置一(但是不一定真是雷)

  } ;

  4. 重载CMainFrame中PreCreateWindow,并设置相应属性,使其窗体大小固定,这样就固定了显示区域的大小为初始10乘10个雷和外加雷区上部的控制区域,部分代码如下。

  cs.style=WS_OVERLAPPED|WS_SYSMENU| WS_BORDER|WS_MINIMIZEBOX;

  cs.cy = 10*15+6;

  cs.cx = 10*15+60; //6和60分别是横纵的附加值,用于边框、菜单、标题条、控制区域。

  5. 游戏的主要工作就是呈现不断变换的图形或动画,并按用户的输入交互进行显示,而Windows文档-----视窗构架中的视窗的功能正是接受用户输入并负责显示,因此由CView类来完成扫雷的大部分工作。在CBombView中定义下列成员变量记录相关操作的结果或对象的状态。

  Bomb m_bomb[30][30]; //最大的地雷区域

  CString m_CurrentTime; //用于记录并显示扫雷时间

  CTime m_BeginTime;//记录游戏开始时的时间

  BOOL m_TimerBegin;//定时器是否开启

  int m_iBomNum;//雷的数目

  int m_iRow;//雷的行数

  int m_iColumn;//雷的列数

  int m_iBombFound;//指示被认为是雷的数目

  CBitmapButton m_bitButton;//控制区的位图按钮

  int m_CurrentLevel;//指示当前游戏的级别

  BOOL m_bIsColor;//指示当前是彩色还是单色

  CBitmap m_bmBomb[12];//用于存放12个小位图

  int m_iGameOver;//游戏未结束置0,已清除所有的雷置1,被炸死置2。

  重载CBombView中OnCreate函数创建位图按钮,该位图按钮的两幅位图对应了正常、排雷正确两种状态,当要显示被炸死的状态时应动态销毁该按钮,并重新创建一位图对应正常和被炸死两种状态,将该位图按钮的ID号定为ID_GAME_BEGIN,这样一来当点击按钮时便可重新开始游戏,部分代码如下。

  CRect rcclient;

  GetClientRect(&rcclient);

  CRect rect(rcclient.cx/2-8,10,rcclient.cx/2+8,20);

  m_Button.Create("New",BS_DEFPUSHBUTTON|WS_VISIBLE|

  BS_OWNERDRAW,rect,this,ID_GAME_BEGIN);

  m_Button.LoadBitmaps(IDB_FACE1, IDB_FACE2);

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇用VC++设计语法编辑器 下一篇VC++中实现数据加密

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目