一、游戏介绍
三子棋,英文名为 Tic - Tac - Toe,是一款简单而经典的棋类游戏。游戏在一个 3×3 的棋盘上进行,两名玩家轮流在棋盘的空位上放置自己的棋子(通常用 '*' 和 '#' 表示),率先在横、竖或斜方向上连成三个相同棋子的玩家获胜。如果棋盘被填满且没有玩家获胜,则游戏平局
二、程序设计思路
(一)棋盘的表示
使用一个二维字符数组 board[3][3]
来表示棋盘,数组的每个元素对应棋盘上的一个位置。初始时,棋盘上的每个位置都用空格字符 ' '
表示空位。
(二)游戏流程控制
- 初始化棋盘:将棋盘上的每个位置都设置为空位。
- 打印棋盘: 在每次玩家下棋后,将当前的棋盘状态打印出来,方便玩家查看。
- 玩家下棋: 轮流让两个玩家输入下棋的位置,检查位置是否合法(是否为空位),如果合法则在相应位置放置玩家的棋子。
- 判断胜负: 在每次玩家下棋后,检查是否有玩家获胜或者游戏是否平局。
- 游戏结束: 如果有玩家获胜或者游戏平局,打印相应的结果并结束游戏。
三、代码实现
游戏逻辑:
解析游戏逻辑:
先创建棋盘,对棋盘初始化为‘ ’(空格),接下来就进入游戏环节,玩家先下棋,下完棋判断输赢,如果返回值为“C”就继续,反之胜负已定,跳出循环,对返回值进行判断,如果是*玩家赢,#电脑赢,!平局,这个时候整个游戏的逻辑就完了,下面的菜单啥的都很普通,我就不讲解了
如何生成随机数:
在三子棋游戏中,若涉及电脑下棋,其坐标通常是随机生成的。在 C 语言里,rand
函数可用于生成随机数。然而,它生成的是一种 “伪随机数”,这是因为rand()
括号内的种子默认值为 1。若不手动给种子赋值,每次运行程序时,种子始终为 1,那么生成的随机数序列也会是一样的。这是由于随机数的生成会随着种子的变化而变化。
为解决这一问题,我们引入srand
函数,它是初始化随机数生成器。只要srand
函数的种子不断变化,rand
函数生成的随机数序列也会相应地不断变化。
在实际程序中,通常会使用程序运行的时间作为种子,因为时间是时刻在变化的。C 语言提供了time
函数来获取当前时间。time
函数会返回自 1970 年 1 月 1 日 0 时 0 分 0 秒起至程序当前运行时刻的差值,单位为秒,返回值类型为time_t
。当time
函数的参数为NULL
时,它仅返回这个时间差值,该差值也被称为 “时间戳”。通过srand((unsigned int)time(NULL))
这样的语句(因为srand的参数是unsigned int 类型,所以我们将time的返回类型强转为无符号整型),就能以当前时间作为随机数生成器的种子,使得每次程序运行时rand
生成的随机数都不同,从而实现电脑下棋坐标的随机化
在程序中srand((unsigned int)time(NULL))
一般放在程序开头合适的位置,比如main
函数开头,且只调用一次来设置种子,后续多次调用rand
生成不同随机数。否则如果在程序中多次调用srand((unsigned int)time(NULL))
可能达不到预期随机效果(因为短时间内时间戳变化不大,可能生成相近随机数序列)
棋盘的初始化:
棋盘的打印:
玩家下棋:
如果要正确访问棋盘中的每个位置的话,理应是用下标访问,但是玩游戏的人可不知道有下标这样的说法,他们只知道数学中的行和列,所以在判断断这个位置有没有棋时,给玩家输入的坐标-1,刚好对应了数组中的下标
电脑下棋:
判断输赢:
判断获胜的情况有三种:某一行棋子相同、某一列棋子相同以及两条对角线上的棋子相同
如果满足其中某一个条件,就返回第一个位置的棋,这个时候就和解析逻辑那块对应着了
判断平局:
只要棋盘上还有一个空的位置,就没有结束,如果棋盘下满了还没有决出胜负,那就是平局
如果判断输赢那块的判断没有一个满足,就返回C,继续游戏
完整代码:
test.c:
game.h :
game.c :
通过以上代码实现了一个简单的三子棋游戏。这个小游戏不仅帮助我们巩固了 C 语言中数组、循环、条件判断等基础知识,还让我们对游戏编程的基本流程有了一定的了解。你可以进一步对游戏进行扩展,比如添加电脑对战模式、优化界面等,以提升游戏的趣味性和可玩性