news 2026/9/14 23:00:03

##三子棋

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
##三子棋

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 定义棋盘大小(3x3)
#define ROW 3
#define COL 3

// 函数声明
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); // 玩家落子(X)
void ComputerMove(char board[ROW][COL], int row, int col); // 电脑落子(O)
char IsWin(char board[ROW][COL], int row, int col); // 判断胜负
int IsFull(char board[ROW][COL], int row, int col); // 判断棋盘是否满

int main() {
char board[ROW][COL];
char result = 0;
srand((unsigned int)time(NULL)); // 初始化随机数种子(用于电脑落子)

InitBoard(board, ROW, COL); // 初始化棋盘
DisplayBoard(board, ROW, COL); // 打印初始棋盘

// 游戏循环:直到分出胜负或平局
while (1) {
PlayerMove(board, ROW, COL); // 玩家落子
DisplayBoard(board, ROW, COL);
result = IsWin(board, ROW, COL); // 判断玩家是否获胜
if (result != 0) break; // 有结果则退出循环

ComputerMove(board, ROW, COL); // 电脑落子
DisplayBoard(board, ROW, COL);
result = IsWin(board, ROW, COL); // 判断电脑是否获胜
if (result != 0) break; // 有结果则退出循环
}

// 输出游戏结果
if (result == 'X') {
printf("恭喜!你赢了!\n");
} else if (result == 'O') {
printf("很遗憾,电脑赢了!\n");
} else if (result == 'Q') {
printf("游戏平局!\n");
}

return 0;
}

// 初始化棋盘:所有位置设为空格(便于后续落子和打印)
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] = ' ';
}
}
}

// 打印棋盘:格式为 1 | 2 | 3 样式,清晰区分行列
void DisplayBoard(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++) {
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");
}
}
}

// 玩家落子:输入坐标(1-3),需判断坐标合法且位置未被占用
void PlayerMove(char board[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
printf("你的回合(落子X):请输入坐标(例如 1 1):");

while (1) {
// 输入坐标(玩家习惯1开始,需转换为数组0开始)
scanf("%d %d", &x, &y);
x--;
y--;

// 判断坐标是否在合法范围内
if (x >= 0 && x < row && y >= 0 && y < col) {
// 判断该位置是否为空
if (board[x][y] == ' ') {
board[x][y] = 'X'; // 落子
break;
} else {
printf("该位置已被占用,请重新输入!\n");
}
} else {
printf("坐标非法(需1-3),请重新输入!\n");
}
}
}

// 电脑落子:随机生成坐标(0-2),仅在空位置落子(O)
void ComputerMove(char board[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
printf("电脑回合(落子O):\n");

while (1) {
// 随机生成合法范围内的坐标
x = rand() % row; // 0-2
y = rand() % col; // 0-2
// 判断位置是否为空
if (board[x][y] == ' ') {
board[x][y] = 'O'; // 落子
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; // 棋盘已满
}

// 判断胜负:返回'X'(玩家赢)、'O'(电脑赢)、'Q'(平局)、0(继续)
char IsWin(char board[ROW][COL], int row, int col) {
int i = 0;

// 1. 判断所有行是否相同(且不为空格)
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];
}
}

// 2. 判断所有列是否相同(且不为空格)
for (i = 0; i < col; i++) {
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') {
return board[0][i];
}
}

// 3. 判断两条对角线是否相同(且不为空格)
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') {
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') {
return board[0][2];
}

// 4. 判断是否平局(棋盘满且未分胜负)
if (IsFull(board, row, col) == 1) {

return 'Q' ;

}

//5.游戏继续(无结果)

return 0 ;

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 3:01:08

深入解析C#方法:从基础到高级应用

第六次一&#xff0c;关于方法1&#xff0c;方法&#xff1a;把一些相关的代码封装在一个代码块里&#xff0c;可以给代码块添加一个名称&#xff0c;这个名称就是方法&#xff0c;可以通过调用这个方法名实现功能&#xff0c;方法可以重复用&#xff0c;减少代码重复率2&#…

作者头像 李华
网站建设 2026/9/14 6:28:34

基于微信小程序的校园食堂点餐订餐系统(毕业设计项目源码+文档)

课题摘要基于微信小程序的校园食堂点餐订餐系统&#xff0c;直击校园食堂 “排队耗时久、选餐信息差、取餐效率低、管理数据化不足” 的核心痛点&#xff0c;依托微信生态的便捷性与云端数据处理能力&#xff0c;构建 “线上精准点餐 线下高效取餐 全流程数据化管理” 的一体…

作者头像 李华
网站建设 2026/9/14 12:19:39

XGW-9000系列高端新能源电站边缘网关产品需求文档(PRD)

XGW-9000系列高端新能源电站边缘网关产品需求文档&#xff08;PRD&#xff09; 文件标识&#xff1a;XGW-9000-PRD-V1.0 文件状态&#xff1a;[√]草稿 [ ]正式发布 [ ]正在修改 当前版本&#xff1a;V1.0 修订记录序号版本编写/修订说明修订人修订日期备注1V1.0创建PRD文档&am…

作者头像 李华
网站建设 2026/9/14 6:14:47

多模态Agent的Docker服务编排全解析(架构师不愿透露的5大核心技巧)

第一章&#xff1a;多模态Agent的Docker服务编排在构建多模态Agent系统时&#xff0c;通常需要整合语音识别、图像处理、自然语言理解等多个异构服务。使用Docker进行服务编排&#xff0c;可以有效隔离各模块运行环境&#xff0c;并实现快速部署与横向扩展。服务容器化设计 每个…

作者头像 李华
网站建设 2026/9/14 23:01:36

网络安全培训全攻略:零基础能学会吗?前景如何?

一句话回答&#xff1a;能学会&#xff0c;且前景光明&#xff01;但这取决于你选择的路是否正确。本文是价值万元的免费攻略&#xff0c;从“能不能学”到“如何学”&#xff0c;再到“学完怎么办”&#xff0c;一次性讲透。一、零基础&#xff0c;真的能学会网络安全吗&#…

作者头像 李华
网站建设 2026/9/13 17:30:54

仓颉stdx模块终极配置指南:从零开始快速上手

仓颉stdx模块终极配置指南&#xff1a;从零开始快速上手 【免费下载链接】cangjie-stdx-bin 仓颉编程语言 stdx 模块二进制发布仓&#xff0c;待迁移。 项目地址: https://gitcode.com/Cangjie/cangjie-stdx-bin 还在为仓颉编程语言中的stdx模块配置而烦恼吗&#xff1f…

作者头像 李华