windows SDK的C语言黑白棋开发 推荐
2010-09-20 22:18
197 查看
最近在做数据结构的课程设计,选择了难度最大的黑白棋开发,因为已经决定使用纯C进行开发,所以之前朋友们说使用MFC开发就果断不去做了。网上有很多黑白棋的源码,不过大部分C语言的源码不是调用graphic库开发就是使用C++进行MFC开发,极少有像我这样用着纯C调用着Windows API进行开发的例子,所以既然自己痛苦了那么久,如果以后有人也想和我一样痛苦,我这里分享一下我的经验,就算不能从技术上帮到他,也能从心理上安慰一下他。废话不多说,直接来谈我的设计吧。
实现方式:
因为上次的C语言课设我就使用了Graphics库进行了dos图形界面的实现,所以这次数据结构的实验我想使用不同的实现方式,就采取了纯C调用SDK函数进行设计windows程序,但我还没有形成完整的面向对象的思想,所以在一开始就放弃了使用MFC编写程序。其实MFC也就是把windows的API用class进行封装了再使用,在网上能找到很多使用MFC写的黑白棋程序,但极少能有使用纯C直接调用windows API写的程序,我想这一点应该是一个突破。当然我并不是说使用MFC写程序不如SDK编程,只是为了将来更好的学习MFC,眼下我有必要掌握SDK编程,这样可以帮助我更加了解MFC Classes的结构,而MFC没有提供的API功能自己可以调用API来实现,当MFC Classes不合我的需求时我可以方便的更改其Class。总之最后我决定采取SDK编程。
知识储备:
因为之前我编写windows程序的经历就只有写过一个对话框程序的俄罗斯方块,那个逻辑相比黑白棋要简单很多,所以这次其实我还是得从头开始学习编写windows程序。我需要了解事件驱动的过程,需要了解windows一些基本的API 功能,还需要了解windows的消息处理机制,同时我还需要保持头脑清醒去设计我的程序逻辑,当然,这些知识大部分都能在MSDN中查询到,所以这个暑假MSDN我看了很久。
难点疑问:
因为在windows程序的编译器环境下调试起来比一般的程序调试要困难,虽然断点可以随便打,但想要拦截消息却不是那么容易,而且由于windows编程经验不足,导致在编程时走了很多弯路,本来可以不发送消息的地方我还特意显示的调用API发送消息,比如绘制主窗口的地方,当窗口被移动或是被挡住时,程序会自动向窗口句柄发送WM_PAINT消息,因为之前不知道这点,在程序设计时自己显示调用函数发送这个消息,结果导致界面不停闪烁。这类问题很多,相信老师明白我说的意思。相比较而言黑白棋逻辑的设计反倒显得简单点,因为网上有很多资料可供查阅,光黑白棋的下子算法就有一大堆,什么基本搜索算法,α-β剪枝算法,主要变化搜索算法,Zobrist散列算法,MTD(f)算法,迭代加深搜索算法等等,有很多这方面的资料可以查阅,但同时我也看到了我的不足,对于这些算法,看虽然看的懂,但让我自己设计恐怕无法设计出这些巧妙的算法,还有些算法我甚至现在无法明白究竟是什么意思,比如模拟退火算法,神经网络算法等等。数据结构就是算法的基础,可见我还有很多需要学习的地方。
资源设计:
本程序是windows下的程序,必然需要寻找资源,如图片,声音等等。这次我在网上下载了大量的黑白棋图片和声音资源,最终采取了一组黑白棋的资源,用VC++的资源编辑器编辑进了工程:
然后我自己创建了多个对话框和菜单也作为资源进行编辑:
1、关于黑白棋的对话框:
2、开局选项对话框:
3、进入英雄榜对话框:
4、帮助对话框:
5、英雄榜对话框:
6、设置对话框:
7、输棋对话框:
8、赢棋对话框:
9、平棋对话框:
10、菜单:
模块设计:
我对这个黑白棋程序做过两次模块设计,第一次我分了4个模块,主模块,绘图模块,逻辑控制模块,结束处理模块,后来我发现这样的设计太过于拘泥于软件成型的过程,而且我的程序不是一个非常大的工程,整个程序只有约2000行代码左右,所以我省去了前期的模块设计,直接进行编码,最终只有一个main.c的主模块程序,其他的逻辑功能实现全部交由main.h来实现,在global.h中定义了全局变量,resource.h文件是资源编辑器自动生成的文件,记录了各种资源的ID宏定义。
AI设计:
电脑黑白棋最核心的部分就是搜索算法,它实际反映了黑白棋程序的算棋过程。搜索算法的好坏,将直接影响着程序的算棋速度和棋力。下面我们就从最基本的搜索算法开始。
对于图1所示的局面,白棋有三步棋可下:D6、F4、F6,黑白棋程序将如何找出最佳的棋步呢?
图1 白先,三步棋可下
其实程序的算棋过程和人类棋手很相似,它先对当前局面所有能下的棋步进行搜索,计算出每种棋步变化之后的局面,并根据各种局面结果,从中找出对自己最有利的一步棋。我们先来看看程序算一步棋的情况。在图1中,如果白棋分别下D6、F4、F6后,将形成图2、图3、图4三种局面。
图2 黑先,估值为0
图3 黑先,估值为+6
图4 黑先,估值为0
程序将对这三个局面分别进行评估,看看局面是优势还是劣势?这个局面评估过程一般由估值函数来完成。估值函数将根据盘面上棋子的分布情况,给出一个表示局面优劣程度的评估数值,这就称为估值。一般来说,估值为正时,表示局面处于优势,正值越大,优势越大;反之,负值表示劣势。例如,图3的局面对于黑棋而言略占优势,程序可能会给出+6的估值;而对于图2和图4,由于局面对双方均势,估值都是0。由于局面的优劣是相对的,对于一方来说是优势的局面,换从另一方角度来看就会是完全相反的结果。
估值可以有不同的取值范围,许多程序的估值是取值[-64, +64],以便直观地表示对终局比分的评估,如“估值为+6”则表示当前局面具有胜6子的优势。
通过对这三步棋所形成的局面进行评估,程序就可得到各步棋的估值(见图5)。由于这时下棋方是白棋,F4这步棋的估值就成了负值。换句话说,F4这步棋对白棋不利。
图5 白先,三步棋的估值
很显然,面对各种可能的棋步及其估值,下棋方最终会选择估值最大、也就是对自己最有利的那步棋。因此,白棋会选择下D6或F6,而不会下F4。程序的搜索过程就是将估值极大化,从而找出最佳棋步。
本程序的AI我设计为三个等级,第一个等级的AI采用的是最简单的估值函数,使用的是模板估值,而且模板是固定的,棋盘上各个地方的值是确定的,所以这个等级的AI没有随机性,有确定的走法,人很容易就能够赢了它;第二个等级的AI采用的是翻转能够赢得棋子最多的那步落子,如果出现有多处翻转的棋子一样多的情况就设置随机量,从中任选一个。这样设计的棋力也是十分低的,因为了解黑白棋的人都知道,黑白棋的关键在于谁先能抢占到4个角落,因为角落一旦被抢到就不会再改变颜色了,所以角落的值应该最高,还有边的分值应该也很高,而且边的各处分值也应该不一样,这在我的估值模板中有所体现。第三个等级的AI本来是想采用深层搜索多步来实现更加精确的估值,并采用α-β剪枝算法来进行优化的,但时间不足,所以没有完善它。
函数调用关系图:
主界面:
由于代码太长,所以我这里就不贴出来了,需要的朋友可以留下联系方式。如果正好有做过黑白棋设计的朋友可以和我交流下,我过段时间也想试下MFC设计。
实现方式:
因为上次的C语言课设我就使用了Graphics库进行了dos图形界面的实现,所以这次数据结构的实验我想使用不同的实现方式,就采取了纯C调用SDK函数进行设计windows程序,但我还没有形成完整的面向对象的思想,所以在一开始就放弃了使用MFC编写程序。其实MFC也就是把windows的API用class进行封装了再使用,在网上能找到很多使用MFC写的黑白棋程序,但极少能有使用纯C直接调用windows API写的程序,我想这一点应该是一个突破。当然我并不是说使用MFC写程序不如SDK编程,只是为了将来更好的学习MFC,眼下我有必要掌握SDK编程,这样可以帮助我更加了解MFC Classes的结构,而MFC没有提供的API功能自己可以调用API来实现,当MFC Classes不合我的需求时我可以方便的更改其Class。总之最后我决定采取SDK编程。
知识储备:
因为之前我编写windows程序的经历就只有写过一个对话框程序的俄罗斯方块,那个逻辑相比黑白棋要简单很多,所以这次其实我还是得从头开始学习编写windows程序。我需要了解事件驱动的过程,需要了解windows一些基本的API 功能,还需要了解windows的消息处理机制,同时我还需要保持头脑清醒去设计我的程序逻辑,当然,这些知识大部分都能在MSDN中查询到,所以这个暑假MSDN我看了很久。
难点疑问:
因为在windows程序的编译器环境下调试起来比一般的程序调试要困难,虽然断点可以随便打,但想要拦截消息却不是那么容易,而且由于windows编程经验不足,导致在编程时走了很多弯路,本来可以不发送消息的地方我还特意显示的调用API发送消息,比如绘制主窗口的地方,当窗口被移动或是被挡住时,程序会自动向窗口句柄发送WM_PAINT消息,因为之前不知道这点,在程序设计时自己显示调用函数发送这个消息,结果导致界面不停闪烁。这类问题很多,相信老师明白我说的意思。相比较而言黑白棋逻辑的设计反倒显得简单点,因为网上有很多资料可供查阅,光黑白棋的下子算法就有一大堆,什么基本搜索算法,α-β剪枝算法,主要变化搜索算法,Zobrist散列算法,MTD(f)算法,迭代加深搜索算法等等,有很多这方面的资料可以查阅,但同时我也看到了我的不足,对于这些算法,看虽然看的懂,但让我自己设计恐怕无法设计出这些巧妙的算法,还有些算法我甚至现在无法明白究竟是什么意思,比如模拟退火算法,神经网络算法等等。数据结构就是算法的基础,可见我还有很多需要学习的地方。
资源设计:
本程序是windows下的程序,必然需要寻找资源,如图片,声音等等。这次我在网上下载了大量的黑白棋图片和声音资源,最终采取了一组黑白棋的资源,用VC++的资源编辑器编辑进了工程:
然后我自己创建了多个对话框和菜单也作为资源进行编辑:
1、关于黑白棋的对话框:
2、开局选项对话框:
3、进入英雄榜对话框:
4、帮助对话框:
5、英雄榜对话框:
6、设置对话框:
7、输棋对话框:
8、赢棋对话框:
9、平棋对话框:
10、菜单:
模块设计:
我对这个黑白棋程序做过两次模块设计,第一次我分了4个模块,主模块,绘图模块,逻辑控制模块,结束处理模块,后来我发现这样的设计太过于拘泥于软件成型的过程,而且我的程序不是一个非常大的工程,整个程序只有约2000行代码左右,所以我省去了前期的模块设计,直接进行编码,最终只有一个main.c的主模块程序,其他的逻辑功能实现全部交由main.h来实现,在global.h中定义了全局变量,resource.h文件是资源编辑器自动生成的文件,记录了各种资源的ID宏定义。
AI设计:
电脑黑白棋最核心的部分就是搜索算法,它实际反映了黑白棋程序的算棋过程。搜索算法的好坏,将直接影响着程序的算棋速度和棋力。下面我们就从最基本的搜索算法开始。
对于图1所示的局面,白棋有三步棋可下:D6、F4、F6,黑白棋程序将如何找出最佳的棋步呢?
图1 白先,三步棋可下
其实程序的算棋过程和人类棋手很相似,它先对当前局面所有能下的棋步进行搜索,计算出每种棋步变化之后的局面,并根据各种局面结果,从中找出对自己最有利的一步棋。我们先来看看程序算一步棋的情况。在图1中,如果白棋分别下D6、F4、F6后,将形成图2、图3、图4三种局面。
图2 黑先,估值为0
图3 黑先,估值为+6
图4 黑先,估值为0
程序将对这三个局面分别进行评估,看看局面是优势还是劣势?这个局面评估过程一般由估值函数来完成。估值函数将根据盘面上棋子的分布情况,给出一个表示局面优劣程度的评估数值,这就称为估值。一般来说,估值为正时,表示局面处于优势,正值越大,优势越大;反之,负值表示劣势。例如,图3的局面对于黑棋而言略占优势,程序可能会给出+6的估值;而对于图2和图4,由于局面对双方均势,估值都是0。由于局面的优劣是相对的,对于一方来说是优势的局面,换从另一方角度来看就会是完全相反的结果。
估值可以有不同的取值范围,许多程序的估值是取值[-64, +64],以便直观地表示对终局比分的评估,如“估值为+6”则表示当前局面具有胜6子的优势。
通过对这三步棋所形成的局面进行评估,程序就可得到各步棋的估值(见图5)。由于这时下棋方是白棋,F4这步棋的估值就成了负值。换句话说,F4这步棋对白棋不利。
图5 白先,三步棋的估值
很显然,面对各种可能的棋步及其估值,下棋方最终会选择估值最大、也就是对自己最有利的那步棋。因此,白棋会选择下D6或F6,而不会下F4。程序的搜索过程就是将估值极大化,从而找出最佳棋步。
本程序的AI我设计为三个等级,第一个等级的AI采用的是最简单的估值函数,使用的是模板估值,而且模板是固定的,棋盘上各个地方的值是确定的,所以这个等级的AI没有随机性,有确定的走法,人很容易就能够赢了它;第二个等级的AI采用的是翻转能够赢得棋子最多的那步落子,如果出现有多处翻转的棋子一样多的情况就设置随机量,从中任选一个。这样设计的棋力也是十分低的,因为了解黑白棋的人都知道,黑白棋的关键在于谁先能抢占到4个角落,因为角落一旦被抢到就不会再改变颜色了,所以角落的值应该最高,还有边的分值应该也很高,而且边的各处分值也应该不一样,这在我的估值模板中有所体现。第三个等级的AI本来是想采用深层搜索多步来实现更加精确的估值,并采用α-β剪枝算法来进行优化的,但时间不足,所以没有完善它。
函数调用关系图:
主界面:
由于代码太长,所以我这里就不贴出来了,需要的朋友可以留下联系方式。如果正好有做过黑白棋设计的朋友可以和我交流下,我过段时间也想试下MFC设计。
相关文章推荐
- [Object-C语言随笔之一]Mac os 下搭建iOS开发环境 推荐
- 【Linux 操作系统】阿里云服务器 操作实战 部署C语言开发环境(vim配置,gcc) 部署J2EE网站(jdk,tomcat)
- 安卓开发推荐网址
- 论坛源码推荐(10月9日):Swift开发知乎日报客户端,轻量级自定义相机
- 推荐一系列优秀的Android开发源码
- Android开发13——内容提供者ContentProvider的基本使用 推荐
- 前端project师养成记:开发环境搭建(Sublime Text必备插件推荐)
- Adreno GPU与游戏开发相关工具推荐
- 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】06-变量与内存
- Windows phone 应用开发[14]-调用WebBrowser 推荐
- 关于软件质量(2)- 开发 vs 测试 推荐
- 【241期门诊集锦】正确高效的Android应用程序开发 推荐
- iOS开发学习之C语言---C04 一维数组、字符数组
- IOS开发---- IOS7官方推荐图标和图像尺寸
- iOS开发学习之C语言---C10 函数指针-3
- C语言编程开发中用好位操作符
- 推荐10款编程工具:为多核开发保驾护航
- 前端开发工程师必读书籍有哪些值得推荐?
- java后台开发推荐书籍
- 自学宝典:10个学习Android开发的网站推荐