C语言三子棋解析
目录(标2的是我自己写的一堆问题不知道怎么改)
- 开始菜单1
- 打印棋盘1
- 玩家下棋1
- 电脑下棋1
- 判断输赢1
- 开始菜单2
- 打印棋盘2
- 选择先后2
- 玩家下棋2
- 电脑下棋2
- 判断输赢2
- 完整代码
- 文件else.h
- 文件else.c
- 文件test.c
开始菜单1
void menu()//打印菜单
{printf("******************\n");printf("******1.play******\n");printf("******0.exit******\n");printf("******************\n");
}
打印棋盘1
//存放下棋数据
char board[ROW][COL] = { 0 };
//初始化棋盘为全空格
InitBoard(board, ROW, COL);
//初始化棋盘为空格
void InitBoard(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++){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]);//别忘记board[i][j]if (j < col - 1){printf("|");}}printf("\n");//打印分割行if (i < row-1)//记住 row-1{for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}printf("\n");}}
}
玩家下棋1
//玩家下棋
void player_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("玩家下棋\n");while (1){printf("请输入坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("该坐标被占用,请重新输入\n");}}else{printf("非法坐标,请重新输入\n");}}
电脑下棋1
void computer_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("电脑下棋:>\n");while (1){x = rand() % 3;//范围(a,b)用rand表示就是rand()%(b-a+1)y = rand() % 3;if (board[x][y] == ' ')//判断是否为空格,因为只有这一个条件,所以满足这个条件就可以下{board[x][y] = '#';break;}}
}
判断输赢1
while (1)//玩家和电脑轮流下棋,直到一方胜利{ //玩家下棋player_move(board, ROW, COL);//打印棋盘DisplayBoard(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}//电脑下棋computer_move(board, ROW, COL);//打印棋盘DisplayBoard(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}}if (ret == '*'){printf("玩家获胜\n");}else if (ret == '#'){printf("电脑获胜\n");}else // (ret == 'Q'){printf("平局\n");}DisplayBoard(board, ROW, COL);
}//判断输赢
char is_win(char board[ROW][COL], int row, int col)
{//判断每一行是否都相等int i = 0;for (i = 0; i < col; 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[i][1];}}//判断对角线是否都相等if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//判断平局if (is_full(board, row, col) == 1){return 'Q';}//继续return 'C';
}
开始菜单2
int begin()
{printf("##########请选择##########\n");printf("##########1:play##########\n");printf("##########0:exit##########\n");printf("##########################\n");int a = 0;scanf("%d", &a);if (a == 0 || a == 1)return 1;else{printf("输入错误,请重新输入\n");return 0;}
}
打印棋盘2
void play(char arr[3][3])
{for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (j < 2)printf(" %c |", arr[i][j]);elseprintf(" % c ", arr[i][j]);}printf("\n");printf("___|___|___\n");}
}
选择先后2
int select()
{int select1;printf("##########################\n");printf("######请选择先后顺序######\n");printf("#########1:玩家先#########\n");printf("#########2:电脑先#########\n");printf("##########################\n");scanf("%d", &select1);if(select1==1||select1==2)return select1;else{printf("输入错误,请重新输入\n");return 0;}
}
玩家下棋2
int player(char arr[3][3])
{printf("请输入坐标\n");int x , y ;scanf("%d %d", &x, &y);if (x >= 1 && x <= 3 && y >= 1 && y <= 3 && arr[x-1][y-1] != '@'){arr[y - 1][x - 1] = '*';return 1;}else{printf("输入错误,请重新输入\n");return 0;}
}
电脑下棋2
void computer(char arr[3][3])
{while (1){srand((unsigned int)time(NULL));int r1 = 0 + rand() % (2 - 0 + 1);int r2 = 0 + rand() % (2 - 0 + 1);if (arr[r1][r2] == '#'){arr[r1][r2] = '@';break;}}
}
判断输赢2
这里不想思考了所以直接就把这些情况都列举出来了
int over(char arr[3][3])
{if (arr[0][0] =='*' && arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0])//横着的第一行为*{printf("玩家获胜\n");return 1;}else if (arr[1][0] == '*' && arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2])//横着的第二行为*{printf("玩家获胜\n");return 1;}else if (arr[2][0] == '*' && arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2])//横着的第三行为*{printf("玩家获胜\n");return 1;}else if (arr[0][0] == '*' && arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2])//竖着的第一列为*{printf("玩家获胜\n");return 1;}else if (arr[1][0] == '*' && arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2])//竖着的第二列为*{printf("玩家获胜\n");return 1;}else if (arr[2][0] == '*' && arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2])//竖着的第三列为*{printf("玩家获胜\n");return 1;}else if (arr[0][0] == '*' && arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])//对角线左到右为*{printf("玩家获胜\n");return 1;}else if (arr[2][0] = '*' && arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2])//对角线右到左为*{printf("玩家获胜\n");return 1;}else if (arr[0][0] == '@' && arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0])//横着的第一行为*{printf("电脑获胜\n");return 1;}else if (arr[1][0] == '@' && arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2])//横着的第二行为*{printf("电脑获胜\n");return 1;}else if (arr[2][0] == '@' && arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2])//横着的第三行为*{printf("电脑获胜\n");return 1;}else if (arr[0][0] == '@' && arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2])//竖着的第一列为*{printf("电脑获胜\n");return 1;}else if (arr[1][0] == '@' && arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2])//竖着的第二列为*{printf("电脑获胜\n");return 1;}else if (arr[2][0] =='@' && arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2])//竖着的第三列为*{printf("电脑获胜\n");return 1;}else if (arr[0][0] =='@' && arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])//对角线左到右为*{printf("电脑获胜\n");return 1;}else if (arr[2][0] == '@' && arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2])//对角线右到左为*{printf("电脑获胜\n");return 1;}else{int count = 0;for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (arr[i][j] != '#')count++;}}if (count == 9){printf("平局\n");return 2;}}
}
完整代码
文件else.h
#pragma once
int begin();
void play(char arr[3][3]);
int select();
void computer(char arr[3][3]);
int player(char arr[3][3]);
int over(char arr[3][3]);
文件else.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int begin()
{printf("##########请选择##########\n");printf("##########1:play##########\n");printf("##########0:exit##########\n");printf("##########################\n");int a = 0;scanf("%d", &a);if (a == 0 || a == 1)return 1;else{printf("输入错误,请重新输入\n");return 0;}
}
void play(char arr[3][3])
{for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (j < 2)printf(" %c |", arr[i][j]);elseprintf(" % c ", arr[i][j]);}printf("\n");printf("___|___|___\n");}
}
int select()
{int select1;printf("##########################\n");printf("######请选择先后顺序######\n");printf("#########1:玩家先#########\n");printf("#########2:电脑先#########\n");printf("##########################\n");scanf("%d", &select1);if(select1==1||select1==2)return select1;else{printf("输入错误,请重新输入\n");return 0;}
}
void computer(char arr[3][3])
{while (1){srand((unsigned int)time(NULL));int r1 = 0 + rand() % (2 - 0 + 1);int r2 = 0 + rand() % (2 - 0 + 1);if (arr[r1][r2] == '#'){arr[r1][r2] = '@';break;}}
}int player(char arr[3][3])
{printf("请输入坐标\n");int x , y ;scanf("%d %d", &x, &y);if (x >= 1 && x <= 3 && y >= 1 && y <= 3 && arr[x-1][y-1] != '@'){arr[y - 1][x - 1] = '*';return 1;}else{printf("输入错误,请重新输入\n");return 0;}
}int over(char arr[3][3])
{if (arr[0][0] =='*' && arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0])//横着的第一行为*{printf("玩家获胜\n");return 1;}else if (arr[1][0] == '*' && arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2])//横着的第二行为*{printf("玩家获胜\n");return 1;}else if (arr[2][0] == '*' && arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2])//横着的第三行为*{printf("玩家获胜\n");return 1;}else if (arr[0][0] == '*' && arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2])//竖着的第一列为*{printf("玩家获胜\n");return 1;}else if (arr[1][0] == '*' && arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2])//竖着的第二列为*{printf("玩家获胜\n");return 1;}else if (arr[2][0] == '*' && arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2])//竖着的第三列为*{printf("玩家获胜\n");return 1;}else if (arr[0][0] == '*' && arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])//对角线左到右为*{printf("玩家获胜\n");return 1;}else if (arr[2][0] = '*' && arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2])//对角线右到左为*{printf("玩家获胜\n");return 1;}else if (arr[0][0] == '@' && arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0])//横着的第一行为*{printf("电脑获胜\n");return 1;}else if (arr[1][0] == '@' && arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2])//横着的第二行为*{printf("电脑获胜\n");return 1;}else if (arr[2][0] == '@' && arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2])//横着的第三行为*{printf("电脑获胜\n");return 1;}else if (arr[0][0] == '@' && arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2])//竖着的第一列为*{printf("电脑获胜\n");return 1;}else if (arr[1][0] == '@' && arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2])//竖着的第二列为*{printf("电脑获胜\n");return 1;}else if (arr[2][0] =='@' && arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2])//竖着的第三列为*{printf("电脑获胜\n");return 1;}else if (arr[0][0] =='@' && arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])//对角线左到右为*{printf("电脑获胜\n");return 1;}else if (arr[2][0] == '@' && arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2])//对角线右到左为*{printf("电脑获胜\n");return 1;}else{int count = 0;for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (arr[i][j] != '#')count++;}}if (count == 9){printf("平局\n");return 2;}}
}
文件test.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"else.h"
int main()
{int r = 0;char arr[3][3] = { {'#','#','#'},{'#','#','#'},{'#','#','#' } };while (1){if (begin() == 1)break;}play(arr);while (1){r = select();if(r==1||r==2)break;}while (1){if (r == 1){while (1){while (1){if (player(arr) == 0)break;play(arr);printf("\n");computer(arr);play(arr);printf("\n");over(arr);}}}else{while (1){computer(arr);play(arr);printf("\n");player(arr); play(arr);printf("\n");over(arr);}}}return 0;
}
相关文章:
C语言三子棋解析
目录(标2的是我自己写的一堆问题不知道怎么改) 开始菜单1打印棋盘1玩家下棋1电脑下棋1判断输赢1开始菜单2打印棋盘2选择先后2玩家下棋2电脑下棋2判断输赢2完整代码文件else.h文件else.c文件test.c 开始菜单1 void menu()//打印菜单 {printf("*****…...

