三子棋游戏规则
三子棋,用“井”字分出3×3的格子,双方轮流下棋子,可以用O和X来区别,也可以用 * 和#区别,在行,列,对角线将自己的三个棋子走成一条线,就算获胜。
例图:
主框架的搭建
1:先准备好游戏菜单,规则为 1 为玩游戏 0 为退出游戏。
2:打印完菜单,准备输入数字,如果1,就开始游戏,如果0,就退出游戏,如果是其他,则选择错误,返回并重新输入数字。这时候就需要循环了,因为至少需要执行一次,所以用do,while循环,条件为输入的那个数。
游戏的实现
创建棋盘
我们需要准备一个二维数组来存放一个三乘三的棋盘,棋盘使用3行3列的二维数组来表示,元素类型是char。
#define ROW 3 //行
#define COL 3 //列
char board[ROW][COL];//棋盘数组
使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。
初始化棋盘
定义函数与参数,并且在头文件中声明。
棋盘初始化时,需要看起来是空白的,所以把棋盘初始化为空格。
打印棋盘
1,声明和定义打印棋盘的函数。
2,棋盘可以看为两部分,数据为一部分,分隔符为一部分,打印数据时,打印数据和“ | ”,如果最后一列的时候,就不需要打印“ | ”了。
接下来打印分隔信息,打印“—”与“ | ”,同上,在最后一行的时候不需要打印分隔符,打印完换行。
玩家下棋
1,玩家下棋需要输入下标,检查坐标是否在范围之内。
2,坐标合法需要看这个范围内有没有被占用,如果没有被占用则等于 ‘ * ’ , ‘ * ’ 表示玩家下棋。
3,注意的是,数组下标从0开始,输入的坐标和数组的坐标是相差的,需要减一才能相等。
玩家落子时注意事项:
1.玩家落子需要在棋盘范围内。
2.玩家要在棋盘上空的地方落子。
3.如果输入的坐标不满足要重新输入。
电脑下棋
电脑随机下棋,’ # ’表示电脑下棋。
因为电脑是随机下棋,所以我们需要产生一个随机坐标,所以我们需要一个随机值。
电脑下棋注意事项:
1.要在主函数中使用srand((unsigned int)time(NULL))。
将时间戳作为随机数的起点(头文件:#include <time.h>),确保得到的行列坐标是真随机。
2.在函数中使用rand()函数产生随机坐标(头文件:#include <stdlib.h>),还要确保坐标在棋盘范围内。
3.要在棋盘上空的地方下棋。
判断输赢
当玩家输入一个棋子需要判断一下玩家是否赢了,利用返回结果判断胜负:
当电脑输入一个棋子需要判断一下电脑是否赢了,利用返回结果判断胜负:
要返回4种不同的状态:
玩家获胜—> ‘ * ’
电脑获胜 —> ‘ # ’
平局 —> ‘ Q ’
继续 —> ‘ C ’
1.获胜
(1)判定所有的行(一行字符全部相同,即获胜)
(2)判定所有的列(一列字符全部相同,即获胜)
(3)判定两条对角线(一条对角线字符全部相同,即获胜)
注意:需排除空棋盘的情况(即全为空格,没有下棋子)
2.平局
(1)使用IsFull函数判断棋盘是否已满。
(2)返回1,表示棋盘满了,返回0,表示棋盘没满。
(3)如果棋盘满了未分出胜负,平局。
(4)如果棋盘没满,游戏继续。
写代码判断行,列,对角线时,固定写死了3行,3列,此处可以修改,让游戏不局限于三子棋。
玩家赢,如下图:
电脑赢,如下图:
平局,如下图:
如果电脑太笨怎么办,总是玩家赢,如何让玩家赢不了电脑。俗话说没有笨的电脑,只有笨的程序员,这个代码在这里只是小白版本,还有很大的改进空间。
总代码
我们平常写代码的时候,如果程序比较大,直接包含在一个文件中就会非常容易混乱,并且不容易维护,这个时候就需要用到多文件。使用多文件的时候可以将整个程序拆分开来,比方说分为头文件、函数文件、主函数文件。当然如果有需要的话,还可以继续细分。
我们可以将上方三子棋代码进行分块来写:
首先我们可以创建3个文件:一个头文件game.h,两个源文件game.c,test.c。
game.h是三子棋游戏代码的声明,game.c是三子棋游戏代码的实现,test.c是主函数文件,测试三子棋游戏的逻辑。
game.h
在game.h里可以先声明一些变量如(ROW和COL)和头文件,和要定义的函数的声明。
game.c
在game.c里引用 #include “game.h”,引用后可以使用game.h里面的定义的变量和函数。
test.c
然后在test.c主函数文件里引用 #include “game.h”,引用后可以使用game.h里面的定义的变量和函数。
总结
感谢观看,欢迎三连,如有错误,欢迎指正。