p15 p16 c语言实现三子棋

具体的实现代码

game.c

#include "game.h"void InitBoard(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] = ' ';}}
}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");}}
}void PlayerMove(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;printf("玩家走:>");while (1) {printf("请输入要下的坐标:>");scanf("%d%d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col) {if (board[x - 1][y - 1] == ' ') {board[x - 1][y - 1] = '*';break;} else {printf("该坐标被占用");}} else {printf("坐标非法,请重新输入!");}}
}void ComputerMove(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;printf("电脑走:>");while (1) {x = rand() % row;y = rand() % col;if (board[x][y] == ' ') {board[x][y] = '#';break;}}}
//返回1表示棋盘满了
//返回0表示棋盘没满
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;//满了
}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][1] != ' ') {return board[i][1];}}// 竖三列for (i = 0; i < col; i++) {if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') {return board[1][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];}// 判断是否平局if (1==IsFull(board, ROW, COL)) {return 'Q'; // Q表示平局,可以根据需要修改为其他字符或者字符串}return 'C'; // C表示游戏未结束,可以根据需要修改为其他字符或者字符串
}

 test.c

#include "game.h"
void menu()
{printf("**********************");printf("***1.play  0.exit*****");printf("**********************");
}//游戏的整个算法实现
void game(){    char ret=0;//数组用来存放走出的棋盘信息char board[ROW][COL] = {0}; //全部空格//初始化棋盘InitBoard(board, ROW, COL);//打印棋盘DisplayBoard(board, ROW, COL);//下棋while (1){//玩家下棋PlayerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//判断玩家是否赢ret=IsWin(board,ROW,COL);if (ret != 'C'){break;}//电脑下棋ComputerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);//判断电脑是否赢ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}}if (ret == '*'){printf("玩家赢\n");}else if (ret == '#'){printf("电脑赢\n");}else{printf("平局\n");}
}void test()
{int input = 0;srand((unsigned int)time(NULL)); // 随机数种子初始化,放在test函数中更合适,避免多次调用test时重复初始化种子。如果不需要每次运行时都生成不同的随机序列,可以将其移到main函数中。do {menu();printf("请选择:>");scanf("%d", &input);switch (input) {case 1: {game();break; }case 0: {printf("退出游戏");  break;}default: { printf("选择错误,请重新选择!");break;}}} while (input);} void main(){test(); return 0;}

game.h

#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//声明
void InitBoard(char board[ROW][COL],int row,int col);
void DisplayBoard(char board[ROW][COL],int row,int col);
void PlayerMove(char board[ROW][COL],int row,int col);
void ComputerMove(char board[ROW][COL],int row,int col);//告诉我们四种状态
//玩家赢'*'
//电脑赢'#'
//平局'Q'
//继续'C'
char IsWin(char board[ROW][COL],int row,int col);

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

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

相关文章

算法训练(leetcode)第二十九天 | 62. 不同路径、63. 不同路径 II

刷题记录 *62. 不同路径63. 不同路径 II *62. 不同路径 leetcode题目地址 每个单元格的数值都是有上方和左侧的单元格决定的&#xff0c;因此需要先将最上方和最左侧的单元格初始化。因为题目要求只能向下和向右移动&#xff0c;因此最上方和最左侧的单元格初始化为1。 时间…

《昇思25天学习打卡营第8天 | mindspore 模型保存与加载用法》

1. 背景&#xff1a; 使用 mindspore 学习神经网络&#xff0c;打卡第8天&#xff1b; 2. 训练的内容&#xff1a; 为了微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;因此需要保存模型的参数&#xff0c;本小结主要训练保存模型。 3. 常见的用…

【java实现结果集转为树结构,树转为扁平结构】

list转为树&#xff0c;树拉平 业务需求oracle实现树结构1、**Controller.java层** &#xff1a;前端调此处请求2、**service层&#xff1a;** 逻辑结构 &#xff08;zbjcpjService.java&#xff09;&#xff0c;重点&#xff1a;this.entityMapper.queryZbjcpjTree接口3、**ma…

【python算法学习1】用递归和循环分别写下 fibonacci 斐波拉契数列,比较差异

问题&#xff1a; fibonacci 斐波拉契数列&#xff0c;用递归和循环的方法分别写,比较递归和循环的思路和写法的差别 最直接的思路&#xff0c;是写递归方法 循环方法的稍微有点绕&#xff0c;我觉得问题主要是出在&#xff0c;总结循环的通项公式更麻烦&#xff0c;难在数学…

多目标螳螂搜索算法MOMSA求解无人机三维路径规划,可以自行修改障碍物位置(MATLAB代码)

无人机路径规划多目标优化求解是一个复杂的过程&#xff0c;涉及到多个目标的考量和优化算法的应用。以下是一些关键点和相关算法的概述&#xff1a; 1. **多目标优化策略**&#xff1a;在无人机路径规划中&#xff0c;需要同时考虑多个目标&#xff0c;如路径长度、安全性、飞…

关于delete和delete[ ]混用的未定义问题解释

我们知道delete用于释放一个动态空间&#xff0c;而delete[ ]用于释放多个动态空间&#xff0c;但是如果我们混用的话会导致什么问题&#xff1f;我在博客上看了许多文章&#xff0c;但不尽人意&#xff0c;因此写下这篇文章让你知其然知其所以然&#xff08;浅薄的解释&#x…

大数据学习之Spark基础

Spark基础 简述 1、spark作业执行的特点&#xff1a; &#xff08;1&#xff09;只有遇到行动算子的时候&#xff0c;整个spark作业才会被触发执行 &#xff08;2&#xff09;遇到几次&#xff0c;执行几次 2、RDD: 弹性分布式数据集 弹性&#xff1a;数据量可大可小 RDD类似…

插片式远程 I/O模块:Profinet总线耦合器在SIMATIC Manager配置

XD9000是Profinet总线耦合器&#xff0c;单个耦合器最多可扩展32个I/O模块&#xff01;本文将详细介绍如何在SIMATIC Manager中配置插片式远程 I/O模块的Profinet总线耦合器&#xff0c;帮助您更好地应用这一技术。 一、SIMATIC Manager软件组态步骤&#xff1a; 1、创建工程&…

MySQL8之mysql-community-icu-data-files的作用

MySQL8中的mysql-community-icu-data-files包主要提供国际组件&#xff08;ICU&#xff0c;International Components for Unicode&#xff09;的数据文件&#xff0c;这些文件对于MySQL数据库处理多语言数据和进行Unicode字符集转换至关重要。具体来说&#xff0c;mysql-commu…

什么是敏捷本地化

快速、敏捷的多语言产品和服务交付正逐渐成为众多行业的常态。在这种情况下&#xff0c;重点从传统的期望&#xff08;即在合理的时间框架内翻译大量内容&#xff09;转变为翻译工作量非常大的小片段&#xff0c;通常在2-3到12-24小时之间&#xff0c;通常在周末或假期。 Logr…

IntelliJ IDEA自定义菜单(Menus)、任务栏(toolbars)详细教程

一、自定义菜单 1、打开Settings&#xff0c;找到Menus and Toolbars 2、点击右边的Main Menu&#xff0c;点击号&#xff0c;选择Add Action 3、弹出Add Action弹窗&#xff0c;搜索或者选择你要添加的指令 二、自定义工具栏 1、右键IDEA上方的工具栏空白位置&#xff0c;选…

AIGC各个应用场景下的模型选择

需要注意的是&#xff0c;下述模型可以在不同任务和领域中灵活应用&#xff0c;它们的归属也会根据模型的设计和主要应用领域而有所变化&#xff0c;并不绝对。 自然语言处理模型 模型层中自然语言理解(Natural LanguageUnderstanding&#xff0c;NLU)和自然语言生成(NaturalL…

计算机网络体系结构解析

OSI参考模型 与 TCP/IP模型 如图所示 TCP/IP模型有几层 应用层&#xff1a;只需要专注于为用户提供应用功能 HTTP、SMTP、Telnet等&#xff0c;工作在操作系统中的用户态&#xff0c;传输层及以下工作在内核态传输层&#xff1a;为应用层提供网络支持&#xff08;TCP、UDP传…

vue3实现在style中使用响应式变量

vue2的时候需要在style模块中访问script模块中的响应式变量&#xff0c;为此不得不使用css变量去实现。现在vue3已经内置了这个功能啦&#xff0c;可以在style中使用v-bind指令绑定script模块中的响应式变量。 示例 <template><div><span>hello </span&…

内网穿透方案@远程串流控制方案@简单易用的虚拟组网方案

文章目录 串流控制和远程桌面控制相关概念 串流软件和方案商业软件方案开源方案Sunshinesunshine 自启设置 MoonLight 利用串流软件远程控制VPN 虚拟组网实现异地设备串流控制内网穿透关键概念 内网穿透方案简单易用相关服务软件使用Ngrok实现内网穿透开源软件方案Frp 串流控制…

40个高阶ChatGPT学术论文指令集(附GPT使用链接)

我精心挑选的40个顶尖ChatGPT学术论文指令集&#xff0c;无疑将成为你撰写论文和开展研究的珍贵资源&#xff0c;极力推荐你珍藏起来&#xff01;这些建议极具实用价值&#xff0c;能有效提高你的研究工作效率&#xff0c;使得论文撰写过程轻松许多。 在开始前&#xff0c;提示…

力扣 454四数相加

这个题给了四个数组&#xff0c;可以两两判断&#xff0c;就类比两数相加那道题了 对于num1 num2 用unordered_map存储&#xff0c;key是num1&#xff0c;num2中数字相加之和&#xff0c;value是值出现的次数 for(int a:num1) {for(int b:num2 {map[ab]; 最后要计算四个数…

8、matlab彩色图和灰度图的二值化算法汇总

1、彩色图和灰度图的二值化算法汇总原理及流程 彩色图和灰度图的二值化算法的原理都是将图像中的像素值转化为二值&#xff08;0或1&#xff09;&#xff0c;以便对图像进行简化或者特定的图像处理操作。下面分别介绍彩色图和灰度图的二值化算法的原理及流程&#xff1a; 1&a…

坑2.Date类型的请求参数

前端 <el-form-item label"结束日期" prop"endTime"><el-date-pickerv-model"dataForm.endTime"type"date"value-format"yyyy-MM-dd HH:mm:ss"placeholder"选择日期"></el-date-picker></el…

pip install xxx报错ERROR: No matching distribution found for openturns

目录 问题描述解决方案解决方案一&#xff1a;配置代理解决方案二&#xff1a;下载包后手动安装解决方案三&#xff1a;更新pip解决方案四&#xff1a;使用conda安装解决方案五&#xff1a;跳过代理综合步骤 问题描述 C:\Users\54867>pip install openturns WARNING: Ignor…