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

news2024/11/18 19:29:28

由于代码较长,为了增加可读性,我们把代码分别写到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.coloradmin.cn/o/1417623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt学习:http+访问百度智能云api实现车牌识别

目录 登录到百度智能云,找到文字识别 完成操作指引 开通 查看车牌识别的api文档 ​编辑​编辑 查看自己应用的api key 查看回应的数据格式 编程步骤 ui界面编辑 添加模块,头文件和定义变量 新建两个类,一个图像Image类&#xff0c…

深度学习之卷积神经网络进阶版

上一讲我们介绍了卷积神经网络和多层感知机,也就是全链接网络。他们在网络架构上是串行的结构,也就是在每一层与每一层之间,前面一层的输出,是后面一层的输入。 在神经网络里面,我们可能会有更加复杂的结构&#xff0…

Pycharm连接云算力远程服务器(AutoDL)训练深度学习模型全过程

前言:在上一篇windows搭建深度学习环境中,我试图使用笔记本联想小新air14的mx350显卡训练一个图像检测的深度学习模型,但是训练时长大概需要几天时间远超我的预期,所以我便选择租用GPU进行训练,在对多家平台对比后找到…

[BT]小迪安全2023学习笔记(第19天:Web开发-.NET项目)

第19天 名词解释 .NET 是一种由Microsoft开发的软件框架,用于构建和运行Windows操作系统上的应用程序。它提供了一个广泛的工具和库集合,支持多种编程语言,包括C#、VB.NET、F#等。.NET的主要目标是提供一种一致的开发平台,使开发…

《HTML 简易速速上手小册》第1章:HTML 入门(2024 最新版)

文章目录 1.1 HTML 简介与历史(😉🌐👽踏上神奇的网页编程之旅)1.1.1 从过去到现在的华丽蜕变1.1.2 市场需求 —— HTML的黄金时代1.1.3 企业中的实际应用 —— 不只是个网页1.1.4 职业前景 —— 未来属于你 1.2 基本 H…

SQL注入:二次注入

SQL注入系列文章: 初识SQL注入-CSDN博客 SQL注入:联合查询的三个绕过技巧-CSDN博客 SQL注入:报错注入-CSDN博客 SQL注入:盲注-CSDN博客 目录 什么是二次注入? 二次注入演示 1、可以注册新用户 2、可以登录->…

数据湖技术之平台建设篇2

数据湖技术之平台建设篇1,主要介绍了湖仓平台建设的前三个主要工作,本次主要继续上次的建设工作介绍,聊一聊一站式湖仓服务平台的相关管理能力建设以及针对小文件的处理。 一. 一站式湖仓服务平台的相关管理能力 主要是将相关能力落地到平台…

day03-今日佳人功能实现

课程说明 首页功能说明系统架构说明实现今日佳人功能实现推荐用户的列表接口增加缓存功能整合前端联调测试 1、首页 在用户登录成功后,就会进入首页,首页中有今日佳人、推荐好友、探花、搜附近等功能。 2、系统架构 在开发完SSO系统中的登录功能后&…

【Spring实战】31 Spring Boot3 集成 Gateway 微服务网关

文章目录 1. 定义2. 功能3. 示例代码1) 创建一个业务服务2)创建一个网关服务3)启动服务4)验证 4. 代码参考结语 1. 定义 Spring Cloud Gateway 是一个基于 Spring Framework 的开源网关服务,用于构建微服务架构中的 API 网关。它…

SpringCloud LoadBalancer

SpringCloud LoadBalancer 1.什么是LoadBalancer LoadBalancer(负载均衡器)是一种网络设备或软件机制,用于分发传入的网络流量负载请求到多个后端目标服务器上,从而实现系统资源的均衡利用和提高系统的可用性和性能。 负载均衡器…

前端工程化之:webpack1-7(入口和出口)

前置知识 node 环境下 "./" 代表的意思: 模块化代码中,比如 require("./") ,表示当前 js 文件所在的目录。在路径处理中, "./" 表示 node 运行目录。__dirname:所有情况下,…

Python tkinter (8) ——Spinbox控件

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按钮与复选框 Pyt…

数据结构【图的遍历】

数据结构之图 图的类型定义和存储结构图的遍历遍历的定义图的特点图常用的遍历深度优先搜索 DFS(DepthFirstSearch)算法实现算法效率分析 广度优先搜索 BFS(BreadthFirstSearch)算法实现算法效率分析 DFS与BFS算法效率比较 图的类…

iOS_Xcode_LLDB调试常用命令

文章目录 结构常用命令:1、流程控制:2、常用命令3、进程信息:4、寄存器:register5、镜像:image6、内存:memory7、符号断点:breakpoint8、内存断点:watchpoint9、Tips: 结…

【HarmonyOS应用开发】开发介绍 DevEco Studio安装与使用(一)

内容比较长,干货满满,全是实战操作内容,希望耐心观看,如果对你有所帮助,请点个赞! 官方文档:https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667303102887820 访…

华为OD-华为机试精讲500篇系列文章目录介绍(持续补充ing)

目录 背景介绍 什么是华为OD? OD现状 OD趋势 华为OD机考刷题攻略 1、刷题资料:投递岗位通过筛选后提供 2、注意事项: 真题代码目录 背景介绍 经济下行的这几年,每个人都感同身受,如何让自己在芸芸众生中脱颖而…

ubuntu中的rsyslog

目录 1. rsyslog简介 2. 查看/var/log 3. syslog的配置文件 3.1 /etc/rsyslog.d/50-default.conf 3.2 /etc/rsyslog.conf 4. 如何写入syslog 4.1 C语言 4.2 shell 4.3 内核输出 5. syslog.1和syslog.2.gz等文件是如何生成 6. logrotate是如何被执行 7. 如何限制sys…

linux 运行vue项目

1:在本地电脑 项目跟目录 执行 npm run build 在根目录生成文件夹 dist 2:复制dist 到linux 上 /usr/vuespace/ledger-web/dist 3: 配置nginx server {listen 443 ssl;server_name tz.i569.cn; #填写绑定证书的域名ssl_certificate /etc/nginx/myconf…

蓝桥杯备战——8.DS1302时钟芯片

1.分析原理图 由上图可以看到,芯片的时钟引脚SCK接到了P17,数据输出输入引脚IO接到P23,复位引脚RST接到P13。 2.查阅DS1302芯片手册 具体细节还需自行翻阅手册,我只截出重点部分 总结:数据在上升沿写出,下降沿读入,…

赚钱的雏形,是跑通最小闭环!

没赚钱本事,就专心打磨武器! 很多人有一个错误的认知,就是做项目一定是新的,一定是有创新在里面,但其实赚钱的开始,一定是复制现有的项目。 现有的项目,可以确保他有市场,能够跑通&a…