C 语言程序设计 课程设计报告
题 目: 五子棋的设计与实现
专 业:
班 级:
学 号:
姓 名:
指导教师:
1
1.系统(或程序或软件或设计)的概述或任务描述
完成 C 语言五子棋游戏制作的目的是增强对 C 语言程序相关内容的熟练掌
握,用 C 语言设计五子棋小游戏的过程中,充分利用了 C 语言当中的数组和循环
判断的知识,通过设计五子棋的实践,更加深入的理解 C 语言。编写任务大致包
括:菜单界面设计、棋盘设计、棋子设计、判断胜负机制、人机对战、判断棋盘
是否已满(平局的判定)、判断胜负(各个方向是否连成五子)等等。
2.需求分析或设计
根据我们平时玩五子棋游戏的习惯,系统会进行如下判断和操作:
了解此情况后,根据顺序开始编写。
一、 绘制菜单界面。只需进行简单的排版即可(除了主要文字外,其余用*和
空格填充,使界面更加美观)。
二、 对菜单中各选项的功能进行编写。这部分为主函数,应用了 switch 语句
满足选择需要,再使用一个 while 循环语句将选择结构包含,意在用户选
择到了符合要求的数字会跳出循环进行下一步,否则继续进行选择。同时
在后续编写任务中若有补充则再加入 case 语句和和内容进行补充。
三、 绘制棋盘。这里绘制用到的特殊符号在输入法里能找到,首先声明函数,
因为绘制棋盘和落子要用到坐标,所以函数声明的时候就声明了二维数组,
以方便后续操作。根据我们日常生活中看到的五子棋棋盘,在绘制棋盘的
过程大致可以分为三部分,第一行(┌ ┬ ┐)、中间部分(└ ┴ ┘)
和最后一行(├ ┼ ┤)。在绘制棋盘的过程中,为了编写更加方便,要
在菜单界面选择对
战方式或退出游戏
执黑子的玩家先落
子,然后双方轮流
落子
退出游戏
判断胜负或平局
绘制棋盘、棋子
2
用到遍历数组,而且第一行和最后一行只有一行,那么在使用条件语句的
时候先遍历绘制好首行和末行,再根据绘制这两行的代码,照猫画虎,把
特殊符号改了就绘制完成。
四、 绘制棋子。这里用到的表示黑棋和白棋的特殊符号同样在输入法中能找
到,其中黑棋○(背景呈现黑色)、白棋●,同时引入一个参数 a,是为
了让绘制棋盘更加方便。也是调用宏定义后的用来表示棋子位置状态的具
体名字,为了调用更加方便。
五、 人人对战模式程序的编写。考虑到五子棋的规则是黑子先行,然后双方
轮流下棋,而在用计算机操作的情况下,我还无法做到写出支持鼠标点击
下子的代码,则只能通过输入棋子的坐标来定位棋子,并“镶嵌”在棋盘
内,即先引入宏定义所有坐标为 BLANK,然后再根据之后程序的编写将坐
标换成之前宏定义后的表示黑子(BLACK)和白子(WHITE)的内容,即在
绘制好的棋盘上显示出来的黑白棋(○、●)。
首先,在编写之前先定义了步数(step),然后再用除以 2 求余的方法,
根据步数为单数(step%2==1)时,黑棋落子,步数为双数(step%2==0)
时,白棋落子,此步骤用到条件语句。然后用 while 循环语句判断坐标是
否落在恰当的位置,即不能落在已经有棋子的点上,以不能落在超出棋盘
的范围上,在用 continue 表示继续此操作(输入合适坐标),最后若是正
确恰当的位置,则通过 break 语句跳出此循环。最后考虑到下完棋可能会
有连成五子(即判定胜负)的情况,所以留了几行用来补充黑棋或白棋胜
的条件。
六、 对局胜负或者平局的判断。由我们日常生活中进行五子棋对局的情况,
我们可以知道,五子棋判断输赢或者平局的条件有:黑棋或者白棋先横着
连成五子,竖着连成五子,左斜方向连成五子或者右斜方向连成五子这几
种情况下判断为对应颜色棋子获胜,如果棋盘被棋子占满之时还未分出胜
负,则判定为平局。
判断胜负的代码:首先定义 is_win 作为棋局获胜的名称,再用遍历函数
的方法分别判断棋子在各个方向上是否连成五子。该过程:首先是竖着是
否连成五子,条件取 j<y-4 意为在竖着的方向上取得点少于棋盘竖着方向
总位置里连续的 4 个,利用逻辑运算符&&判断在这 4 个位置上是否是 4 个
与前者相同的棋子,若是,则返回函数值。同理,用此方法判断在横着的
方向上是否连成相同的五子。接下来是左斜方向上是否连成五子,条件取
i < y - 4 && j < y – 4 表示在左斜的方向上留 4 个连续的位置,同样
利用逻辑运算符&&进行判断,不过这次二维数组需要 x 和 y 方向都要做出
运算的改变,即 x 和 y 方向对应数组依次+1。同理,可以写出判断右斜方
向上是否连成相同的五子,不过此时 y 方向上的数组与 x 方向上的相反。
判断平局(棋盘已满)的代码:首先定义 is_full 作为棋局已满的名称,
定义 ret=1,再使用遍历数组的方式,判断当有一个位置为空(BLANK),
则棋盘不满,此时返回 ret 值为 0,则该棋局还可继续进行。最后将判断
棋局胜负(返回当前棋子的值,若值为 1,代表黑棋胜 ,若为-1 ,代表
白棋胜)和平局的条件引入的前面第五步的“补充”部分。
3
七、 人机对战模式程序的编写。要实现人机对战模式的完成,需要用到随机
算 法 来 获 取 棋 子 的 坐 标 。 需 要 用 rand 函 数 ( 需 要 补 充 头 文 件
#include<stdlib.h>)进行随机生成在棋盘内的值(即 X 或 Y 的值 15)。
类比于人人对战模式程序的编写,把白棋落子的玩家换成机器人(随机算
法),白棋(机器人)落子只需落在棋盘范围内即可,则只需设的
i=random_create_point() 和 j=random_create_point() 满 足
chessboard[i][j] == BLANK 即可。
3. 编程实现
编程的实现主要使用的 IDE 为 Dev c++。期间也有使用 visual stdio 2022,
但由于该开发工具中的某些功能不是很熟练和了解,所以最终还是选择使用 Dev
c++ 进行编程。使用的版本号:TDM-GCC 4.9.2 32/64bit。
棋盘每一个位置分为三种状态,白子、黑子、空白。可以使用宏定义:
#define WHITE -1
#define BLACK 1
#define BLANK 0
(该实践默认在人机对战时,玩家执黑棋,电脑执白棋)
目前国际上使用的五子棋棋盘都是 15×15,由横纵交叉线形成了 225 个交叉
点。
棋盘符号包括:
┌ ┬ ┐
├ ┼ ┤
└ ┴ ┘(这些符号可在输入法内找到)
棋盘最大行数 15,最大列数 15。可以使用宏定义:
#define Y 15
#define X 15
棋盘可以抽象为一个二维数组 chessboard[X][Y],存储棋子的下标位置。
➢ 菜单设计:
4
这里只是借用了*和空格并且进行了简单的排版,使菜单界面看起来还算整
洁美观。
➢ 菜单选项设计与实现(主函数的编写):