【Jenkins打包服务,Dockerfile报错:manifest for java : 8 not fourd】
1、问题描述 Jenkins打包服务运行dockerfile里的FROM java:8报错manifest for java : 8 not fourd Caused by: com.spotify. docker.client.exceptions.DockerException: manifest for java:8 not found2、解决方法 在网上查找许多方法后得出这是由于Docker官方已经弃用java…...

读SQL学习指南(第3版)笔记06_连接和集合
1. 连接 1.1. 笛卡儿积 1.1.1. 交叉连接(cross join) 1.1.2. 查询并没有指定两个数据表应该如何连接,数据库服务器就生成了笛卡儿积 1.1.2.1. 两个数据表的所有排列组合 1.1.3. 很少会用到(至少不会特意用到) 1.…...
C#学习,结构,面向对象,类
结构和类 结构是从过程化程序设计中保留下来的一种数据类型,类则是面向对象程序设计中最基本的、也是最重要的概念。 结构 结构是一种值类型,通常用来封装一组相关的变量,结构中可以包含构造函数、变量、字段、方法、属性、运算符、事件和…...

【PHP】文件操作
文章目录 文件编程的必要性目录操作其它目录操作递归遍历目录PHP5常见文件操作函数PHP4常见文件操作函数其他文件操作函数 文件编程的必要性 文件编程指利用PHP代码针对文件(文件夹)进行增删改查操作。 在实际开发项目中,会有很多内容&…...

科创板50ETF期权交易:详细规则、费用、保证金和开户攻略
科创板50ETF期权是指以科创板50ETF为标的资产的期权合约。科创板50ETF是由交易所推出的一种交易型开放式指数基金(ETF),旨在跟踪科创板50指数的表现,下文介绍科创板50ETF期权交易:详细规则、费用、保证金和开户攻略&am…...

怎么把图片放大并且清晰?有详细的方法步骤
怎么把图片放大并且清晰?数字图像处理中的图片放大是许多行业和领域中广泛应用的一项技术。常规的放大方法通过插值或复制像素的方式增加像素数,但这会导致失真和模糊。无损放大是一种特殊的放大方法,它可以通过数学算法来增加图片的尺寸&…...
C++ 构造函数、析构函数调用虚函数
C虚函数是通过虚表实现的,虚函数的地址记录在需表中,只对象完成构造完成后,虚函数的地址才最终确定。 构造函数中调用虚函数 基类先于派生类构造,所以构造时没法调用到派生类的虚函数,也就是说只能调用到自己&#x…...

工业状态监测如何选择合适的无线技术?
工业领域的状态监测在提高生产效率和产品质量方面起着关键作用。过去依赖于预防性维护和例行检查的方式已经不再能满足日益复杂的生产需求,随着工业物联网(IIoT)的兴起,设备状态监测逐渐成为一种关键策略,催生了预测性…...

