当前位置:文档之家› 黑白棋游戏

黑白棋游戏

黑白棋游戏摘要本课题设计一个黑白棋游戏系统,游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。

它的游戏规则简单上手很容易,但是它变化又非常复杂。

我选择这个题目做设计,一方面是巩固和提高以前所学C语言知识,另一方面是因为这可能是我第一次完成一个软件的系统设计,选择一个中等难度且相对成熟的软件来设计既易于实现又留有一定的上升空间,符合我的实际情况。

我所设计的这种黑白棋游戏有几个特点:程序短小精悍简洁明了,游戏界面美观,功能丰富容易操作,趣味性强。

关键词: 程序设计;C语言;黑白棋;两人对弈The black and white chess(Department of electronic and Information Engineering Ankang university)Directed by Chen ShoumanAbstract: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 operate.Much interesting.Key word:Program design. C language. The black and white chess. Chess1 引言我国是棋文化的发祥地之一,上古的尧时代围棋就在我国诞生了,在随后的几千年长河里,我国人民不断以自己的聪明才智创造出深受人们喜爱的棋类游戏,像中国象棋、五子棋、军棋等等一直是在民间很流行的棋类项目。

同时国外的棋类游戏也流传到中国,比如国际象棋、跳棋等,逐渐在国内盛行。

可以说棋类游戏一直是我国人民喜闻乐见的一种休闲方式,由于棋类游戏都是比较注重智力策略的,所以从中也可以折射出我国人民的智慧。

1.1 设计目的在程序设计中,我们将主要通过C语言,运用面向对象的程序设计方法[1],开发此款黑白棋游戏。

力争使程序短小精悍简洁明了,游戏界面色彩丰富给人以良好的视觉冲击,并且容易操作,功能丰富趣味性强,能供两人对弈。

1.2 运行环境本游戏短小精悍,而且对电脑配置的要求均不高,目前几乎所有的PC机均可运行该游戏。

但是为了能让大家更好地体验该款游戏,我们给出如下的最低配置:最低配置:CPU :1GHz;内存:32 M;硬盘:4 G;系统:Windows 95 同时结合我们开发该游戏的环境,我们强烈推荐用户使用如下的配置:最佳配置:CPU :2GHz;内存:256M;硬盘:80G;系统:Windows XP1.3 游戏说明启动游戏后直接进入棋盘界面,我们就可以开始游戏了,当我们开始下棋时,我们有两个计数器分别对双方棋子数进行记录,以作为判定输赢的依据,游戏中包括的控制有:(1)吃子:以方格为直线或者斜线的方向,以一方对照棋子和即将落下棋子之间(此两子之间必须没有空格且全部为对方棋子)的所有对方棋子被吃掉,被吃掉的对方棋子变为自己一方的棋子。

(2)下子:必须在可以吃子的位置处并且该位置为空格时可以落下己方的棋子,如果不能下子,棋子无法显示在棋盘上。

(3)赢棋:根据计数器记录的双方棋子数判定棋子数多的一方取得本次游戏的胜利,屏幕上面会自动出现对话框提示。

2 系统设计2.1 总体方案棋盘设计为8×8格,初始状态在棋盘中央交叉排放黑白棋子各两枚,为统计棋子个数,有一个棋子计一分,白棋先走。

每个棋手下棋时,摆子的位置必须是以自己的棋子能包围住对方一个或多个棋子,被包围的对方棋子将变成自己的棋子。

包围的方向可以是上下左右以及左右斜线共8个方向,只要能连成一条线即可。

当轮到一个棋手摆子,而他没有可以包围对方棋子的位置时。

他必须停步让对方走棋,直到他可以走为止。

当棋盘上有一方的棋子为0或下满64格,游戏结束时棋子少者输。

我们的程序从总体上说分为三个块,希望通过四个类来解决,分别为:(1)位图的导入与棋盘的生成;(2)记录双方对弈时间的计时器与记录双方子数的计数器;(3)选择人机对战和人人对战的函数及控制堆栈难度的主函数。

游戏的简单流程图如图2.1。

图2.1 游戏简单流程图2.2 详细设计这是一个基于对话框的C语言的程序[2],程序的界面是一个二维平面图,数据的表示可用二维数组,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格中的状态,共有三种情况,分别是空格、黑棋和白棋。

这样给数组元素的取值设定为0、1、2,其中0代表空格,1代表白色棋子,2代表黑色棋子,这样程序的主要工作是接收棋手按键操作,一旦接收到回车键说明棋手摆子。

先判定是不是有效位置,也就是能不能包围住对方棋子,如果能便对棋子所在的位置往上下、左右、左上、左下、右上,右下8个方向寻找被包围住的所有棋子(必须是连续的,中间不能有空格),将这些被包围住的对方棋子都变成自己的棋子,然后对当前棋盘中的黑白棋个数进行统计并输出结果。

如果没有这样的位置可以落子,则停步让对方走棋,重复上述步骤,直到游戏结束,如果想提前终止游戏,可以按Esc键。

在本程序中共需导入三个方格大小完全相同的位图:(1)底色为蓝色的空方格;(2)已下入黑棋的方格;(3)已下入白棋的方格。

初始化中的一些按键的控制信息在内存中的定义为:#include "graphics.h" /*图形系统头文件*/#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,"black win!");elseif(score2<score1)outtextxy(100,50,"white win!");elseouttextxy(60,50,"you all win!");}3 系统测试3.1 测试棋盘界面测试过程:运行程序以后,弹出了棋局的对话框,整体棋局呈现蓝色,棋局右边是我们实现黑白棋记录分数的地方。

但是测试过程中我始终发现一个问题,棋格的位图没有按照我们的设想正确放置,出现了跃出棋盘的怪现象。

问题解决:通过反复推敲程序相关部分,我觉得可能是算法有疏漏,于是修改了一下算法。

我们将每个棋格的位图封装了起来,将其位置作为Cgird的成员数据[3]。

再运行程序,问题就不再出现了,反复运行程序再也没有出现异常情况。

3.2 测试两人对弈测试过程:将程序编译、链接、运行后,弹出棋局的对话框,然后开始下棋,我一步一步观察了每步落子后棋局上黑白棋子的变化过程,均与我预期的变化过程一样,我非常欣喜,这说明我们设计下棋程序时的算法准确无误,但是在最后的白棋子多与黑棋子的情况下,系统竟然判了黑棋获胜。

问题解决:针对判错的问题,查阅相关资料和书籍也没有得到很好的解决办法!无奈之下,参考了其相关的程序部分[4],终于解决了我的判错问题,再运行程序,结果能按照我的要求,分别对双方记分,并正确判输赢。

测试内容:程序的基本框架已经可以运行了,希望能按我的预期目标能实现两人对弈功能并可以判断平局的结果!测试过程:将程序编译、链接、运行后,弹出棋局的对话框,然后开始下棋,我一步一步观察了每步落子后棋局上黑白棋子的变化过程,这说明我们设计下棋程序时的算法准确无误。

相关主题