MFC制作五子棋

一、    结果展示:

二、    需求分析:

1)      五子棋游戏逻辑分析:

五子棋游戏规则简单易懂:棋盘大小为15*15;棋子分为黑白两色;若任意一方在“米字格”任意方向连成5子即为赢得胜利;

2)      MFC程序功能分析:

2.1)  程序支持选择棋盘颜色,并且菜单项界面要随之发生更新;

2.2)  程序支持新建游戏、保存游戏、打开游戏;

2.3)  程序支持悔棋功能;

3)      MFC界面分析:

3.1) Status Bar需要显示当前棋盘颜色以及提示下一步棋子的颜色;

3.2)Status Bar需要显示 Tool Bar按钮的帮助提示;

三、    代码设计:

1)       采用MFC中单文档 Document/View框架;其中,Document 子类(MyDVDocument)主要实现需求分析中的2.2以及管理游戏逻辑,并向View子类(MyDVView)提供界面更新的数据;

2)       游戏逻辑由Chess类、ChessManager类、ChessOperation类实现;Chess类对应棋子;ChessManager类负责管理整个游戏,是MyDVDocument类主要功能的底层实现;ChessOperation是自己实现的一个关于用户操作的链表类,主要支持悔棋操作;

3)       菜单由VS2017的资源编辑器编辑即可,并在MainFrame类中添加CToolbar类对象,在MainFrame的OnCreate函数里加载对应的资源文件;关于菜单项的相应事件主要在MyDVView里实现:菜单项界面更新就通过ON_UPDATE_COMMAND_UI消息映射完成;类图以及项目结构如下:

四、    知识点:

1)      游戏逻辑中主要是棋子的管理(ChessManager类),在判断游戏是否结束的函数里,我们需要分别检查“米”的三个方向,我们只需要以新增棋子为中心,检查其周围9个棋子,看是否连接成5子即可;

2)      MyDVView类的一个主要功能是相应鼠标点击事件,并且将屏幕的坐标系转化为游戏中的逻辑坐标;为了方便统一,我们游戏中的棋盘对应一个二维数组,从上到下、从左到右依次对应屏幕坐标系的Y、X轴,通过一个简单的转换函数即可实现;

3)      要实现保存游戏进度,就要实现MyDVDoc类的OnNewDocument函数以及OnOpenDocument函数;在这两个函数里需要我们处理一下界面更新的问题,比如通知MyDVView更新界面等;那么游戏数据是怎样从磁盘文件加载到类(MyDVDoc类)成员中的呢?完成这一功能的函数是MyDVDoc类的Serialize函数,该函数负责游戏数据的保存与读取,而且我们并不需要手动调用该函数:当系统捕捉到新建、保存等菜单项被点击时,系统(MFC框架)在完成一系列工作后会自动调用该函数,而且在调用OnNewDocument之类的函数时已经完成该步骤,所以游戏数据已为最新,所以通知View更新界面即可;

4)      还有的一个知识点就是菜单项以及状态栏相关信息的更新;既然是更新,那么就涉及到什么时候更新?如何更新这一问题。菜单项的更新包括在前面打钩、是否可用等。我们点击菜单栏里的按钮后会弹出一系列菜单项,在这些菜单项弹出之前,系统会调用这组菜单项的界面更新函数,而这些函数是通过消息(ON_UPDATE_COMMAND_UI)映射实现同菜单项的关联。不但状态栏也是一样,只是状态栏里的Panel更新是在程序处于空闲(就是消息队列中没有任何消息的时候)由MFC框架调用;我们只需要在相应函数里写好如何更新即可。

更新

—————————————————————————

有朋友说我的项目bug太多,程序不通,需要调试,不建议下载源码。

我自己刚才重新下载了源码,遇到两个问题:一是我的VS没有安装MFC,需要安装,二是SDK版本不对,重定向项目即可解决。这是因为我重装电脑后下载的新的VS,旧版本的SDK找不到也是理所当然。

另外,我承认工程中有功能不完善,其主要是在:

1. 一方获胜后,没有添加重新开局功能——其实就是一个函数调用的问题,即开局菜单项对应的功能函数,这一问题也导致保存获胜局后,再次打开文件时,可以继续下棋的bug;

2. 对悔棋操作没有做允许检查,所以在没棋可悔的情况下会出现空指针的问题——这的确是代码中的bug,是我的疏忽,没考虑到没棋可悔时点击悔棋按钮的情况),但解决起来应该也不难——可以判断操作栈是否为空,如果为空就将菜单项disable即可;

这是我们Windows编程的作业,重点在于MFC机制的了解,包括文件保存、菜单更新、底部状态栏的更新等内容,五子棋游戏规则的实现虽然重要,但不是重点,所以当时也没有十分在意;

程序就不更啦,至于其他bug,有发现的朋友,欢迎可以评论区指出;至于源码,其实编程中最没用的东西就是源码了~链接还在放下面,有意者请移步,无意者略过即可。

