用C语言设计黑白棋游戏
别妄想泡我
669次浏览
2021年01月18日 14:41
最佳经验
本文由作者推荐
张骞出使西域的故事-建筑施工管理
安康学院
学
年
论
文
﹙
设
计
﹚
题
目
用
C
语言设计黑白棋游戏
学生姓名
李文静
学
号
2009222427
所
在
院
(
系
)
电子与信息工程系
年
级
09
级
2
班
专业班级
电子与信息工程
指导教师
陈守满
完成日期
2011
年
8
月
30
日
用
C
语言设计黑白棋游戏
李文静
(
安康学院
电信系
电子与信息工程
09
级
2
班
)
指导教师:陈守满
摘
要
本课题设计一个 黑白棋游戏系统,
游戏通过相互翻转对方的棋子,
最后以棋盘
上谁的棋子多来判断胜负 。
它的游戏规则简单上手很容易,
但是它变化又非常复杂。
我选择
这个题目做 设计,
一方面是巩固和提高以前所学
C
语言知识,
另一方面是因为这可能是我 第
一次完成一个软件的系统设计,
选择一个中等难度且相对成熟的软件来设计既易于实现又留< br>有一定的上升空间,
符合我的实际情况。
我所设计的这种黑白棋游戏有几个特点:
程序短小
精悍简洁明了,游戏界面美观,功能丰富容易操作,趣味性强。
关键词
:
程序设计;
C
语言;黑白棋;两人对弈
The black and white chess that based on the C
language
Author:Li Wenjing
(Department of electronic and Information Engineering
Ankang university)
Directed by Chen Shouman
Abstract:
This topic is to design a Reversi game system. The game flips through each
other's game pieces. And last the people who has more chess pieces than the other, will
win. The game rules are simple and easy to use. But It changes very complex. I choose
this
topic
to
do
the
design,
one
is
the
consolidation
and
improvement
of
previously
learned
C
language
knowledge,
on
the
other
hand,
is
because
it
is
my
first
time
to
complete
a
software
system
design.
Selection
of
a
medium
difficulty
and
relatively
mature software design is easy to implement and have certain ascendant space. It
’
s fit in
with
my
actual
situation.
I
designed
this
game
has
several
characteristics:
Dappering
procedures
concise.
The
game
interface
aesthetics.
The
function
is
rich
and
easy
to
interesting.
Key word:
Program design. C language. The black and white chess. Chess
1
引
言
我国是棋文化的发祥地之一,
上古的尧时代围棋就在我国诞生了,
在随后的
几千年长河里,我国人民不断以自己的聪明才智创造出深受人们喜爱的棋类游
戏,像 中国象棋、五子棋、军棋等等一直是在民间很流行的棋类项目。同时国外
的棋类游戏也流传到中国,比如 国际象棋、跳棋等,逐渐在国内盛行。可以说棋
类游戏一直是我国人民喜闻乐见的一种休闲方式,
由于棋类游戏都是比较注重智
力策略的,所以从中也可以折射出我国人民的智慧。
黑白棋游戏起源于古希腊,
在日本和西方国家比较盛行,
其独特的游戏规则,
对人类智 慧进行着不断地挑战和激励,
因此人们一直乐此不疲。
加上上世纪后期
电脑的普及,< br>使黑白棋在全球范围内风靡,
人们通过电脑可以轻松地实现人机对
弈或者双人对弈。
黑白棋,又叫“
Othello
棋”或者“翻转棋”
。在西方和日本很 流行。是
19
世纪末英国人发明的。
直到
20
世纪
70年代一个日本人将其发展,
也就是现在大
家玩的黑白棋。
游戏通过相互翻转对方的 棋子,
最后以棋盘上谁的棋子最多来判
断胜负。其游戏规则比较简单,因此容易学会,但是变化 却又非常复杂。有一种
说法是:只要几分钟学会,但却要一生的时间去精通。
1.1
设计目的
在程序设计中,我们将主要通过
C
语言,运用面向对象的 程序设计方法
[1]
,
开发此款黑白棋游戏。
力争使程序短小精悍简洁明了,
游戏界面色彩丰富给人以
良好的视觉冲击,并且容易操作,功能丰富趣味性强,能供两人对弈。
1.2
运行环境
本游戏短小精悍,而且对电脑配置 的要求均不高,目前几乎所有的
PC
机均
可运行该游戏。
但是为了能让大家更 好地体验该款游戏,
我们给出如下的最低配
置:
最低配置:
CPU
:
1GHz
;
内存:
32 M
;
硬盘:
4 G
;系统:
Windows 95
同时结合我们开发该游戏的环境,我们强烈推荐用户使用如下的配置:
最佳配置:
CPU
:
2GHz
;
内存:
256M
;
硬盘:
80G
;系统:
Windows XP
1.3
游戏说明
启动游戏后直接进入棋盘界面,
我们就可以开始游戏了 ,
当我们开始下棋时,
我们有两个计数器分别对双方棋子数进行记录,
以作为判定输赢 的依据,
游戏中
包括的控制有:
(
1
)吃子:以方格为直 线或者斜线的方向,以一方对照棋子和即将落下棋
子之间(此两子之间必须没有空格且全部为对方棋子) 的所有对方棋子被吃掉,
被吃掉的对方棋子变为自己一方的棋子。
(
2< br>)下子:必须在可以吃子的位置处并且该位置为空格时可以落下己方的
棋子,如果不能下子,棋子 无法显示在棋盘上。
(
3
)赢棋:根据计数器记录的双方棋子数判定棋 子数多的一方取得本次游
戏的胜利,屏幕上面会自动出现对话框提示。
2
系统设计
2.1
总体方案
棋盘设计为
8×< br>8
格,
初始状态在棋盘中央交叉排放黑白棋子各两枚,
为统计
棋子个数 ,有一个棋子计一分,白棋先走。每个棋手下棋时,摆子的位置必须是
以自己的棋子能包围住对方一个或 多个棋子,
被包围的对方棋子将变成自己的棋
子。
包围的方向可以是上下左右以及左右 斜线共
8
个方向,
只要能连成一条线即
可。
当轮到一个棋手摆子,< br>而他没有可以包围对方棋子的位置时。
他必须停步让
对方走棋,直到他可以走为止。当棋 盘上有一方的棋子为
0
或下满
64
格,游戏
结束时棋子少者输。
我们的程序从总体上说分为三个块,希望通过四个类来解决,分别为:
(
1
)位图的导入与棋盘的生成;
(
2
)记录双方对弈时间的计时器与记录双方子数的计数器;
(
3
)选择人机对战和人人对战的函数及控制堆栈难度的主函数。
游戏的简单流程图如图
2.1
。
图
2.1
游戏简单流程图
2.2
详细设计
这是一个基于对话框 的
C
语言的程序
[2]
,程序的界面是一个二维平面图,
数据的表示 可用二维数组,
数组两个下标可以表示棋盘上的位置,
数组元素的值
代表棋格中的状态 ,共有三种情况,分别是空格、黑棋和白棋。这样给数组元素
的取值设定为
0
、
1
、
2,
其中
0
代表空格,
1
代表白色棋子,< br>2
代表黑色棋子,这
样程序的主要工作是接收棋手按键操作,
一旦接收到回车键 说明棋手摆子。
先判
定是不是有效位置,
也就是能不能包围住对方棋子,
如果 能便对棋子所在的位置
往上下、左右、左上、左下、右上,右下
8
个方向寻找被包围住 的所有棋子
(
必
须是连续的,中间不能有空格
)
,将这些被包围住的 对方棋子都变成自己的棋子,
然后对当前棋盘中的黑白棋个数进行统计并输出结果。
如果没有这 样的位置可以
落子,
则停步让对方走棋,
重复上述步骤,
直到游戏结束,如果想提前终止游戏,
可以按
Esc
键。在本程序中共需导入三个方格大小完全相 同的位图:
(
1
)底色为蓝色的空方格;
(
2
)已下入黑棋的方格;
(
3
)已下入白棋的方格。
初始化中的一些按键的控制信息在内存中的定义为:
#include
/*
图形系统头文件
*/
#define LEFT 0x4b00
/*
光标左键值
*/
#define RIGHT 0x4d00 /*
光标右键值
*/
#define DOWN 0x5000 /*
光标下键值
*/
#define UP 0x4800 /*
光标上键值
*/
#define ESC 0x011b /* ESC
键值
*/
#define ENTER 0x1c0d /*
回车键值
*/
我们定义
Kerne[8][8]
的数组来储存这些 方格的情况,
用
CGrid
类封装了每一
格的位置、尺寸和贴图,当为
0
时贴空方格,函数时为
1
时贴黑棋,为
3
时贴白
棋,每 次
OnDraw()
函数被调用时,转函数在下棋过程中通过改变
Kernel[][ ]
的键
值来显示不同位图以符合当前的下棋状态,
在程序初始化后在棋盘上先放置四个
棋子以示开始:
a[3][3]=a[4][4]=1;/*
初始两个黑棋
*/
a[3][4]=a[4][3]=2;/*
初始两个白棋
*/
在人
-
人对战模式时,
每次发生
LeftButtomDown
事件后都要判断 鼠标当时所
在空格中是否可以下棋。判断的内容可以分为:
(
1
) 比赛是否开始(
m_GameFlag
==
1
?)否则返回;
(
2
)方格内是否空,空则可能,否则不能;
(
3
)空方格相邻的八个方格内是否有对方棋子,若有则分别判断空格与对
方棋子所在行列或斜线内有无己 方棋子,若有且与对方棋子相邻,则棋子可下。
若上述三个判断均成立,
则将棋子放 入空格中,
并将相邻所夹的对方棋子翻
转为己方棋子(
B2W
()
)
,轮对手下棋。当上述三个条件有一个不满足时不能
落棋。当格子已经占满或一方棋子为
0
判断胜负,满足:
if((score1+score2)==64||score1== 0||score2==0)
并调用
IsEnd()
函数来判断输赢,最
后通 过函数输出比赛结果:
void playWin()/*
输出最后的胜利者结果
*/
{settextstyle(0,0,4);
setcolor(12);
if(score2>score1)/*
开始判断最后的结果
*/
outtextxy(100,50,
else
if(score2
outtextxy(100,50,
else
outtextxy(60,50,
}
在总体程序的设计中,
我把程序分模块来编写,
把游戏规则通过函数的调用
来 完成。其分类如表
2-1
。
表
2-1
游戏程序规则模块
序号
1
2
3
4
游戏程序规则
双方轮流走,所走的棋在水平、垂直、对角线方向,将对方所夹的棋,均变为自己颜色的棋。
当轮到一方下子,而该方又无法下子时,则由对方下子。
当一方的子被另一方全部吃完时,则被吃完的一方被认为是“输家”
。
当所有的棋格均被填满后,棋子多的一方被认为是“赢家”
。
在本设计中< br>,
我还用到了很多常用的输入、输出流类库函数,它们的函数名
称和功能声明如表
2-2
。
表
2-2
常用输入输出流类库函数
函数声明
Main()
DrawQp()
功能声明
在主函数中,棋盘状态用数组
a[8 ][8]
,初值为
0
,表示空格。
从坐标
(100,10 0)
开始每隔
40
个单位用白色画一条水平直线,一条垂直线
,
构成 棋
盘。
Playtoplay()
SetPlayColor()
人人对弈函数开始游戏,一旦游戏结束后,关闭图形系统
,
程序结束。
函数的参数为整型变量
t
,根据
t
的值来设计填充棋子的当前颜色,值为
1
代表白
棋,值为
2
代表黑棋。
MoveColor()
DoScore()
PlayWin()
恢复原来格子的状态。
根据当前数组元素的值判断分数
,
也就是各方棋子的个数。
根据分数值大小得出下棋结果并输出赢者信息。
黑白棋游戏系统设计流程图如图
2.2
。
图
2.2
源程序流程图
3
系统测试
3.1
测试棋盘界面
测试过程:运行程序以后,弹出了棋局的对话框,整 体棋局呈现蓝色,棋局
右边是我们实现黑白棋记录分数的地方。但是测试过程中我始终发现一个问题,< br>棋格的位图没有按照我们的设想正确放置,出现了跃出棋盘的怪现象,如下图
3.1
。< br>
图
3.1
跃出棋盘异常开机界面
问题解决:
通过反复推敲程序相关部分,
我觉得可能是算法有疏漏,
于是修
改了一下算法 。我们将每个棋格的位图封装了起来,将其位置作为
Cgird
的成员
数据
[ 3]
。再运行程序,问题就不再出现了,反复运行程序再也没有出现异常情
况。正常的开机界面 如下图
3.2
。
图
3.2
正常开机界面
3.2
测试两人对弈
测试过程:
将程序编译、
链接、
运行后,
弹出棋局的对话框,
然后开始下棋,
我一步一步观察了每步落子后棋局上黑白棋子的变化过程,
均与我预期的变化过
程一样如图3.3
,我非常欣喜,这说明我们设计下棋程序时的算法准确无误,但
是在最后的白棋子多 与黑棋子的情况下,系统竟然判了黑棋获胜。
图
3.3
两人对弈图
问题解决:
针对判错的问题,
查阅相关资料和书籍也没 有得到很好的解决办
法!无奈之下,参考了其相关的程序部分
[4]
,终于解决了我的 判错问题,再运
行程序,结果能按照我的要求,分别对双方记分,并正确判输赢如图
3.4。
图
3.4
游戏结束界面图
测试内容:
程序的基本框架已经可以运行了,
希望能按我的预期目标能实现
两人对弈功能并可以判断平局的 结果!测试过程:将程序编译、链接、运行后,
弹出棋局的对话框,
然后开始下棋,
我 一步一步观察了每步落子后棋局上黑白棋
子的变化过程,
这说明我们设计下棋程序时的算法准确 无误。
在最后的黑棋子和
白棋子相同的情况下,系统判两方同时获胜。其平局游戏结束界面如图
3.5
。
图
3.5
游戏平局结束界面图
3.3
测试运行环境
测试内容:
我们将在总体上对程序的运行效果和运行环境进行测试,
以完善
所有功能, 达到软件的最优化。
测试过程: