【C语言】数组的应用:三子棋游戏

由于代码较长,为了增加可读性,我们把代码分别写到game.h,game.c,test.c,里面,其中game.h用来声明函数,实现函数功能的代码在game.c,测试游戏的代码在test.c

为了方便后续的更改,代码使用了宏定义,并没有把棋盘大小写死,这样只要后续要是想要写五子棋甚至n子棋,只需要更改宏定义的数值即可。

下面是game.h中对于所有函数的声明

下面是test.c

仍然是采用的do..while()循环加上switch语句,这与我们前面写过的猜数字游戏类似,上来先打印一个菜单,让输入1或0决定开始游戏还是退出游戏,如果玩一次不过瘾还可以连续玩,直到输入0退出游戏

首先程序运行起来之后不管三七二十一都先打印一个菜单,供玩家选择,当玩家输入1才开始游戏,这时候先初始化棋盘,然后把棋盘打印出来,屏幕上就会呈现一个空棋盘,然后玩家和电脑就可以开始下棋了,由于玩家和电脑都要走很多步才能结束游戏,因此显然是一个循环,循环结束的条件就是有没有一方获得胜利或者平局。

先来看初始化棋盘的函数

我们所谓的棋盘其实就是一个三行三列的二维数组,创建并把这个二维数组中的所有元素均初始化为空格。

再来看打印棋盘的函数

前面我们已经把二维数组的所有内容均初始化为了0,如果我们直接打印,其实是什么也看不到,这样的棋盘对于玩家来讲是非常不友好的,因此我们要打印一个更优美的棋盘,比如这样的

这其实是由一些符号拼起来的一个像棋盘的图案,就是先来一行三空格一竖杠,再来一行三个_一个竖杠,重复多次即可,而且最后一行是不需要竖杠的,最后一列也是不需要___|的,然而这样我们发现最后一行永远都是三空格一竖杠,在形状上显得略微不对称,就像这样

因此我们最后又人为的打印了一行三空格一竖杠,让图形看着更加对称

玩家下棋的函数

由于数组下标是从0开始的,我们要想在第一行第一列下棋1,应该输入坐标是0 0,这显然不符合大众的理解,大众并不知道数组下标是从零开始的,因此我们这里让打印的是arr[x-1][y-1],要考虑到以下几种情况:首先玩家因为我们的棋盘只有三行三列,玩家如果输入一个坐标在第五行,显然是不行的,这时候我们让玩家重新输入,再者就是玩家输入的坐标可能已经被占用了,这时候就提示玩家坐标已被占用,请重新输入,如果上述两种问题均不存在,则在对应的坐标位置放上一个*,当然我们走完之后要紧接着调用打印棋盘的函数打印一下,效果如图:

电脑下棋的函数

为了方便,我们就让电脑随机下棋即可,电脑下棋我们通过模上row和模上col就能产生0~row-1,与0~col-1,有了这样的限制,电脑就不会产生非法坐标了,生成随机数的方式就是rand函数,在调用rand函数之前要调用srand函数,这是rand函数的语法,srand函数用于设置时间戳,且只需要在主函数中调用一次即可,这里有一个设置时间戳的固定方法就是srand((unsigned)time(NULL)),希望读着能够记住这个写法。在以后需要产生随机数的时候均可以直接套用。

电脑下棋虽然不会有非法坐标,但是也会出现坐标已经被占用的情况,这时候我们就让电脑悄悄地再下一次即可。

接下来是判断棋盘是否已经满了的函数

这个逻辑还是非常简单的,我们只要遍历一遍此时的二维数组,看看是否有空格即可,如果一个空格都没有,当然就满了。

最后是判断玩家输赢的函数

假设玩家赢返回*,电脑赢返回#,没有结束返回C,平局返回Q

这样写的好处就是有三点连成一线的时候直接返回其中任意一个坐标处的内容即可,玩家赢,说明有三个*连成了一条线,我们返回其中任意一个就是*,这就与我们前面让玩家赢返回*的逻辑对应上了,电脑赢同理,判断是否平局其实就是看看棋盘是不是已经满了,利用前面的isfull函数即可。

自此所有的函数都写完了,一个简易的三子棋游戏就完成了。效果如图

只要我们不输入0,在一局下完之后会紧接着再打印菜单让玩家选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/363916.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 ChatGPT 为生物信息学初学者赋能

论文:Empowering Beginners in Bioinformatics with ChatGPT. 2023 对于生信初学者而言,最大的困难是身边没有经验丰富的人给予指导。而ChatGTP的出现可能改变这一现状,学生可以自己作为导师,指导ChatGPT完成数据分析工作。 众所周…

Kotlin中的内置函数-apply、let

在使用Kotlin的过程中会经常用到其内置函数,包括apply,let,run,with,also,takeIf,takeUnless函数等,想要更好熟悉Kotlin,这些函数必须烂熟于心,接下来让我们来逐步了解&a…

ubuntu16.04环境轻松安装和应用opencv4.9.0(基于源码编译)

目录 一、环境准备 1、安装cmake 2、安装依赖 3、从github上下载opencv4.9.0.zip 二、安装opencv4.9.0 1、解压4.9.0.zip 2、进入build目录编译 3、安装编译好的相关库 4、修改opencv配置文件并使其生效 5、添加PKG_CONFIG路径,并使其生效 三、opencv环境…

linux安装docker-compose

1:安装 在这里 下载,解压后得到docker-compose文件,放在某个目录后在/etc/profile中配置,我这里如下: 接着执行docker-compose version验证,是否成功: [elklocalhost ~]$ docker-compose version docker…

(2)SpringBoot学习——芋道源码

Spring Boot 的自动配置 1.概述 EmbeddedWebServerFactoryCustomizerAutoConfiguration 类 Configuration // <1.1> ConditionalOnWebApplication // <2.1> EnableConfigurationProperties(ServerProperties.class) // <3.1> public class EmbeddedWebSe…

SV-9032 机架式ip网络采播器

SV-9032是深圳锐科达电子有限公司的一款机架式网络采播器&#xff0c;具有10/100M以太网接口&#xff0c;后面板上有一组AUX音源输入和一组6.35mm接口的麦克风输入&#xff0c;可以直接连接音源输出设备或麦克风&#xff0c;将采集音源编码后发送至网络播放终端上。同时还具有三…

了解 WebSocket 和 TCP :有何不同

WebSocket — 双向通讯的艺术 简要概述 WebSocket 代表着WebSocket通讯协议&#xff0c;提供了一条用于客户端和服务器间实现实时、双向、全双工通信的渠道。在WebSocket引入之前&#xff0c;网页应用的数据更新依赖于频繁的轮询&#xff0c;这种做法不仅效率低下&#xff0c;…

Web实战丨基于Django的简单网页计数器

文章目录 写在前面Django简介主要程序运行结果系列文章写在后面 写在前面 本期内容 基于django的简单网页计数器 所需环境 pythonpycharm或vscodedjango 下载地址 https://download.csdn.net/download/m0_68111267/88795604 Django简介 Django 是一个用 Python 编写的高…

第十四届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)题解

尝试再做一次&#xff0c;我记得还是有点难&#xff0c;我会尽量多写一点解析&#xff0c;尽量让基础比较弱的友友也能看懂&#xff0c;希望能给你带来帮助 目录 1. 日期统计 题目描述 解题思路 具体代码 2. 01 串的熵 题目描述 解题思路 具体代码 3. 冶炼金属 题目…

正点原子--STM32中断系统学习笔记(2)

引言 上篇帖子STM32中断系统学习笔记(1)是理论&#xff0c;这篇帖子开始实战&#xff0c;目标是通过按键实现LED的控制。 1.工程建立 以正点原子HAL库 实验1 跑马灯实验为基础&#xff0c;复制工程&#xff0c;在“Drivers--BSP”目录下建立EXTI文件夹&#xff0c;并创建ext…

2024美国大学生数学建模竞赛A-F题完整思路+配套代码数据+后续高质量参考论文更新

The Mathematical Contest in Modeling (MCM) The Interdisciplinary Contest in Modeling (ICM) 24美赛【完整每问手把手详细思路可修改50页多种思路版本word版保奖论文】配套升级求解代码可视化图表 美赛A-F题完整版获取见文末 下文包含&#xff1a;2024美国大学生数学建模…

美区或其他外区Appstore账号AppleID注册教程,简单快速,苹果必备!

▍前言 现在越来越多的APP在国区APPstore下架&#xff0c;如果想有更好的使用体验&#xff0c;不得不去外区下载APP&#xff0c;那就需要一个外区的apple id&#xff0c;注册也很简单&#xff0c;今天大鹏通过电脑ipad给大家注册一个&#xff0c;建议大家直接使用iPhone或者iPa…

JVM性能分析工具——Arthas及火焰图的使用

Arthas的使用 Arthas常用命令Arthas的安装Linux压测工具Apache Bench安装火焰图的使用火焰图如何分析火焰图的互动 Arthas常用命令 help &#xff1a;查看所有命令dashboard &#xff1a;仪表板&#xff0c;查看线程的CPU信息等heapdump &#xff1a;不同类对象占用内存比重&a…

【微服务核心】Spring Cloud

文章目录 1. 简介2. 微服务项目搭建2.1 父工程2.2 提供者子工程2.3 热部署配置2.4 消费者子工程2.5 项目重构 3. 服务注册与发现3.1 Eureka 服务注册与发现3.1.1 单机版工程搭建3.1.2 单机版改集群版3.1.3 服务发现3.1.4 保护模式 3.2 ZooKeeper 服务注册与发现3.3 Consul 服务…

【五】【C++】类与对象(三)

const只读 在 C 中&#xff0c;const 关键字用于声明一个变量为常量&#xff0c;意味着一旦被初始化之后&#xff0c;它的值就不能被改变。 声明常量&#xff1a; 使用 const 关键字可以声明变量为常量。这意味着这个变量的值不能被修改。 const int MAX_SIZE 100; 指针与…

【江科大】STM32:MPU6050介绍

文章目录 MPU6050介绍结构图MPU6050参数硬件电路模块内部结构框图数据帧格式寄存器地址 MPU6050介绍 MPU6050是一个6轴姿态传感器&#xff0c;可以测量芯片自身X、Y、Z轴的加速度、角速度参数&#xff0c;通过数据融合&#xff0c;可进一步得到姿态角&#xff0c;常应用于平衡…

【智慧工业】东胜物联定位与跟踪解决方案,为方案商提供蓝牙网关、信标等物联网智能硬件设备

利用东胜物联的蓝牙网关我们的合作伙伴在德国的建筑工地成功实施了基于物联网蓝牙的员工出勤和跟踪管理解决方案&#xff0c;该解决方案简化了员工时间表并增强了工作流程&#xff0c;为经理和主管提供了更多时间来专注于项目洞察&#xff0c;并提高了员工的效率、绩效和生产力…

C++引用、内联函数、auto关键字介绍以及C++中无法使用NULL的原因

文章目录 一、引用1.1 引用概念1.2 引用特性1.3 常引用1.4 使用场景1.4.1 做参数1.4.2做返回值 1.5 引用和指针的区别1.6 小结一下 二、内联函数2.1 内联的概念2.2 内联的特性2.3 【面试题】 三、auto关键字(C11)3.1 类型别名思考3.2 auto简介 四、auto的使用细则4.1 基于范围的…

Linux系统——防火墙

一、防火墙的认识 引言 安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安全…

假期刷题打卡--Day20

1、MT1173魔数 一个数字&#xff0c;把他乘以二&#xff0c;会得到一个新的数字&#xff0c;如果这个新数字依然由原数中那些数字组成&#xff0c;就称原数为一个魔数。输入正整数N&#xff0c;检查它是否是一个魔数&#xff0c;输出YES或者NO。 格式 输入格式&#xff1a; …
最新文章