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

【C语言极简自学笔记】井字棋开发

一、项目概述​

井字棋是一款经典的双人游戏,玩家轮流在 3x3 的棋盘上放置棋子,先在水平、垂直或对角线方向形成三个相同棋子的一方获胜。若棋盘被填满且无人获胜,则游戏平局。我们的目标是实现一个控制台版本的井字棋游戏,支持玩家与电脑对战,电脑将采用简单的随机策略选择落子位置。

二、代码实现 

1.初始界面 

首先利用do ....while函数最少执行依次的特点,在屏幕上打印一个游戏的开始界面,代码和结果如下:

#include <stdio.h>
void menu()
{printf("*****************************\n");printf("******1.开始游戏 0.exit******\n");printf("*****************************\n");
}
int main()
{int input = 0;do{menu();} while(input);return 0;
}

 2.用户选择

界面打印之后,用户可以通过键盘来输入数据,以选择是否开始游戏,利用switch语句来判断输入是否合理,结果如下:

printf("请选择:>\n");
scanf("%d",&input);
switch (input)
{
case 1:printf("开始游戏\n");game();break;
case 0:printf("退出游戏\n");break;
default:printf("选择错误,请重新选择\n");break;
}

 3.初始化棋盘并打印

在进入游戏之后,首先需要初始化棋盘并打印,因此需要声明函数来实现棋盘的初始化和打印

初始化棋盘

通过for循环遍历二维数组的每一个元素,让其初始化为空格

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行第一列元素为“    字符    ”,若列数小于列数减一,则打印“|”,完成后换行。然后判断数据是否小于行数减一,若符合,则打印“---”,若列数据小于所设定的列,则打印“|”,结果如下:

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){int j = 0;for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}printf("\n");}}
}

4.开始游戏

棋手下棋

棋手下棋主要通过初始化棋子的坐标,然后由棋手手动输入坐标来实现,若坐标对应位置为空格,则另该坐标位*,若已经被占用,则输出“坐标被占用,请重新输入”,若坐标不满足二维数组的条件,则输出“坐标非法请重新输入”。

void PlayerMove(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 <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}elseprintf("坐标被占用,请重新输入\n");}else{printf("坐标非法,,请重新输入\n");}}}

 电脑下棋

电脑下棋的坐标通过rand函数来生成随机数,然后将随机数取模行和列之后分别赋值给局部变量,另数组对应位置位“#”即可实现。

void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋\n");int x = 0;int y = 0;while (1){x = rand() % row;y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}

 5.判断输赢

当玩家或着电脑输入坐标之后,需要判断是否赢得游戏,若没有,则继续游戏,若已经有横列、纵列以及对角线中的中的其中一个实现三子相连,则获得胜利。因此需要写一个函数来实现判断输赢,该函数主要通过判断行,或者列或者对角线三个元素是否相等且不等于空格来实现,代码如下:

判断行:

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

判断列

int j = 0;
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][1] && board[1][1] != ' ')
{return board[1][1];
}

 若都不满足,则需要判断是否平局,因此需要一个函数来判断棋盘中是否有空,若有返回0,若无返回1,然后利用返回值,通过条件语句来给主函数返回Q,代表平局。

//判断是否有空,有空返回0,没有返回1
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;
}
if (Isfull(board, row, col))
{return 'Q';
}

 若以上条件都不满足,则返回C表示继续游戏,整体结果如下。

6.效果展示 

选择1后开始游戏,打印初始化棋盘,并提醒玩家输入坐标

当玩家输入坐标后,先判断输赢还是继续游戏,若继续游戏,则电脑开始下棋,若已经有结果,则输出结果。 

 

三、总结

开发这个井字棋游戏,综合运用了 C 语言的数组、循环、条件判断、函数定义等基础知识。在实现过程中,需要注意代码的逻辑顺序和边界条件的处理,例如输入合法性检查、棋盘状态的判断等。虽然这个版本的电脑 AI 只是简单的随机落子,不够智能,但作为初学者的入门项目,已经能够帮助我们加深对 C 语言的理解和应用。希望大家可以在此基础上进行改进和扩展,比如实现更智能的 AI 算法、支持双人对战等,进一步提升自己的编程能力。 

http://www.xdnf.cn/news/423829.html

相关文章:

  • Ozon平台产品关键词优化指南:精准引流与转化提升实战策略
  • 影刀RPA开发-CSS选择器介绍
  • 中国品牌日 | 以科技创新为引领,激光院“风采”品牌建设结硕果
  • vscode 同一个工作区,不同文件夹之间跳转问题
  • 嵌入式学习笔记 - HAL_ADC_ConfigChannel函数解析
  • 2025-05-13 Unity 网络基础12——大小端模式
  • centos中JDK_PATH 如何设置
  • 从 Vue3 回望 Vue2:事件总线的前世今生
  • Oracles数据库通过存储过程调用飞书接口推送群组消息
  • FPGA:XILINX FPGA产品线以及器件选型建议
  • MySQL 8.0 OCP(1Z0-908)英文题库(31-40)
  • 【认知思维】过度自信效应:高估自我能力的认知偏差
  • 【神经网络与深度学习】局部最小值和全局最小值
  • win10 局域网内聊天
  • Mac M系列 安装 jadx-gui
  • MySQL数据库故障排查指南
  • 【2025最新】Pycharm里如何运行多个py文件
  • linux 抓包工具tcpdump使用小记(使用时注意权限和系统资源)
  • log.js:5 [vxe table v4.12.5] 缺少 “vxe-tooltip“ 组件,请检查是否正确安装。
  • 网络状态可以通过hutool.HttpStatus获取
  • Data.olllo:一个可以打开 100GB CSV 文件的桌面工具
  • 【HBase整合Hive】HBase-1.4.8整合Hive-2.3.3过程
  • 前端取经路——前端安全:构建坚不可摧的Web应用防线
  • 如何在设计阶段考虑 Python 服务的可伸缩性,避免后期的重构
  • element-ui 源码调用接口跨域问题
  • web-ui开源程序是建立在浏览器使用的基础上,旨在使 AI 代理可以访问网站
  • plus-uiRuoYi-Vue-Plus 基于pgSql本地运行实践
  • 19.Excel数据透视表:第2部分数据透视计算
  • HTML、CSS 和 JavaScript 基础知识点
  • 【Bug】多文件上传只有最后一个loading会关闭