Mysql45讲学习笔记
前言:这篇文章主要总结事务,锁、索引的一些知识点,然后分享一下自己学习小心得,我会从点到线在到面展开说说,对于学习任何知识,我们都应该藐其全貌,不要一开始就选入细节 基础 一、基础架构&a…...
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
报错描述 情景一 1Panel在"主机-->进程守护"通过命令"nohup /opt/tomcat/bin/startup.sh > /opt/supersivor/tomcat/nohup.log &"创建守护进程,运行日志如下: #--------------------------------------------------------…...

opencv 水果识别+UI界面识别系统,可训练自定义的水果数据集
目录 一、实现和完整UI视频效果展示 主界面: 测试图片结果界面: 自定义图片结果界面: 二、原理介绍: 图像预处理 HOG特征提取算法 数据准备 SVM支持向量机算法 预测和评估 完整演示视频: 完整代码链接 一、…...
TypeScript数组和对象的操作
TypeScript数组和对象的操作 一、数组的声明二、数组初始化三、数组元素赋值、添加、更改四、删除五、合并、断开数组六、查找数组元素七、连接数组元素八、排序、反序数组九、遍历数组,对象 一、数组的声明 let arr1: Array<number>; let arr2: number[];二…...

docker之Compose与DockerSwarm
目录 Compose 简介 概念 为什么需要? 配置字段 常用命令 安装 1.下载 2.授权 使用 1.创建文件 2.启动 docker Swarm 关键概念 调度策略 spread binpack random 特性 集群部署 1.准备 2.创建swarm并添加节点 在主服务器上创建swarm集群 节点…...
VS Code 使用 clang++ 编译,使用 cppvsdbg 或 lldb 调试的配置方法
需要安装的 VS Code LLVM VS Code 需要安装的插件: C/C(用来配置 c_cpp_properties.json) CodeLLDB(如果你要用 lldb 调试,那么这个插件就需要安装,用来连接到 lldb 调试器) 流程 我们都…...
android11,12 Launcher3编译什么
1首先看看手机里的是什么 adb shell pm path com.android.launcher3 package:/system_ext/priv-app/Launcher3QuickStep/Launcher3QuickStep.apk 然后就编译Launcher3QuickStep 2push apk 没什么说的,push到对应的文件夹 /system_ext/priv-app/Launcher3Quick…...

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结
Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结。 01 前言 在使用 Go 语言进行 Web 开发时,我们往往会选择一些优秀的库来简化 HTTP 请求的处理。其中,go-resty 是一个被广泛使用的 HTTP 客户端。…...
【C语言】#define 宏定义初步使用
使用宏定义可以防止出错,提高可移植性,可读性,方便性等。 下面列举了一些成熟软件中常用的宏定义。 重新定义一些基本类型 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便…...
项目里面怎么解决跨域的?
一.前端配置跨域 proxy解决跨域 在vue.config.js中通过proxy devServer中配置反向代理。 devServer: {port: port,open: true,overlay: {warnings: false,errors: true},// 配置反向代理proxy: {// 当地址中有/api的时候会触发代理机制/api: {target: http://ihrm-java.ithe…...
Oracle 批量导出表注释和主键
–查询分表(目前分了16张表) –先查询注释为空的表,也就是11表做示例,统计出来以后11批量修改成1 select owner,column_name,comments,table_name from all_col_comments a where a.table_name like ‘TB%1’ and a.comments is n…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...