当前位置: 首页 > news >正文

C语言-->三子棋(基础版)

一.思路:

1.项目由3个文件组成:test.c game.h game.c(方便功能区分)

2.游戏menu

3.创建棋盘

4.初始化棋盘

5.打印棋盘

6.玩家/电脑下棋

7.输赢判断

二.具体过程演示:

1.项目由3个文件组成:test.c game.h game.c(方便功能区分)

2.游戏menu

输入1-->开始游戏 0-->退出游戏 其他数-->重新输入

void menu()
{
printf("****************************\n");
printf("******1.play 2.exit******\n");
printf("****************************\n");
}

int input = 0;
do
{ menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏!\n");
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);

3.创建棋盘

char Board[ROW][COL] = { 0 };

4.初始化棋盘

将棋盘初始化为空格

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] = ' ';
}
}
}

5.打印棋盘

打印棋盘(方便观察)

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");
}
}
}

6.玩家下棋

void PlayerMove(char Board[ROW][COL], int row, int col)
{
printf("玩家下棋:\n");
printf("请输入坐标:\n");
int x, y;
while (1)
{ scanf("%d %d", &x, &y);
if (0 < x && x <= col & 0 < y && y <= row)
{
if (Board[y - 1][x - 1] == ' ')
{
Board[y - 1][x - 1] = '*';
break;
}
else
{
printf("坐标被占用,请重新输入\n");
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
}

7.电脑下棋

void CompurterMove(char Board[ROW][COL], int row, int col)
{
printf("电脑下棋:\n");
while (1)
{
srand((unsigned int)time(NULL));
int x = rand()%col;
int y = rand() % row;
if (Board[x][y] == ' ')
{
Board[x][y] = '#';
break;
}
}
}

8.输赢判断

返回:玩家胜--> * 电脑--> # 平局-->Q 继续-->C

char IsWin(char Board[ROW][COL], int row, int col)
{
int i = 0;
int j = 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 (j = 0; j < col; j++)
{
if (Board[0][j] == Board[1][j] && Board[1][j] == Board[2][j] && Board[1][j] != ' ')
return Board[1][j];
}
//对角线
{
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 (IsFull(Board, ROW, COL) == 1)
return 'Q';
//继续
return 'C';
}


三.完整code

test.c

#include "game.h" void menu() { printf("****************************\n"); printf("******1.play 2.exit******\n"); printf("****************************\n"); } void game() { char Board[ROW][COL] = { 0 };//创建棋盘 InitBoard(Board,ROW,COL);//初始化数组 DisplayBoard(Board, ROW, COL);//打印棋盘 char ret = 0; while(1) { PlayerMove(Board, ROW, COL);//玩家下棋 DisplayBoard(Board, ROW, COL);//打印棋盘 ret = IsWin(Board, ROW, COL);//判断输赢 if (ret != 'C') break; CompurterMove(Board, ROW, COL);//电脑下棋 DisplayBoard(Board, ROW, COL);//打印棋盘 ret = IsWin(Board, ROW, COL);//判断输赢 if (ret != 'C') break; } if (ret == 'Q') printf("平局!\n"); else if(ret == '*') printf("玩家胜利!\n"); else printf("电脑胜利!\n"); } int main() { int input = 0; do { menu(); scanf("%d", &input); switch (input) { case 1: printf("开始游戏!\n"); game(); break; case 0: printf("退出游戏!\n"); break; default: printf("输入错误,请重新输入!\n"); break; } } while (input); return 0; }

game.h

#define _CRT_SECURE_NO_WARNINGS #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 CompurterMove(char Board[ROW][COL], int row, int col); char IsWin(char Board[ROW][COL], int row, int col);

game.c

#include "game.h" char 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 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; 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"); } } } //玩家下棋 void PlayerMove(char Board[ROW][COL], int row, int col) { printf("玩家下棋:\n"); printf("请输入坐标:\n"); int x, y; while (1) { scanf("%d %d", &x, &y); if (0 < x && x <= col & 0 < y && y <= row) { if (Board[y - 1][x - 1] == ' ') { Board[y - 1][x - 1] = '*'; break; } else { printf("坐标被占用,请重新输入\n"); } } else { printf("坐标非法,请重新输入\n"); } } } //电脑下棋 void CompurterMove(char Board[ROW][COL], int row, int col) { printf("电脑下棋:\n"); while (1) { srand((unsigned int)time(NULL)); int x = rand()%col; int y = rand() % row; if (Board[x][y] == ' ') { Board[x][y] = '#'; break; } } } char IsWin(char Board[ROW][COL], int row, int col) { int i = 0; int j = 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 (j = 0; j < col; j++) { if (Board[0][j] == Board[1][j] && Board[1][j] == Board[2][j] && Board[1][j] != ' ') return Board[1][j]; } //对角线 { 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 (IsFull(Board, ROW, COL) == 1) return 'Q'; //继续 return 'C'; }
http://www.jsqmd.com/news/581645/

相关文章:

  • 永州大米厂家哪家服务好? - 中媒介
  • 千问3.5-2B图文对话入门:一张图+一句话提问,实现图像理解、颜色判断、主体定位
  • 基于 Java 实现美团、饿了么外卖 API 统一接入层设计与适配方案
  • 效率革命:跳过java安装与配置,在快马平台即开即用地开发工具类
  • 深度技术解析:OpenCore Legacy Patcher 系统兼容性工具的高级优化实战
  • 使用hgdbdeveloper开发工具导出数据后在异机恢复时报错
  • 2026年注册网易企业邮箱关键注意事项与避坑指南 - 品牌2025
  • 嵌入式RC脉冲解码与通道状态诊断库
  • WindowResizer:突破窗口限制的桌面空间优化工具
  • 湖南大米加工哪家设备好? - 中媒介
  • 2026年深圳靠谱的ODI备案公司总结,和你一起品味ODI境外投资备案服务 - 工业推荐榜
  • 3步实现图表数据提取:WebPlotDigitizer全攻略
  • 提升机器人开发效率:基于快马平台构建openclaw与ollama的智能指令中转层
  • d2s-editor:高效管理暗黑破坏神2存档的全攻略
  • SEO_10个实用的SEO技巧,快速提升网站排名(380 )
  • WebGLStudio.js虚拟文件系统完全指南:如何高效管理3D资源
  • 2026年白银靠谱职业技能培训教育机构费用,大概多少钱 - 工业设备
  • OpenClaw模型切换指南:Qwen2.5-VL-7B与其他模型性能对比测试
  • 低代码平台会取代程序员吗?面向软件测试从业者的专业深度分析
  • 实战演练:基于快马构建集成copaw的日志自动化分析与报告系统
  • 实战Nodejs构建文件管理系统:基于快马AI生成生产级后端代码
  • python+uiautomator2+adb_环境搭建
  • Git-Credential-Manager-for-Windows安全存储机制深度解析:如何保护你的Git凭证安全 [特殊字符]
  • Fluxion多语言支持终极指南:从.lang文件到本地化shell脚本的完整实现
  • 探讨白银地区好用的职业技能培训基地,怎么选择 - 工业品网
  • 3步释放硬件潜能:DiscreteDeviceAssigner设备直通工具让虚拟化性能提升200%
  • 快速验证ai模型差异:在快马平台一键切换openclaw的代码生成模型
  • 开源生命周期评估实战:企业级碳足迹分析解决方案
  • Anthropic一夜震撼升级:Claude获得「永久在线」,全球打工人变天
  • Express-Mongoose-ES6-REST-API调试技巧:Debug模块高级用法