初识C语言第三十天——设计三子棋游戏
目录
一.设计游戏框架
1.打印游戏菜单
2.输入选择判断(玩游戏/游戏结束/输入错误重新输入)
二、玩游戏过程设计
1.设计棋格存放棋子——二维数组
2.初始化棋盘——初始化为空格
3.打印棋盘——本质上就是打印数组
4.游戏过程——1.玩家走棋 2.判断结果 3.电脑走棋 4.判断结果
⑴玩家走棋
Ⅰ 需要判断棋盘空格的合法性
Ⅱ 判断空格是否被占据
⑵判断输赢——四种结果
Ⅰ 玩家赢
Ⅱ 电脑赢
Ⅲ 游戏平局
Ⅴ 继续游戏
⑶电脑走棋
Ⅰ 用伪随机函数产生,需要伪随机数种子生成器,用空指针的时间函数生成时间戳
Ⅱ 判断空格是否被占据
附录:头文件里的符号定义以及相关声明
一.设计游戏框架
1.打印游戏菜单
//游戏框架
int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请输入>:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择<:\n");break;}} while (input);return 0;
}
2.输入选择判断(玩游戏/游戏结束/输入错误重新输入)
//游戏菜单打印
void menu()
{printf("************************************\n");printf("************ 1.play ************\n");printf("************ 2.exit ************\n");printf("************************************\n");
}
二、玩游戏过程设计
1.设计棋格存放棋子——二维数组
void game()
{//定义3*3的数组来存储棋子类型 存储数据char board[ROW][COL];//完成棋盘的初始化-初始化空格INit_board(board,ROW,COL);//打印棋盘——本质上就是打印数组Displayboard(board,ROW,COL);char ret = 0;while (1){//玩家下棋Playerboard(board,ROW,COL);Displayboard(board, ROW, COL);// 判断游戏进行状态ret=Iswin(board, ROW, COL);if (ret != 'C')break;//电脑下棋Computerboard(board, ROW, COL);Displayboard(board, ROW, COL);if (ret != 'C')break;}if (ret == '*'){printf("玩家赢了\n");}else if (ret == '#'){printf("电脑赢了\n");}else if (ret == 'Q'){printf("游戏平局\n");}Displayboard(board, ROW, COL);}
2.初始化棋盘——初始化为空格
//棋盘的初始化
void INit_board(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col ; j++){board[i][j] = ' ';}}
}
3.打印棋盘——本质上就是打印数组
//打印棋盘
void Displayboard(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}}
4.游戏过程——1.玩家走棋 2.判断结果 3.电脑走棋 4.判断结果
⑴玩家走棋
Ⅰ 需要判断棋盘空格的合法性
Ⅱ 判断空格是否被占据
//玩家下棋
void Playerboard(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;//判断棋盘空格的合法性//判断空格是否被占据while (1){printf("请玩家下棋:<");scanf("%d %d", &x, &y);//判断棋盘空格的合法性if (x >= 1 && x <= 3 && y >= 1 && y <= 3 && board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}//判断空格是否被占据else if(x >= 1 && x <= 3 && y >= 1 && y <= 3 && board[x - 1][y - 1] != ' '){printf("所下棋格被占据,请玩家重新下棋\n");}elseprintf("下棋超出范围,请玩家重新下棋\n");}}
⑵判断输赢——四种结果
Ⅰ 玩家赢
Ⅱ 电脑赢
Ⅲ 游戏平局
Ⅴ 继续游戏
//判断结果
char Iswin(char board[ROW][COL], int row, int col)
{int i = 0;//玩家或电脑赢棋的情况//判断行for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&& board[i][0] !=' ')return board[i][0];}//判断列for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i]&&board[i][0] != ' ')return board[2][i];}//判断对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')return board[1][1];if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')return board[1][1];//判断和棋的情况 返回1棋盘已满 返回0棋盘未放满int ret = Isfull(board,ROW,COL);if (ret == 1){return 'Q';}if (ret == 0)return 'C';}
//为判断和棋情况单独分的函数
int Isfull(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' ')return 0;}}return 1;}
⑶电脑走棋
Ⅰ 用伪随机函数产生,需要伪随机数种子生成器,用空指针的时间函数生成时间戳
Ⅱ 判断空格是否被占据
//电脑下棋
void Computerboard(char board[ROW][COL], int row, int col)
{printf("请电脑下棋:<\n");while (1)//判断空格是否被占据{int x = rand() % 3;int y = rand() % 3;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}
附录:头文件里的符号定义以及相关声明
//头文件的相关引用
#include <stdlib.h>
#include <time.h>//符号的定义
#define ROW 3
#define COL 3//函数的声明
//初始化棋盘的函数
void INit_board(char board[ROW][COL], int row, int col);//打印棋盘的函数
void Displayboard(char board[ROW][COL],int row, int col);//玩家下棋的函数
void Playerboard(char board[ROW][COL], int row, int col);//电脑下棋
void Computerboard(char board[ROW][COL], int row, int col);//判断游戏进行的状态:
char Iswin(char board[ROW][COL], int row, int col);int Isfull(char board[ROW][COL], int row, int col);
相关文章:
初识C语言第三十天——设计三子棋游戏
目录 一.设计游戏框架 1.打印游戏菜单 2.输入选择判断(玩游戏/游戏结束/输入错误重新输入) 二、玩游戏过程设计 1.设计棋格存放棋子——二维数组 2.初始化棋盘——初始化为空格 3.打印棋盘——本质上就是打印数组 4.游戏过程——1.玩家走棋 2.…...
ehcache3多级缓存应用
项目中如果有使用大量的本地缓存场景,可以使用redisehcache组合缓存,优先使用ehcache本地缓存,本地缓存没有查询到再使用redis缓存 可看前文中如何集成 本地缓存使用存在的问题 1、本地缓存如何保证缓存的是最新值 可定义版本号、自增id或者…...
C# WinForm —— 24 Threading.Timer 组件介绍与使用
1. 简介 System.Threading.Timer 多线程 轻量级 精度高 提供以指定的时间间隔对线程池线程执行方法的机制 和System.Timers.Timer 类似,每隔一段时间触发事件,执行操作(不是由UI线程执行的),即使事件中执行了比较耗时的操作,也…...
03-07Java自动化之JAVA基础之循环
JAVA基础之循环 一、for循环 1.1for循环的含义 for(初始化语句;条件判断;条件控制或–){ //代码语句 } 1、首先执行初始话语句,给变量一个起始的值 2、条件判断进行判断,为true,执行循环体中的代码语句 …...
【人工智能Ⅱ】实验8:生成对抗网络
实验8:生成对抗网络 一:实验目的 1:理解生成对抗网络的基本原理。 2:学会构建改进的生成对抗网络,如DCGAN、WGAN、WGAN-GP等。 3:学习在更为真实的数据集上应用生成对抗网络的方法。 二:实验…...
vmware将物理机|虚拟机转化为vmware虚机
有时,我们需要从不同的云平台迁移虚拟机、上下云、或者需要将不再受支持的老旧的物理服务器转化为虚拟机,这时,我们可以用一款虚拟机转化工具:vmware vcenter converter standalone,我用的是6.6的版本,当然…...
redis 高可用及哨兵模式 @by_TWJ
目录 1. 高可用2. redis 哨兵模式3. 图文的方式让我们读懂这几个算法3.1. Raft算法 - 图文3.2. Paxos算法 - 图文3.3. 区别: 1. 高可用 在 Redis 中,实现 高可用 的技术主要包括 持久化、复制、哨兵 和 集群,下面简单说明它们的作用…...
封装tab栏,tab切换可刷新页面
dom结构 <template><div class"container"><!-- tab栏 --><div class"border-b"><tabs:tabsList"tabsList":selectTabsIndex"selectTabsIndex"tabsEven"tabsEven"></tabs></div>…...
JavaScript第八讲:日期,Math,自定义对象
目录 前言 日期 1. 创建日期对象 2. 年/月/日 3. 时:分:秒:毫秒 4. 一周的第几天 5. 经历的毫秒数 6. 修改日期和时间 Math 1. 自然对数和圆周率 2. 绝对值 3. 最小最大 4. 求幂 5. 四舍五入 6. 随机数 自定义对象 1. 通过 new Object 创建对象 2. 通过 funct…...
php质量工具系列之phploc
phploc是一个快速测量PHP项目大小的工具 结果支持raw csv xml json格式,可输出文件或者打印到控制台 安装 PHAR方式 wget https://phar.phpunit.de/phploc.pharphp phploc.phar -vComposer方式(推荐) composer global require --dev phploc/phplocphploc -v使用 …...
创建模拟器
修改模拟器默认路径 由于模拟器文件比较大,默认路径在C:\Users\用户名.android\avd,可修改默认路径 创建修改后的路径文件 D:\A-software\Android\AVD添加系统变量ANDROID_SDK_HOME:D:\A-software\Android\AVD重启Android Studio 创建模拟…...
【Java】接口详解
接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含静态常量。 一个简单的接口代码示例 interface IShape { void draw(); } class Cycle implements IShape { Override public void draw() { System.out.println…...
去掉el-table表头右侧类名是gutter,width=17px的空白区域(包括表头样式及表格奇偶行样式和表格自动滚动)
代码如下: <el-table:data"tableData"ref"scroll_Table":header-cell-style"getRowClass":cell-style"styleBack"height"350px"style"width: 100%"><el-table-column prop"id" l…...
3079. 求出加密整数的和
给你一个整数数组 nums ,数组中的元素都是 正 整数。定义一个加密函数 encrypt ,encrypt(x) 将一个整数 x 中 每一个 数位都用 x 中的 最大 数位替换。比方说 encrypt(523) 555 且 encrypt(213) 333 。 请你返回数组中所有元素加密后的 和 。 示例 1&…...
奶茶店、女装店、餐饮店是高危创业方向,原因如下:
关注卢松松,会经常给你分享一些我的经验和观点。 现在的俊男靓女们,心中都有一个执念: (1)想证明自己了,开个奶茶去…… (2)想多赚点钱了,加盟餐饮店去…… (3)工作不顺心了,搞个女装店去…… 但凡抱着…...
嵌入式笔试面试刷题(day16)
文章目录 前言一、PWM波形的占空比计算公式是什么?二、ADC和DAC在嵌入式系统中的应用场景有哪些?三、watchdog定时器的作用及其在系统中的使用是什么?四、JTAG接口在嵌入式开发中的作用是什么?五、实时操作系统(RTOS)的任务调度策…...
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
目录 一、 动态SQL1.1 \<if>标签1.2 \<trim>标签1.3 \<where>标签1.4 \<set>标签1.5 \<foreach>标签1.6 \<include>标签 二、 #{}与${}的区别2.1 #{}是预编译sql,${}是即时sql2.2 SQL注入2.3 #{}性能高于${}2.4 ${}用于排序功能…...
[Zer0pts2020]easy strcmp 分析与加法
查壳 Ubuntu上的64位程序 第一步应该尝试运行一下 啥也不是 (这里我改了程序,原来应该是a1>1) 但是我动调发现a1值是1 我就改了判断 但是还是没什么用 也找不到a2的引用 找一下有没有什么improt调用 发现还是啥也不是 思路这里断了 刚好这个程序几个代码而已 函数看…...
力扣7. 整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1: 输…...
Mac/Linux getline 无法读取文件内容(读取内容无法显示)
如下面代码 #include <iostream> #include <fstream>using namespace std;int main() {string file_name "1.txt";std::ifstream file(file_name);if (file.is_open()) {std::string line;while (std::getline(file, line)) {char c line.back();cout…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
