当前位置: 首页 > article >正文

【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 语言中数组、循环、条件判断等基础知识,还让我们对游戏编程的基本流程有了一定的了解。你可以进一步对游戏进行扩展,比如添加电脑对战模式、优化界面等,以提升游戏的趣味性和可玩性 


http://www.kler.cn/a/531165.html

相关文章:

  • 编程AI深度实战:给vim装上AI
  • Kamailio、MySQL、Redis、Gin后端、Vue.js前端等基于容器化部署
  • ECharts 样式设置
  • 使用 Numpy 自定义数据集,使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
  • GMSL 明星产品之 MAX96724
  • 深入解析 CSS 中不常用属性及其相互作用
  • kubernetes(二)
  • 对比JSON和Hessian2的序列化格式
  • 前端 | JavaScript中的reduce方法
  • 【14】WLC3504 HA配置实例
  • 【股票数据API接口49】如何获取股票实时交易数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • 自动化构建-make/Makefile 【Linux基础开发工具】
  • 本地快速部署DeepSeek-R1模型——2025新年贺岁
  • relational DB与NoSQL DB有什么区别?该如何选型?
  • C++ Primer 迭代器
  • Unity特效插件GodFX
  • 力扣经典题目之14. 最长公共前缀
  • Alibaba开发规范_异常日志之日志规约:最佳实践与常见陷阱
  • 最新功能发布!AllData数据中台核心菜单汇总
  • Win11使用VMware提示:平台不支持虚拟化的 Intel VT-x/EPT
  • 【BUUCTF逆向题】[WUSTCTF2020]level1、[GUET-CTF2019]re
  • linux通过lvm调整分区大小
  • 【Leetcode 每日一题】81. 搜索旋转排序数组 II
  • 【ChatGPT:开启人工智能新纪元】
  • 嵌入式硬件篇---HAL库内外部时钟主频锁相环分频器
  • Leetcode面试高频题分类刷题总结