初女模图片-
毕
题
业
论
文(设
计)
目
五子棋游戏的设计与实现
陕西理工学院毕业设计
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的
指导下进行的研究工作及取得的 成果。尽我所知,除文中特别加以标注和
致谢的地方外,不包含其他人或组织已经发表或公布过的研究成 果,也不
包含我为获得
及其它教育机构的学位或学历而使用过的 材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的
说明并表示了谢 意。
作
者
签
名:
日
期:
指导教师签名:
日
期:
使用授权说明
本人完全了解
大学关于收集、保存、使用毕业设计(论文)的
规定,即:按照学校要求提交毕业设计(论文) 的印刷本和电子版本;学
校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览
服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不
以赢利为目的前提下,学校可 以公布论文的部分或全部内容。
作者签名:
日
期:
I
陕西理工学院毕业设计
学位论文原创性声明
本人郑重声明:
所呈交的论文是本人在导师的指导下独 立进行研究所取
得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何
其他个 人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献
的个人和集体,均已在文中以明确方式 标明。本人完全意识到本声明的法
律后果由本人承担。
作者签名:
日期:
年
月
日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、
使用学位 论文的规定,
同意学
校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被< br>查阅和借阅。本人授权
大学可以将本学位 论文的全部或部分
内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保
存和 汇编本学位论文。
涉密论文按学校规定处理。
作者签名:
日期:
年
月
日
导师签名:
日期:
年
月
日
II
陕西理工学院毕业设计
注
意
事
项
1.
设计(论文)的内容包括:
1
)封面(按教务处制定的标准封面格式制作)
2
)原创性声明
3
)中文摘要(
300
字左右)、关键词
4
)外文摘要、关键词
5
)目次页(附件不统一编入)
6
)论文主体部分:引言(或绪论)、正文、结论
7
)参考文献
8
)致谢
9
)附录(对论文支持必要时)
2.
论文字数要求:理工类设计( 论文)正文字数不少于
1
万字(不包括图纸、程序清单等),文科
类论文正文字数不少 于
1.2
万字。
3.
附件包括:任务书、开题报告、外文译文、译文原文(复印件)。
4.
文字、图表要求:
1
)文字通顺,语言流畅,书写字迹工整, 打印字体及大小符合要求,无错别字,不准请他人代
写
2
)工程设计类题目 的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技
术标准规范。图表整洁,布局 合理,文字注释必须使用工程字书写,不准用徒手画
3
)毕业论文须用
A4
单面打印,论文
50
页以上的双面打印
4
)图表应绘制于无格子的页面上
5
)软件工程类课题应有程序清单,并提供电子文档
5.
装订顺序
1
)设计(论文)
2
)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订
III
陕西理工学院毕业设计
五子棋游戏的设计与实现
[
摘要
]
五子棋是起源于我国古代的黑白棋种之一,是一种简单的娱乐性较 强的大众游戏,深受广大玩家的喜
爱,但同时作为比赛,五子棋游戏还有着深奥的技巧。
本系统的实现采用了
C
语言的模块化的程序设计方式,用
Visual C++ 6.0
软件来实现程序的编译运行。实现黑
白两方分别落子,通过棋盘上方的棋盘动态 信息提示,轮流落子,本系统中游戏的每一个功能在程序中都是一个相
对独立的模块,比如,棋盘模块, 棋子模块,选择游戏模式模块,悔棋模块等等在程序中都是独立的,但它们之间
通过逻辑关系的链接又构 成了一个可以使游戏正常运行的程序。
为实现游戏的双人对战模式和人机对战模式,并使得游 戏尽量的简单化,本系统需要达成以下目标:设计一个
简洁的游戏初始界面
;
制定合法 规则,使游戏能公正的进行,并且可以断定胜
;
支持人机对战模式,可以是电脑通过
人 工智能和合法规则选出最优落子位置
;
可以悔棋,在玩家落子落错位置时,可按下悔棋键进行悔 棋。
[
关键词
]
五子棋,游戏设计,
C
语 言,双人对战,人机对战,人工智能
IV
陕西理工学院毕业设计
Designer and implementation of gobang game
Author: wangyong
(Grade11,Class 1, Major in Information and computing science, Mathematics and computer science Dept.
Shaanxi University of Technology, Hanzhong 723000,Shaanxi)
Tutor: Tuo shouheng
Abstract
:
Gobang is one of the black and white kind of originated in ancient China, is a simple and entertaining
stronger mass games, loved by the majority of players, but at the same time as the game, gobang game with profound skills.
The implementation of this system has adopted C of modular program design method, using Visual C + + 6.0 software
to realize the program compiler running. Implementation of black and white two parties move later, respectively, by the board
at the top of the dynamic message board, take turns to move later, this game in the system each function in the program is a
relatively independent modules, such as, the board module, pawn module, select game mode module, back module and so on
in the program are independent, but the link through the logical relationship between them and form a can make the normal
operation of the game program.
In
order
to
realize
the
double
mode
and
man-machine
game
mode,
and
make
the
game
as
far
as
possible
the
simplification, the system needs to achieve the following goals: design a simple game of initial interface
;
the legal rules, can
make the game fair, and you can call
;
support the man-machine mode, can be a computer by artificial intelligence and legal
rules to select the optimal move later
;
can take back, fall in the players move later fault location, can press the back button to
back.
Key words
:
gobang
,
Game design
,
The C Programming Language
,
Double against
,
The man-machine against
,
Artificial intelligence
(
AI
)
V
陕西理工学院毕业设计
目
录
1.
绪论
.
........................ .................................................. ................................ 1
1.1
引言
.
.............................. .....................
1
1.2
研究的背景及意义
........................................
1
1.2.1
研究背景
...........................................
1
1.2.2
研究意义
...........................................
1
1.3
基本目标及主要内容
......................................
1
2.
系统开发环境的介绍及选择
............. .................................................. ... 1
2.1 C
语言
.................... ..............................
1
2.2
开发及运行环境
..........................................
2
3.
需求分析
..................... .................................................. ........................... 2
3.1
总体需求分析
............................................
2
3.2
可行性分析
..............................................
2
3.2.1
技术可行性分析
.....................................
2
3.2.2
经济可行性分析
.....................................
2
3.2.3
操作可行性分析
.....................................
2
3.3
功能分析
.......................... ......................
2
4.
概要设计
............................... .................................................. ................. 3
4.1
五子棋特点与规则
........................................
3
4.2
流程图
................. .................................
3
4.3
双人模式
.......................... ......................
5
4.4
人机模式
.......................... ......................
5
4.5
智能算法
.......................... ......................
5
4.6
悔棋流程
.......................... ......................
6
4.7
输赢判断
.......................... ......................
6
5.
详细设计
............................... .................................................. ................. 6
5.1
画出游戏界面
............................................
6
5.2
画出棋子
................ ................................
8
5.3
设置棋局规则
...........................................
1
0
5.3.1
落子规则
..........................................
1
0
5.3.2
悔棋规则
..........................................
1
1
5.3.3
输赢规则
..........................................
1
1
5.4
实现双人对战
...........................................
1
2
5.5
悔棋功能
............... ................................
1
2
5.6
判断输赢
.......................... .....................
1
4
5.7
退出游戏
.......................... .....................
1
6
5.8
实现人机对战
...........................................
1
6
5.8.1
先手设置界面
......................................
1
6
5.8.2
电脑智能落子
......................................
1
7
5.8.3
可以悔棋、退出
....................................
2
1
5.8.4
显示输赢
..........................................
2
1
5.9
各模块之间的衔接
.......................................
2
2
6.
总结
.
......... .................................................. ............................................. 24
致谢
.
.............................. .................................................. ............................ 25
参考文献
...... .................................................. ............................................. 26
VI
1.
绪论
1.1
引言
随着社会经济和科学技术的发展,计算机已经深入到人们日常工作和生活的方方 面面,
各种各样的程序软件也逐渐进入大众的生活,
比如在闲暇时间的娱乐生活也开始变得被网 络
电子游戏等所充斥。
而五子棋则是最受人们欢迎的一款益智类棋局游戏,
它的简单性 ,
娱乐
性,竞技性注定它是一款火爆的游戏。
1.2
研究的背景及意义
1.2.1
研究背景
五子棋游戏软 件可以分为两种:
一种是网络五子棋游戏软件,
另一种是单机五子棋游戏
软件。
我设计的是单机版的五子棋游戏软件,
这款软件可以供人们在闲暇时间随时随地进行
娱乐,并 提高自己的棋艺,实用性较强。游戏的行棋顺序为:黑先、白后,黑棋第一子从天
元开始相互依次落子< br>,
任一方先在棋盘上形成横向或竖向或斜向的连续的颜色相同的五个以
上
(含五个
)
棋子则该方为胜。该系统所实现的功能主要有三大功能:游戏选项、游戏设置、< br>帮助。
1.2.2
研究意义
五子棋是起源于中国古代的传 统黑白棋种,
当今社会在不同的地域对五子棋也有不同的
称呼
,
其也是一种必 须动用脑力的益智类游戏,所以五子棋可以增强思维能力,提高智力。
其中蕴含古典哲学的高深学问“阴阳易理”
哲理,
有利于修身养性,
它因为简单易学的特点,
所以为人 民群众所喜爱,但作为一项高水平的国际比赛,它也有深奥技巧。
1.3
基本目标及主要内容
本系统是根据传统五子棋游戏的功能编写,
实现了双人 对战和人机对战。
主要需实现如
下目标:
(
1
)
Visual C++ 6.0
环境的下的
C
语言编程
(
2
)五子棋棋盘的设计
(
3
)五子棋棋子的设计
(
4
)黑白双方轮流落子的实现
(
5
)棋局的悔棋功能
(
6
)棋局进行时的退出功能
(
7
)胜负的判定
(
8
)人工智能算法分析
2.
系统开发环境的介绍及选择
2.1 C
语言
C
语言诞生于
1972
年的美国,在次之前还有
A
语言(其创造设 计者是一位女性)和
B
语言。现在
C
语言成为了世界上使用最广泛的,最流行 的高级程序设计语言之一。
随着经济与科技的发展,微型计算机日渐普及,这导致了
C
语言的版本的多样化,出
现了一些不一致的语言特点。
为了改变这种情况
,
美国国家标准研究所制定推广了一套
ANSI
标准,作为现行的
C
语 言标准。常用的编译软件有
Microsoft Visual C++
。
C
语言绘图能力强,具有很好的可移植性,并具备很强的数据处理能力,因此适于编写
系统软件。它是数值计算的高级语言。由文献
[1-4]
可知。
2.2
开发及运行环境
编程语言:
C
语言
操作系统:
Windows 7
开发工具:
Microsoft
Visual C++ 6.0
3.
需求分析
3.1
总体需求分析
五子棋游戏是一款很符合现代人的休闲特点的益智类游 戏,
其是我国古代围棋的的衍生
物,本系统主要分为两部分:双人人对战和人机对战。
双人对战模式实现的功能:选择双人对战,游戏界面,实现双人轮流落子,棋盘动态信
息显示, 判断输赢,重新开始游戏。
人机对战模式实现的功能:选择人机对战,设置先手,实现玩家与 电脑轮流落子,棋盘
动态信息显示,判断输赢,重新开始游戏。
3.2
可行性分析
3.2.1
技术可行性分析
计算机硬件和软件技术的飞速发展,
为游戏系统的开发提供了设备条件。
当前在网络上
有许多的五子棋软件可供参考借鉴,
而且我自己也熟练地掌握了
C
语言在
Mi crosoft
Visual
C++ 6.0
环境下的基本应用,因此本游戏的开发技术上是完全可行的。
3.2.2
经济可行性分析
该游戏适用于所有人群,开发该游戏的费用主要 包括开发阶段的费用以及今后的运行、
维护费用。五子棋游戏简单易学,为人民群众喜闻乐见。该游戏功 能强大,界面简单,用户
在使用方面不存在任何障碍。其开发具有很强的经济性。
3.2.3
操作可行性分析
本游戏适用于
Windows
操作系统之上
,
对于该游戏的推广使用提供了 很好的平台。
该
游戏使用
C
语言编写,具有很强的移植性,使其可以运行很方 便。在操作上主要凭借使用
Windows
键盘操作,方便简单。使用前只要对用户进行简单的说明即可。
3.3
功能分析
该款游戏主要是由以下五个模块组成:
五
子
棋
游
戏
人
机
对
战
双
人
对
战
悔
棋
功
能
退
出
功
能
判
断
输
赢
图
3.1
游戏功能图
4.
概要设计
4.1
五子棋特点与规则
五子棋是两方之间进行的竞技活动,专用棋盘为
15*15< br>,五连子的方向为横、竖、斜;
任一方在棋盘上形成横向、竖向、斜向的连续的相同颜色的五个( 含五个以上)时即为该方
胜利;在棋盘上以对局双方均不可能形成五连为和棋。黑白双方依次落子,由黑 方先下,由
于先下一方在局面上占优,所以五子棋规则分为禁手和无禁手两种。
禁手规则:
禁手是针对先行的黑棋而言,
以限制黑棋 的先行优势为目的。
对局中如果黑
棋违反禁手规则将被判负。
以中国五子棋竞赛规则为 例,
有三三禁手
(黑棋一子落下时同时
形成两个或两个以上的活三,此子必须为两个活 三共同的构成子)、四四禁手(黑棋一子落
下同时形成两个以上的冲四或活四)
、
长连 禁手
(黑棋一子落下形成一个或一个以上的长连)
。
无禁手指不对黑棋的先行优势做任 何限制。
本系统采用的是无禁手规则。
4.2
流程图
游戏开始后,运行过程如下图
4.1
所示:
否
开始游戏
人机对战
是
双人对战
是
电脑先手
黑方落子
是
电脑落子
任
意
方
向
有
五
子
相
连
或
棋
盘
落满
任
意
方
向
有
五
子
相
连
或
棋
盘
落满
任
意
方
向有
五
子
相
连
或
棋
盘
落满
是
否
玩家落子(黑)
是
否
电脑落子
否
白方落子
否
玩家落子
(白)
任意
方
向
有
五
子
相
连
或
棋盘
落满
否
否
否
任< br>意
方
向
有
五
子
相
连
或
棋< br>盘
落满
任
意
方
向
有
五
子
相
连
或
棋
盘
落满
是
是
是
游戏结束
图
4.1
游戏运行流程图
当系统运行后,首先看到的是一个选择 游戏模式(双人,人机)的界面,根据要求选择
后,有两种情况,第一种是双人模式,根据游戏的设定先 黑方落子,然后白方落子,而系统
此时需要更新棋盘的状态和判断是否产生输赢,
若是产生则游 戏结束,
若没有产生输赢,
则
判断是否棋盘已经落满棋子,
若已经落满棋子,
则判定为和棋,
否则另一方落子,
如此循环,
直到产生输赢或和棋;另一种是 人机模式,选择该模式后,会看到设置界面,可以选择谁是
先手,有两种选择电脑先手、玩家先手,若电 脑先手则根据设定,电脑执黑子先下,之后白
方落子,
此时因为选择了电脑先手,
所以 电脑落子时优先进攻,
只有在进攻的权值小于防守
的权值时优先防守,
(此处涉及到电 脑的人工智能,
此部分的设计概要详见本章节的电脑智
能落子部分),
每当棋盘落子后电脑立即更新棋盘的具体信息并判断是否已经产生输赢若是
产生则游戏结 束,若没有产生输赢,则判断是否棋盘已经落满棋子,若已经落满棋子,则判
定为和棋,否则另一方落子 ,如此循环,直到产生输赢或和棋,玩家先手,则玩家执黑子先
落子,然后电脑落白子,此时电脑落子优 先防守,其他部分与电脑先手一样。
4.3
双人模式
此模式较为 简单是后面实现人机模式的铺垫。首先用循环语句和制表符画出整个棋盘,
然后利用绘图函画出棋子,然 后制定自己的落子规则(包含输赢规则),并用循环语句实现
黑白子的轮流下子,如此就实现了双人对战 的目的。
4.4
人机模式
本系统中此功能的实现是在双人模式已 经实现的情况下实现,
只是把双人模式中的其中
一个人换成电脑操作(电脑落子算法参照
4.5
智能算法),在每次落子之后,调用判断输赢
函数判断是否产生输赢或和棋,
如果产生则游戏结束,
如果没有产生则继续游戏,
直到产生
输赢或和棋,或退出游戏为 止。
4.5
智能算法
电脑博弈模仿人类下棋,
传统算法 使用的是博弈树。
两人游戏,
甲有很多位置选择落子,
乙也有很多相对应的下法,如果所有的方式列表就构成一棵树,
就是搜索树,
也被称为博弈
树。树的根节点先 手的第一步位置,下面的走棋方法构成树的子节点,直到游戏结束。此处
的五子棋棋盘是
15< br>×
15
的,搜索空间是一个巨大的数字。博弈算法的任务是在这些呈几何
级数上 升的子节点中选出最优的节点,
从而赢得比赛。
整个算法分为搜索和估值两部分,
估< br>值是评估所有可能的落子位置的评价,选择评价最高的位置为最终落子位置。
本系统的 估值函数为单点估值函数。单点估值函数的基本思想是评估当前的静态情况
下,遍历棋盘,对棋盘的每个 非空的位置的四个方向进行分析评估
(
横向、竖向、两条对角
线
)
, 统计每一个棋型的数量(连五型、冲四型、活四型、活三型、死三活二型),不同的
棋型根据实际情况中 玩游戏时的经验确定一个不同的权重值,最后还有位置分数的加权
(
不
仅要考虑空点对 自己的价值,也要考虑其对对方的价值
)
,如此就获得了棋盘上的空点的估
值。
单点估值函数只能估计一个空点的价值,
对当前的棋局,
把所有的空点对己方的有利程
度总和和不利程度总和相关就可得出全局价值。由文献
[5. 6. 14]
可知。
本系统中设定了以下几种棋型和相应的权值:
表
4.1
防守棋型及其相应权值表
棋型
权值
棋型
权值
连五型
200000
连五型
2000000
冲四型
1100
冲四型
2000
活四型
6000
活四型
24000
活三型
240
活三型
850
死三活二型
20
死三活二型
125
表
4.2
进攻棋型及其相应权值表
根据不同棋型的权值可以计算出棋盘的各点的价值之和,< br>用
V
ij
表示点
(
i
,
j
)
的总价值,
用
A
ij
表示点(
i
,
j
) 的进攻价值,用
D
ij
表示点(
i
,
j
)的防守价 值,用
d
t
表示防守优先级
数,
a
t
表示进攻优先 级数,其中防守和进攻优先级数是电脑在比较点(
i
,
j
)的进攻总价值和防守总价值后赋予的,给总价值大的类型设定优先级数为
2
,而价值小的则为
1
。
则点(
i
,
j
)的进攻总价值为该点的所有进 攻棋型的和,计算方法为:
?
A
ij
;
该点的防守总价值 为该点的所有防守棋型的和,计算方法为:
?
D
ij
。
则 该点的总价值为:
V
ij
?
?
A
ij
?
a
t
?
?
D
ij
?
d
t
。
用此方法就可遍历棋盘上的所有的空点的总价值,
然后比较所有总价值的大小,
总价值
最大的点即为对自己最有利的点。
4.6
悔棋流程
悔棋是棋局类游戏的必须的功能,
在游戏时,如果有人悔棋时,
立即调用悔棋功能函数,
本系统中由于棋盘上的所有的交点都有一个二维 数组的一组数据与之相对应,
而且每次落子
后会有一个二维数组记录相应的信息(步数,棋子颜 色),因此此功能的实现依靠的是
C
中的循环函数。
4.7
输赢判断
本模块功能的实现依靠的是单点估值函数的思想,
即每次落子之后,
遍历以该点为坐标
原点以
5
为半径的棋盘的交点,分析原点 的四个方向(横向、竖向、两条对角线),判断是
否有连五型棋型,若有则产生输赢,若没有则遍历整个 棋盘,查看是否棋盘已经下满,若已
下满则判定为和棋,否则继续游戏。
5.
详细设计
5.1
画出游戏界面
本模块是整 个游戏系统的平台性模块,
之后所有的功能都将依附该模块来体现,
主要需
实现棋盘的 绘制与游戏说明。
本游戏系统选择的是
15*15
的棋盘,
利用制表符字符串 打印输
出棋盘,并且特别标出天元位置,与四方星位。游戏的说明主要有棋局动态信息显示,如何
移动光标,如何实现落子,如何悔棋以及退出。
利用
switch()
语 句,当光标坐标(
x
,
y
)中
x=0
,
y=0则画出棋盘的左上角“┏”,
y=14
则画出棋盘的右上角“┓”,
0
x=3
或
x=11
时,
y=0
则
画出棋盘的左边线“┠”,
y=3
或
y=11
则画出棋盘 上的四方星位“╋”,
y=14
则画出棋盘
的右边线“┨”,
0
x=7
,
y=7
则画出棋盘的天元“╋” ,
0
x=14
,
y=0则画出棋盘的左下角“┗”,
y=14
则画出
棋盘的右下角“┛”,
0< y<14
时则出棋盘的下边线“┷”;当
x
为
0
到
14的其他的值时,
y=0
则画出棋盘的左边线“┠”,
y=14
则画出棋盘 的右边线“┨”,
y
为
0
到
14
的其他的
[7]< br>值时画出棋盘的交叉点“┼”
。
棋盘上的交点称为位点(包括交叉点,天元,四方星位,边界交点)。
具体实现如以下程序(仅部分主要代码):
void printnode(NODE chessboard[][15], int x, int y) //
打印棋盘上的一个点
{
textcolor(CHESSBOARD);
if(chessboard[x][y].step==0)
{
if (x==cursor.x && y==cursor.y)
textcolor(CURSOR);
//
如果光标在这个点,改成光标颜色
switch(x)
{
case 0:
if(y==0) printf(
┏
//
左上角
else if(y==14) printf(
┓
右上角
else printf(
┯
//
上边线
break;
case 3:
if(y==0) printf(
┠
//
左边线
else if(y==3 || y==11) printf(
+
星位
else if(y==14) printf(
┨
//
右边线
else printf(
┼
//
交叉点
break;
case 7:
if(y==0) printf(
┠
//
左边线
else if(y==7) printf(
+
//
星位
else if(y==14) printf(
┨
右边线
else printf(
┼
//
交叉点
break;
case 11:
if(y==0) printf(
┠
//
左边线
else if(y==3 || y==11) printf(
+
星位
else if(y==14) printf(
┨
右边线
else printf(
┼
//
交叉点
break;
case 14:
if(y==0) printf(
┗
//
左下角
else if(y==14) printf(
┛
右下角
else printf(
┷
//
下边线
break;
default:
if(y==0) printf(
┠
//
左边线
else if(y==14) printf(
┨
右边线
else printf(
┼
//
交叉点
} }
}
void printchessboard(NODE chessboard[][15])
{//
输出整个棋盘
int i,j;
char letter[]={
ABCDEFGHIJKLMNO
n
for(i=0;i<15;i++)
{
//
行
textcolor(TEXTS);
//
改为文本颜色
printf(
//
打印行坐标
for(j=0;j<15;j++)
//
列
printnode(chessboard,i,j); //
打印棋盘的每一块
textcolor(TEXTS);
printf(
}
textcolor(TEXTS);
//
改为文本颜色
printf(
%s
打印列坐标
printf(
移动
:
方向键
下棋
:ENTERn
悔棋
:U
}
退出
:F12n
图
5.1
人机对战玩家先手初始界面
图
5.2
人机对战电脑先手初始界面
双人对战模式游戏的初始界面与人机对战电脑先手初始界面一样。
5.2
画出棋子
本模块是在画出棋盘的基础下实现的,
要求依次轮 流画出黑白两种颜色的棋子,
且位置
必须在棋盘的位点之上,并且要求必须先画黑棋,位置为棋 盘的天元位。
根据棋盘上光标所在位置来下棋,
如果当前光标所在位置上有棋子,
则不能在此处落子,
则需按下键盘上的方向键来移动光标到没有棋子,< br>且有利于局势的位置按下
Enter
(回车键)
[7]
落子
。
具体实现如以下程序(仅部分主要代码):
else if(chessboard[x][y].color==0)
{ //
如果是白棋
if (x==cursor.x && y==cursor.y)
textcolor(SELECTEDWHITE); //
被选中的白棋
else textcolor(WHITECHESS); //
未被选中的黑棋
printf(
●
} //
打印棋子
else
{ if (x==cursor.x && y==cursor.y)
textcolor(SELECTEDBLACK); //
被选中的黑棋
else textcolor(BLACKCHESS); //
未被选中的黑棋
printf(
●
打印棋子
光标的移动
(
实现在棋盘上任意位置落子
)
:
bool getmove(NODE chessboard[][15])
{//
获取光标移动,并响应
//
当按下悔棋、下子、退出热键时,返回
true
char c; for(;;)
{ c=getch();
if(c==-32)
switch(getch())
{
case 72: //
上
cursor.x--;
if(cursor.x<0) cursor.x=0;
renew(chessboard,cursor.x+1,cursor.y);
renew(chessboard,cursor.x,cursor.y); break;
case 80: //
下
cursor.x++;
if(cursor.x>14) cursor.x=14;
renew(chessboard,cursor.x-1,cursor.y);
renew(chessboard,cursor.x,cursor.y); break;
case 75: //
左
cursor.y--;
if(cursor.y<0) cursor.y=0;
renew(chessboard,cursor.x,cursor.y+1);
renew(chessboard,cursor.x,cursor.y); break;
case 77: //
右
cursor.y++;
if(cursor.y>14) cursor.y=14;
renew(chessboard,cursor.x,cursor.y-1);
renew(chessboard,cursor.x,cursor.y); break;
case 134: //
退出
quit=true;
return true; }
else if(c==13 && chessboard[cursor.x][cursor.y].step==0)
return true; //
下子
else if(c=='U' || c=='u')
{ //
悔棋
regret=true; return true;
}
}
}
5.3
设置棋局规则
本模块实现的是游戏的规则,包括落子规则,悔棋规则,输赢规则。
5.3.1
落子规则
本系统的实现整体上采用的是无禁手五子棋游戏规则。
落子规则包括落子位置与落子顺
序。
落子位置其实是对第一颗棋子的限定,
即 第一颗棋子必须落在棋盘的天元
(也就是棋盘
的最中间),而后只规定了必须落在棋盘的位点之 上,不能落在空白处,而落子顺序其实是
从第一次下子开始的,
且第一颗棋子必须是黑子,之后黑白棋就开始轮流落子,
直到产生输
赢为止。
本系统中涉及到的五 子棋的基本棋型有防御棋型和进攻棋型两类,
具体有:
连五型,
活
四型,冲四 型,活三型,死三活二型五种,具体如下:
图
5.3
连五型(黑棋)
图
5.4
活四型(黑棋)
图
5.5
冲四型(黑棋)
图
5.6
活三型(黑棋)
图
5.7
死三活二型(黑棋)
5.3.2
悔棋规则
悔棋规则应用于游戏的整个过程,
在游戏产生 输赢之前的任意时候,
只要玩家按下悔棋
热键,就可进行悔棋,且本系统中不限制悔棋步数。具 体实现见
5.5
悔棋功能。
5.3.3
输赢规则
本系统的输赢规则是基于无禁手五子棋的输赢规则,
即对黑子没有任何限制,
只要形成
连五型棋子就判定为胜利,
当棋盘上无法落子时仍然没有产生输赢,
则判定为平局。
具体实
现见
5.6
判断输赢。
5.4
实现双人对战
本模块实现的是两个人类玩家在一台电脑上进行游戏, 本部分不涉及电脑的
AI
,只需
要电脑提供一个平台(显示器的功能),本部分的实现 较为简单,在以上两个模块即画出棋
盘模块和画出棋子模块功能实现的基础上,
两个玩家就可以 自由的进行游戏,
双方通过依次
控制电脑键盘上的方向键移动光标到自己认为合理的地方落子。 每当棋盘上有棋子落下以
后,
电脑需立即判断是否已经产生输赢,
如果没有产生输赢则 在棋盘动态信息显示处显示该
黑(或白)方下子,如果已经产生输赢则在盘动态信息显示处显示白(或黑 )方胜利!此时
按任意键即可重新开始游戏。
5.5
悔棋功能
< br>本模块的创建是根据现实中玩五子棋游戏时的实际存在的情况而编写的,当玩家下棋
后,发现不是 最佳的位置,或者是棋子没有落在自己想要落的位置,发生偏离,此时就需要
用到本模块的功能:悔棋功 能。
本游戏系统中,悔棋的功能实现主要是通过数组
chessboard[][1 5]
来完成的,当系统
接收到悔棋的消息时调用悔棋函数
void beback(NODE chessboard[][15], int step)
,在
双人模式和人机模式中悔棋的方式是一样的,当棋盘上的棋子少于
3
个时,按下悔棋键时,由于本系统的默认设置(即第一颗棋子为黑棋,且位置必须在天元位置),所以系统判定此
时想悔棋 的是白棋,
故而去掉一颗白棋,
棋盘为开始游戏的初始界面,
即棋盘上只有天元位置有一颗黑棋,此时光标也回到刚刚白棋的位置。当棋子多余
3
个时,按下悔棋键后,由于
系统无法判定是白棋想悔棋,还是黑棋想悔棋,故而一次撤销两步,即当该黑棋落子时,按
下了 悔棋键,
会撤销两步,
即撤销了白棋刚刚走的一步和黑棋刚刚走的那一步,
光标也回到
刚刚黑棋的位置。此时如果是黑棋想悔棋则黑棋重新落子在其他不同于刚刚撤销的那个位
置,< br>白棋则见招拆招,
而如果是白棋想悔棋则黑棋把棋子下在原来的位置,
此时白棋就可以< br>[8]
重新落子在其他的位置,以此来实现悔棋
。
本游戏系统中没有限制悔棋的步数,可以无限制悔棋,直到第一步。
具体实现程序如下(仅部分主要代码):
void beback(NODE chessboard[][15], int step)
{//
悔棋
int i,j,tempx,tempy;
if(step==1) return; //
如果才开始,直接返回
if(step>2)
{ //
如果下了多于两步
for(i=0;i<15;i++) //
搜索前两步所下的位置
for(j=0;j<15;j++)
{
if(chessboard[i][j].step==step-1)
{ //
找到上一步
chessboard[i][j].step=0; //
清空棋子标志
renew(chessboard,i,j);
} //
重绘棋盘
else if(chessboard[i][j].step==step-2)
{ //
找到上两步
chessboard[i][j].step=0; //
清空棋子标志
tempx=cursor.x; //
记录光标位置
tempy=cursor.y;
cursor.x=i; //
将光标回复到两步前的位置
cursor.y=j;
renew(chessboard,i,j); //
重绘棋盘
renew(chessboard,tempx,tempy); //
重绘光标原本所在处
}
}
}
else if(step==2)
{ //
如果下了一步
for(i=0;i<15;i++) //
搜索上一步所下的位置
for(j=0;j<15;j++)
if(chessboard[i][j].step==step-1)
{ //
找到上一步
chessboard[i][j].step=0; //
清空棋子标志
renew(chessboard,i,j);} //
重绘棋盘
tempx=cursor.x; //
记录光标位置
tempy=cursor.y;
cursor.x=7;
cursor.y=7; //
将光标移回棋盘中央
renew(chessboard,i,j); //
重绘棋盘
renew(chessboard,tempx,tempy); //
重绘光标原本所在处
}
}
图
5.8
悔棋
A
图
5.9
悔棋
B
5.6
判断输赢
本 模块的功能是每当棋子落下后判断是否已经产生输赢,
若已产生则重新开始游戏,
若
没 有产生则判断是否已经落子
225
步,
如果已经
225
步,
则判定为双方平局,
并重新开始游
戏,如果没有达到
225
步,则继续游戏。
本部分功能的实现主要也是通过二维数组
chessboard[][15]
,在双人对战和人机对战
中都调用
bool
inside(int
x,
int
y)
,
int
line(NODE
chessboard[][15],
int
dirt,
int
x, int
y, int color)
,
bool
win(NODE chessboard[][15],
int x, int y, int color)
三
[13]
个函数来具体的实现该功能
。
具体实现程序如下(仅部分主要代码):
bool inside(int x, int y)
{//
如果不在棋盘内返回
false
,否则返回
true
if(x<0 || x>14 || y<0 || y>14)
return false;
return true; }
int line(NODE chessboard[][15], int dirt, int x, int y, int color)
{//
判断颜色为
color的点
(x,y)
,在
dirt
方向上有多少相连的同色棋子
int i;
for(i=0;chessboard[x+di rection[dirt][0]][y+direction[dirt][1]].step>0
&& chessboard[x+direction[dirt][0]][y+directi on[dirt][1]].color==color;i++)
{
x=x+direction[dirt][0]; y=y+direction[dirt][1];
if(!inside(x,y)) return i;
}
return i;
初女模图片-
初女模图片-
初女模图片-
初女模图片-
初女模图片-
初女模图片-
初女模图片-
初女模图片-
本文更新与2021-01-27 06:22,由作者提供,不代表本网站立场,转载请注明出处:http://www.xapfxb.com/yuer/429917.html