【C语言篇】“三子棋”

一、游戏介绍

三子棋,英文名为 Tic - Tac - Toe,是一款简单而经典的棋类游戏。游戏在一个 3×3 的棋盘上进行,两名玩家轮流在棋盘的空位上放置自己的棋子(通常用 '*' 和 '#' 表示),率先在横、竖或斜方向上连成三个相同棋子的玩家获胜。如果棋盘被填满且没有玩家获胜,则游戏平局

二、程序设计思路

(一)棋盘的表示

使用一个二维字符数组 board[3][3] 来表示棋盘,数组的每个元素对应棋盘上的一个位置。初始时,棋盘上的每个位置都用空格字符 ' ' 表示空位。

(二)游戏流程控制

  1. 初始化棋盘:将棋盘上的每个位置都设置为空位。
  2. 打印棋盘: 在每次玩家下棋后,将当前的棋盘状态打印出来,方便玩家查看。
  3. 玩家下棋: 轮流让两个玩家输入下棋的位置,检查位置是否合法(是否为空位),如果合法则在相应位置放置玩家的棋子。
  4. 判断胜负: 在每次玩家下棋后,检查是否有玩家获胜或者游戏是否平局。
  5. 游戏结束: 如果有玩家获胜或者游戏平局,打印相应的结果并结束游戏。

三、代码实现

游戏逻辑:

解析游戏逻辑:

先创建棋盘,对棋盘初始化为' '(空格),接下来就进入游戏环节,玩家先下棋,下完棋判断输赢,如果返回值为"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 语言中数组、循环、条件判断等基础知识,还让我们对游戏编程的基本流程有了一定的了解。你可以进一步对游戏进行扩展,比如添加电脑对战模式、优化界面等,以提升游戏的趣味性和可玩性

相关推荐
鲤籽鲲几秒前
C# 中 [MethodImpl(MethodImplOptions.Synchronized)] 的使用详解
java·开发语言·c#
SomeB1oody8 分钟前
【Rust自学】19.5. 高级类型
开发语言·后端·设计模式·rust
逆风局?15 分钟前
Java基础——分层解耦——IOC和DI入门
java·开发语言
通信.萌新1 小时前
【Qt】常用的容器
开发语言·qt
美味小鱼1 小时前
Rust枚举(Enum)完全指南:用类型安全表达多样性
开发语言·安全·rust
tt5555555555551 小时前
每日一题——小根堆实现堆排序算法
c语言·数据结构·算法·面试·排序算法·八股文
二十雨辰1 小时前
[Java基础]面向对象
java·开发语言
007php0071 小时前
HTTPS域名443端口证书到期问题排查与解决
开发语言·网络·网络协议·计算机网络·http·golang·https
关关钧2 小时前
【R语言】R语言安装包的相关操作
开发语言·python·r语言
假客套2 小时前
Java小白入门教程:LinkedList
java·开发语言