下面放几张我测试的图,以证明我不是一个随便骗积分的人。

项目源码CSDN下载

MFC实现五子棋游戏相关推荐

  1. 使用MFC实现五子棋

    本篇博文介绍使用MFC实现五子棋游戏,实现了五子棋的对弈.菜单栏.工具栏以及状态栏. 主界面 菜单栏 工具栏 底部状态栏 下面是核心代码,落子之后判断胜负: void CMy05gobangView: ...

  2. 基于MFC的五子棋(详细介绍,适合初学者)

    基于MFC的五子棋游戏 开发工具:VC++ 1. 建立界面,即先建立一个棋盘 1.1新建一个MFC工程 1.2往这个工程里面添加一些资源,里面的内容暂时可以先不管,等到后面我们再往里面添加东西 1.3 ...

  3. VC6.0 MFC 单文档 五子棋游戏 基础入门

    五子棋游戏 一.整体思路 1.目的:通过五子棋,掌握面向对象的思想,这是我们的目的.提升分析问题.解决问题的能力,在做项目之前要有一个系统的思路,第一步干什么,第二步干什么-- 2.思路:拿到这个问题 ...

  4. 五子棋的禁手c++语言实现,五子棋游戏软件的设计与实现 毕业论文.doc

    论文题目:五子棋游戏软件的设计与实现 教 学 站校本部学生姓名:指导教师:专 业:计算机科学与技术 2014年4月30日 摘要 C++语言是一种面向对象的语言,尽管在当前,可视化语言发展迅速,普及很快 ...

  5. 一小时学会C++开发双人对战版五子棋游戏,小白看完也能自己写游戏啦!

    VC++ 双人对战的五子棋游戏 界面新颖附源码,VC.NET源码项目,五子棋-UI美化实例源码.看一看截图吧,是不是看上去很有感觉的五子棋. 程序流程图: 游戏界面如下: 项目结构展示: 部分源码展示 ...

  6. 第30篇 Android Studio实现五子棋游戏(一)杂记

    第30篇 Android Studio实现五子棋游戏(一) 1.需求分析 1.1.判断胜负 1.2.AI拦截及获取落子位 2.界面 2.1.布局 2.2.名称和资源图片 3.接口联系 1.需求分析 五 ...

  7. 编写五子棋的完整python代码_python制作简单五子棋游戏

    本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下 #五子棋 '" 矩阵做棋盘 16*16 "+" 打印棋盘 for for 游戏是否结束 开 ...

  8. 基于python的游戏设计与实现-python五子棋游戏的设计与实现

    这个python的小案例是五子棋游戏的实现,在这个案例中,我们可以实现五子棋游戏的两个玩家在指定的位置落子,画出落子后的棋盘,并且根据函数判断出输赢的功能. 这个案例的思路如下所示: 首先,根据棋盘的 ...

  9. c语言五子棋开题报告,基于VC的五子棋游戏的设计与实现(附答辩记录)

    基于VC的五子棋游戏的设计与实现(附答辩记录)(包含选题审批表,任务书,开题报告,中期检查报告,毕业论文12300字,程序) 摘 要:以计算机技术和网络技术为核心的现代网络技术已在现实生活和生产中得以 ...

最新文章

  1. [转] vuewebpack多页面配置
  2. 院士论坛|李德仁:测绘遥感能为智能驾驶做什么? ——论测绘遥感与智能驾驶
  3. 顶会论文轮番炸场,本周哪些论文最值得读?
  4. why FOR ALL ENTRIES is not considered at all in one order search
  5. 排序算法之希尔排序(C/C++)
  6. Angular v6 正式发布
  7. 好的产品经理都是这样绘制原型图的(下)...
  8. 使用IE浏览器访问JSP界面,当使用断点时相关的样式会显示,当不适用断点时,相关的样式不会显示
  9. linux文件的三个主要的修改时间
  10. String s = new String(“xyz“);创建了几个字符串对象?
  11. sap 消耗策略999_SAP 计划策略测试一
  12. 测试能用的上的录屏软件 不喜勿喷
  13. 程序员常用的画图软件推荐
  14. 【超级账本】Fabric 层次结构以及核心模块的介绍(二)
  15. 3DMax教程: 3DMax快捷键与界面操作!
  16. 机器学习模型的部署上线方式
  17. wps word设置多级标题及对应目录
  18. 程序员常用英文名参考
  19. Ubuntu 安装磁盘分区及启动项添加
  20. 六祎-简单的排版表(python)

热门文章

  1. 网站首页html静态化,网站首页怎么静态化
  2. 锚点的使用(链接到网页中某个位置)
  3. linux系统ubuntu
  4. 【计算机组成原理】实验1: 基本逻辑单元实验
  5. 初始化Weex项目遇到的问题记录
  6. Keras中predict()方法和predict_classes()方法的区别
  7. 从记账软件看工具类APP的存量运营之道
  8. Python_day9:常用内建模块
  9. awk 字符串转时间戳
  10. TensorFlow实现自定义Op