黑白棋毕业论文
绝世美人儿
814次浏览
2021年01月18日 14:44
最佳经验
本文由作者推荐
笔记本使用寿命-孟郊简介
西安文理学院数学系学士学位论文
分类号:
西安文理学院数学系学士学位论文
黑白棋游戏设计与开发
系
院
名
称
数学系
指
导
老
师
闫利娟
学
生
姓
名
赵扬扬
学
生
学
号
专
业、班
级
数学与应用数学
07
级
3
班
提
交
时
间
2011
年
5
月
24
日
西安文理学院数学
西安文理学院数学系学士学位论文
西安文理学院数学系本科毕业论文任务书
论
文
题
目
毕业年份
学生姓名
指导教师
2011
系、专业、班级
学
号
职
称
黑白棋游戏设计与开发
数学系、数学与应用数学
3
班
赵扬扬
闫利娟
一、内容概要
随着世界经济的快速发展和计算机的日益普及,计算机游戏逐渐走进了 人们的生活,成为大
多数人娱乐休闲的主要方式。按照联网与否,计算机游戏可以分为单击游戏和网络游 戏,单机游
戏,指仅使用一台计算机或者其它游戏平台就可以独立运行的电子游戏。区别于网络游戏,它 不
需要专门的服务器便可以正常运转游戏,部分也可以通过局域网或者战网进行多人对战。游戏玩
家不连入互联网即可在自己的电脑上玩的游戏,模式多为人机对战。因为其不能连入互联网而互
动性稍 显差了一些,但可以通过局域网的连接进行多人对战,而不需要专门服务器也可以正常运
行的游戏。
本次毕业设计是基于
c++
语言,在
vs2005
平台上进行 的单机版游戏开发,通过本次游戏的开
发,有益于进一步掌握对
c++
语言的应用,加 深对计算机游戏的制作理念的理解,对我今后参与
更加复杂的游戏项目积累宝贵的经验!
黑白棋
(Reversi
、
Othello)
,也叫苹果棋,翻转棋,是 一个经典的策略性游戏。黑白棋是
19
世纪末英国人发明的。直到上个世纪
70
年代一个日本人将其发展,借用莎士比亚名剧奥赛罗
(othello)
为这个游戏重新命名 ,
也就是现在大家玩的黑白棋。
为何借用莎士比亚名剧呢?是因为
奥赛罗是莎士比亚一 个名剧的男主角。他是一个黑人,妻子是白人,因受小人挑拨,怀疑妻子不
忠一直情海翻波,最终亲手把 妻子杀死。后来真相大白,奥赛罗懊悔不已,自杀而死。黑白棋就
是借用这个黑人白人斗争的故事而命名 。
二、游戏规则
1
、游戏元素
棋盘:本游戏使用
8x8
的棋盘,每次落子只能放在棋盘的格子中。
棋子:本游戏使用黑白两种棋子。执黑者先行,在每次游戏开始时,由玩家进行选择, 若玩
家选择执黑,则计算机选择执白。反之相似!
2
、游戏玩法
(
1
)游戏的胜负:本游戏使用
8x8
的棋盘
,
由 两人执黑子和白子轮流下棋,最后子多方为胜
方。
(
2
)落子的要 求:轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋
子和原有的已方棋子夹住对 方的至少一个棋子
(
横竖斜夹均可
)
,然后把被夹住的子变成己方的颜
色
(
也叫吃子
)
。下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一 个格子移到另一个格子。
(
3
)取胜的技巧:一般说来,下棋过程中,你必 须尽量削减对手的行动力,同时增加自己的
行动力,这种策略我们称之为行动力原则
(
或行动力战术
)
。当一方达到或接近这个目标时,我们
就称该棋手控制了棋局。另外, 这个战术的目的是迫使对方下坏棋,如果对方虽然可选位置很少,
但每一步却总有好棋,那战术目的就没 有达成。记住,你必须让对方完全无好棋可下。
黑白棋规则规定只能在对方棋子相邻的空位 下棋,这就可以推出另一个原则。对方棋子边上
的空位越多,你下棋的选择也就越多,换句话说,你的行 动力就越强;相反,如果你棋子边上的
空位越少,对方可下的位置也就越少。我们把相邻位置上有空位的 子称为外子,反之称为内子,
连在一起的外子称为前线或墙。下棋时要尽量减少自己的外子。
1
西安文理学院数学系学士学位论文
三、文献查阅指引
[1]
王浩
.
游戏开发经典案例详解
.
北京:清华大学出版社
.2010:399-408.
[2] Stanley B. Lippman
著
.
李师贤译
.c++ Primer.
北京
.
人民邮电出版社
.2010.
[3]
詹红霞
侯思颖
陶永红等著
.Visual C++
程序设计教程
.
北京:清华大学出版社
.2007.
指导教师签名:
年
月
日
教研室意见
负责人签名:
年
月
日
系审核意见
负责人签名:
年
月
日
2
西安文理学院数学系学士学位论文
西安文理学院数学系本科毕业论文开题报告
论
文
题
目
毕业年份
学生姓名
2011
赵扬扬
系院
学号
黑白棋游戏设计与开发
数学系
专业、班级
数学与应用数学
07
级
3
班
指导教师
闫利娟
一、研究的价值和意义
随着 网络技术的日新月异和计算机的普及,
当今的计算机技术也走上了平民化和娱乐化的时
代,尤其 是游戏产业的发展已经成为信息产业中发展势头最猛烈最具前景的一个分支。
windows
是一款优秀免费的操作系统,目前使用用户持续增加。
windows
下的游戏目前非 常
多,未来几年内,
windows
游戏产业必将持续发展。
人工 智能是一门极富挑战性的科学,
随着计算机处理速度的飞速提高,
人们很早就提出了疑
问:计算机是否会超越人类?
结合上诉三者与一体,我决定用
C++
语言开 发一款小游戏,游戏内容来自网络上日渐流行的
一种智力游戏
‘黑白棋’
。
黑 白棋是一种在网络上日渐流行的小游戏,
本身的人机对战又需要考虑
到人工智能。
< br>因此,我希望把平时界面简单、选项复杂的游戏,在
windows
里面做成漂亮的、简 单的游戏
程序,以给
windows
玩家一个新的选择。
同时,利 用本课题设计的机会可以熟悉
c++
语言的各种特性,锻炼程序设计的实践能力,熟
悉
c++
语言
windows
下的开发环境
,
熟悉前沿的windows
图形用户界面的开发
,
以及巩固数据结构
和算法等课程的 学习成果,并深入理解数据结构和算法在程序设计中的核心地位。
最后,借助开发本次游戏的 过程,可以熟悉人工智能的程序实现,有助于掌握棋类所需人工
智能的常见算法,随着游戏产业的日益壮 大,人工智能在游戏中的突出表现,人工智能越来越得
到世人的重视。在这次的人机对战算法中,通过一 定的算法,实现电脑的下棋及走棋运作,加深
了对人工智能工作原理的了解。
3
西安文理学院数学系学士学位论文
二、研究的步骤方法
1
.研究的目标和内容
研究目标:
通过对黑白棋游戏规 则的研究,做出一款适合在
windows
系统下进行人机对弈的黑白棋程序
出来,是 本课题的研究总目标。
具体需要研究一下几方面:
1
黑白棋游戏规则;
2
黑白棋游戏技巧;
3
友好的用户界面;
4
单人模式的人工智能算法;
5
黑白棋游戏的常用功能(悔棋、难度选择等)
。
主要内容:
1
总体设计:
一款 黑白棋游戏软件主要分为界面开发、存储结构、规则设计、人工智能算法设计等四大模
块。
2
具体设计:
具体设计阶段要把总体设计阶段规划好的界面、存储、规则、算法等一一实现。
在界面阶段通过调查分析设计好的界面用绘图工具首先绘制出来,并在程序中得以显示。
存储阶段采用二维数组来表示每个棋盘位置的状态。包括该处为空、黑子、白子、可下子 点、
不可下子点等。
规则设计通过分析黑白棋游戏自身规则规律,用代码在程序里还原游戏自身的规则。
算法设计通过学习其他程序和书籍的算法,来写出一套适用于本程序自身的算法,已实现人
机对 弈的机器落子过程。
3
系统测试:
通过 不断对程序进行测试,找出程序中存在的
bug
,并修复
bug
,并不断完善 游戏的功能,增
加游戏的正确性和可玩性。
2
.拟采取的研究方法、研究手段及技术路线、实验方案等
1
开发环境:
开发语:
c++
语言;开发平台:
windows
操作系统中的
vs2005
平台。
2
研究方法及手段:
通过对比网上现有黑白棋游戏软件的优缺点,开发出一款更优秀的黑白棋游戏程序。
3
技术路线:
软件开发按照软件工程的思想进行。按照需求分析、系统设计、软件编程、软件测试、软件
维护的顺序依次进行,前一阶段的输出为后一阶段的输入。
4
实验方案:
在每次程序代码改变或完成时,进行程序测试,及时发现自身问题并改正错误。
4
西安文理学院数学系学士学位论文
三、黑白棋游戏的总体设想
1.
设计思路
本游戏设计是采用
MFC
对话框模式进行设 计开发。
所以从此游戏设计采用模块化思想,
即程序
整体设计分为五个模块来实现。分 别为:主界面对话框类、棋盘窗口类、人工智能算法类、规则
处理类、帮助对话框类。
2.
结构设计
棋盘状态用数组
a[8][8]
初值为0
表示空格。函数的实体比较简单,因为要输出图形,所以
应初始化图形系统,图形工作方 式正确确定后,画出棋盘,调用
playtopc()
人机对弈函数开始游
戏。一旦游 戏结束后,关闭图形系统,程序结束。
本次设计的主要函数有:
2.1. Create ()
创建游戏的窗口、游戏中的图片。
通过
windows
编程中的
LoadBitmap ()
加载游戏所需要的图片。
2.2. OnPaint ()
窗口绘图函数。
2.3. OnLButtonDown ()
鼠标左键响应函数,点击鼠标左键下棋
2.4. computer_play ()
电脑下棋函数
2.5. PlayMotive
()根据游戏的规则翻转棋盘的棋子
根据游戏的等级,按照不同的搜索深度进行判断,实现电脑下棋。
_move_chess()
判断能否下棋落子。
2.7. game_over ()
输出胜利者结果
根据分数值
score1
和
score2
的大小得出下棋的结果,输出赢者信息。
5
西安文理学院数学系学士学位论文
3.
流程图
3.1
交换棋手下棋流程图:
6
换棋手
更新棋盘
开始
当前位置能否棋
子?
Y
按鼠标左键下棋
统计分数
图
1
西安文理学院数学系学士学位论文
3.2
游戏的逻辑流程
开始
初始化游戏大小、棋盘
设置游戏的等级
点击鼠标左键
棋手走棋
Y
结束
格子已满或一方没子了?
N
调用
MoveColor
恢复格子
N
符合下子条件
?
换棋手
图
2
7
西安文理学院数学系学士学位论文
三、主要参考文献
[1]
George
Artificial
Intelligence:
Structures
and
Strategies
for
Complex
Problem
Solving Addison Wesley[M].2001-7
[2] Mat Techniques For Game Programming[M].Premier Press.2002.
[3]
张宏林
.
数字图像分析与处理技术
[M].
北京
:
人民邮电出版社
2003-2.
[4]
棋类游戏的智能模块设计――浅谈人工智能
[J].2004-09.
[5] 蔡自兴
,
徐光祐
.
人工智能及其应用(第三版)
[M].
北京
:
清华大学出版社
.2003-9.
[6]
杜秀全
,
程家兴
.
博弈算法在黑白棋中的应用
[J].2003.
指导教师意见及建议
签字:
年
月
日
系(院)主管主任意见及建议
签字(盖章)
:
年
月
日
8
西安文理学院数学系学士学位论文
黑白棋游戏设计
赵扬扬
(西安文理学院
数学系,陕西
西安
710065
)
摘要
:
本次毕业设计是基于
c+ +
语言,
在
vs2005
平台上进行的单机版游戏开发,通过
本次游 戏的开发,有益于进一步掌握对
c++
语言的应用,加深对计算机游戏的制作理念的理
解,对我今后参与更加复杂的游戏项目积累宝贵的经验!
黑白棋
(Reversi< br>、
Othello)
,也叫苹果棋,翻转棋,是一个经典的策略性游戏。黑白
棋 是
19
世纪末英国人发明的。
直到上个世纪
70
年代一个日本人将其 发展,
借用莎士比亚名
剧奥赛罗
(Othello)
为这个游戏重新命名,也 就是现在大家玩的黑白棋。为何借用莎士比亚
名剧呢?是因为奥赛罗是莎士比亚一个名剧的男主角。他是一个黑人,
妻子是白人,
因受小
人挑拨,
怀疑妻子不忠一直情海翻波 ,
最终亲手把妻子杀死。
后来真相大白,
奥赛罗懊悔不
已,自杀而死。黑白棋 就是借用这个黑人白人斗争的故事而命名。
关键词
:
c++
编程;
windows
编程;
MFC
技术
9
西安文理学院数学系学士学位论文
论文目录
第一章
引言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„
1
1.1
c++
简介„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„
1
1.2
window
编程介绍„„„„„„„„„„„„„„„„„„„„„„„„„„„„„
1
1.3
Visual studio
开发平台简介„„„„„„„„„„„„„„„„„„„„„„„„
1
第二章
毕业业设计的目的及要求„„„„„„„„„„„„„„„„„„„„„„„„
2
< br>2.1
毕业设计的目的„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„
2
2.2
毕业设计的开发环境„„„„„„„„„„„„„„„„„„„„„„„„„„„ „
2
2.3
毕业设计所需的知识„„„„„„„„„„„„„„„„„„„„„„„ „„„„„
2
2.4
毕业设计要求„„„„„„„„„„„„„„„„„„„„„„ „„„„„„„„„
2
第三章
毕业设计的内容„„„„„„„„„„„„„„„„„„„„„„„„„„„„
3
3 .1
程序功能介绍„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„
3 < br>3.2
程序整体设计说明„„„„„„„„„„„„„„„„„„„„„„„„„„„„„
4
3.3
程序源代码及注释„„„„„„„„„„„„„„„„„„„„„„„„„„„„ „
7
第四章
结束语„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„
23
10
西安文理学院数学系学士学位论文
第一章
引言
1.1 c++
语言介绍
C++
这个词在中国大陆的程序员圈子中 通常被读做
“
C
加加”
,
而西方的程序
员通常读做“
C plus plus
”,“
CPP
”。
它是一种使用非常广 泛的计算机编程
语言。
C++
是一种静态数据类型检查的,
支持多重编程范式 的通用程序设计语言。
它支持过程化程序设计、
数据抽象、
面向对象程序设计、
制作图标等等泛型程序
设计等多种程序设计风格。
1.2 windows
编程介绍
Windows
是微软推出的图形界面的操作系统 ,有
windows2000
、
XP
、
Vista
、
win7
等各种版本。是一种抢占式多任务的操作系统,是
PC
上的主流操作系统,
在
PC
操作市场占绝大多数网络游戏的客户端、服务器端都可在上运行。
< br>Windows
程序由一个或多个的窗口组成,通常是多个窗口。窗口一般是一个
矩形的 区域,
由
windows
对窗口进行统一管理。
任何的文字、
图形都 写窗口中显
示。
windows
系统设计为事件驱动的操作系统,事件在
windows
定义为消息,消
息为应用程序和应用程序间、
应用程序和操作 系统间提供了信息传递的渠道。
消
息队列,由
Windows
维持。
1.3 Visual studio
开发平台简介
Visual
Studio
是微软公司推出的开发环境,
visual
S tudio
可以用来应用创
建
windows
平台下的
window s
程序和网络应用程序,也可以用来创建网络服务、
智能设备应用程序和
Office
插件。目前已经开发到
10.0
版本,也就是
Visual
Studio 2010.
我们本次毕业设计的开发平台就是其中的
Visual Studio 2005
。
1
西安文理学院数学系学士学位论文
第二章
毕业设计的目的与要求
2.1
毕业设计的目的
通过对 黑白棋游戏规则的研究,
做出一款适合在
windows
系统下进行人机对
弈 的黑白棋程序出来,是本课题的研究总目标。
具体需要研究一下几方面:
1
.黑白棋游戏规则;
2
.黑白棋游戏技巧;
3
.友好的用户界面;
4
.单人模式的人工智能算法;
5
.黑白棋游戏的常用功能(难度选择)。
2.2
毕业设计的开发环境
开发语:
c++
语言;
开 发平台:
windows
操作系统中的
vs2005
平台。
2.3
毕业设计所需的知识
熟悉
c++
语言及
vs2005
开发平台。
2.4
毕业设计要求
1.
分析毕业设计题目的要求
2.
写出详细设计说明
3.
编写程序代码,调试程序使其能正确运行
4.
设计完成的软件要便于操作和使用。
2
西安文理学院数学系学士学位论文
第三章
毕业设计的内容
3
.
1
程序功能介绍
1
.显示游戏的界面功能
游戏界面上包括游戏等级选择、重新开始、游戏帮助的控件对游戏进行相应
的设置。
2
.接受鼠标输入功能
能够接受玩家的鼠标输入功能,把棋子放入指定的位置。
3
.根据规则翻转相应的棋子
无论是电脑或是玩家在棋盘中落下棋子后,能 够根据游戏的规则,把横向、
纵向及对角直线上的棋子全部翻转过来,
变成最后落下棋子的颜色 ,
并对棋子数
量进行增减。
4
.游戏胜负判断功能
双方都没有棋子可下时棋局结束,以棋子数目来计算胜负,棋子多的一方获
胜。
在棋盘还没 下满时,
如果一方的棋子应经被对方吃光,
则棋局结束。
将对手
棋子吃光的一 方获胜。
5
.实现人机对战模式
支持人工智能,根据游戏等级的 不同,进行不同的算法深度搜索,找出最合
理的位置进行落子操作。
6
.人工智能的等级设置
能够指定当前电脑人工智能的等级。
根据不同的等级,
其算法搜索深度不同。
7
.游戏提供帮助说明
在游戏界面中,提供一个控件。以方便对本游戏不了解的玩家对游戏进行操
作和使用。
黑白棋功能架构:
3
西安文理学院数学系学士学位论文
黑
白
棋
棋
子
操
作
功
能
棋
子
翻
转
功
能
主
界
面
显
示
功
能
人
工
智
能
功
能
帮
助
功
能
棋
棋
子
动
画
翻
转
棋
子
数
组
更
新
子
及
棋
盘
的
显
示
游
戏
等
级
的
设
置
图
3-1
3
.
2
程序整体设计说明
1
.设计思路
本游戏设计是采用
MFC
对话框模式进行设 计开发。所以从此游戏设计采用模
块化思想,即程序整体设计分为五个模块来实现。
主界面对话框类:主要负责主界面及棋盘、棋子的显示及棋盘窗口对象的创
建和调用。
棋盘窗口类:主要负责接受玩家鼠标输入的棋子位置及棋子翻转动画等
处
理。
4
西安文理学院数学系学士学位论文
人工智能算法类:主要负责电脑的人工智能算法的处理。
规则处理类:主要负责棋子数据的统计、落子位置有效及胜负判断等处理。
帮助对话框类:主要负责帮助提示的显示及其他辅助消息。
黑
白
棋
游
戏
2
.程序结构(流程图)
主
界
面
对
话
框
类
棋
盘
窗
口
类
规
则
处
理
类
人
工
智
能
算
法
类
帮
助
对
话
框
类
3-2
5
图
西安文理学院数学系学士学位论文
载入游戏初始化
N
判断有斯是否开始
游戏设置
Y
Y
设置游戏等级
帮助
弹出帮助
对话框
点
击
鼠
标
左键下棋
高
中
低
N
电脑
下棋
N
N
判断棋盘变化
Y
调用
PlayMotive
函数
改变前盘棋子
盘其中白棋和黑棋是否
满足结束条件
Y
游戏结束
图
3-3
6
西安文理学院数学系学士学位论文
3
.程序结果
人执黑 棋,
电脑执白棋,
轮流走棋,
每方都试图在游戏结束前让自己棋子的
数目多于 对方。按鼠标左键可以摆放棋子。下到最后谁的棋子多,谁赢。
3.3
程序源代码及注释
1
、游戏对话框中控件的设置
消息与成员函数映射:
BEGIN_MESSAGE_MAP(COthelloDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_HELP, &COthelloDlg::OnBnClickedButtonHelp)
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_RADIO1, &COthelloDlg::OnBnClickedRadio1)
ON_BN_CLICKED(IDC_RADIO2, &COthelloDlg::OnBnClickedRadio2)
ON_BN_CLICKED(IDC_RADIO3, &COthelloDlg::OnBnClickedRadio3)
ON_BN_CLICKED(IDC_START, &COthelloDlg::OnGameStart)
END_MESSAGE_MAP()
帮助控件的实现:
void COthelloDlg::OnBnClickedButtonHelp(){
// TODO:
在此添加控件通知处理程序代码
HelpDlg helpDlg;
l();
}
“低”空间的实现:
void COthelloDlg::OnBnClickedRadio1()
{
// TODO:
在此添加控件通知处理程序代码
g_iGameLevel = LEVEL_LOW;
}
“中”控件的实现:
void COthelloDlg::OnBnClickedRadio2()
{
// TODO:
在此添加控件通知处理程序代码
g_iGameLevel = LEVEL_NOR;
}
“高”控件的实现:
void COthelloDlg::OnBnClickedRadio3()
{
// TODO:
在此添加控件通知处理程序代码
g_iGameLevel = LEVEL_HIGH;
7
西安文理学院数学系学士学位论文
}
游戏开始控件的实现
:
void COthelloDlg::OnGameStart()
{
// TODO:
在此添加控件通知处理程序代码
GameStart();
}
void COthelloDlg::GameStart()
{
m_nBlackCount = 2;
m_nWhiteCount = 2;
m_e();
}
2
、棋盘窗口的设计
CChessBoard
类的构造函数:
CChessBoard::CChessBoard()
{
m_iMotiveNumber=0;
m_iMotivex = m_iMotivey=0;
m_bPlayMotive = FALSE;
init_board(&m_oChessBoard);
}
CChessBoard::~CChessBoard()
{
}
消息与成员与函数映射
:
BEGIN_MESSAGE_MAP(CChessBoard, CWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_CREATE()
ON_MESSAGE(UM_COMRUN, OnComRun)
ON_MESSAGE(WM_TRANCHESS, OnTranChess)
END_MESSAGE_MAP()
延时函数:
void delay(INT32 millisecond)
{
clock_t start = clock();
do
{
MSG msg;
if (::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
{
if ( !AfxGetApp()->PumpMessage())
8
西安文理学院数学系学士学位论文
{
::PostQuitMessage(0);
return;
}
}
}while(clock()
}
改变棋子接口函数
LRESULT CChessBoard::OnTranChess(WPARAM wParam, LPARAM lParam)
{
int row = wParam/10-1;
int col = wParam%10-1;
CRect r(col*COL_WIDTH+22, row*ROW_WIDTH+22,
col*COL_WIDTH+COL_WIDTH+22, row*ROW_WIDTH+ROW_WIDTH+22);
m_bPlayMotive = FALSE;
OnPaint();
InvalidateRect(&r);
if((lParam>>16) !=0)
PlayMotive(row, col, UINT8(lParam));
return 0;
}
由电脑人工智能下棋
LRESULT CChessBoard::OnComRun(WPARAM wParam, LPARAM lParam)
{
computer_play(&m_oChessBoard, m_hWnd);
UINT16 wscore, bscore;
get_chess_score(&m_oChessBoard, wscore, bscore);
GetParent()->SendMessage(UM_RECALC, WPARAM(wscore|0x80000000),
LPARAM(bscore));
return 0;
}
新游戏
void CChessBoard::NewGame()
{
if(cur_step >0)
{
g_bStart = 1;
init_board(&m_oChessBoard);
Invalidate();
}
}
窗口建立函数
9