C语言如何开发实现井字棋
发表于:2024-10-01 作者:千家信息网编辑
千家信息网最后更新 2024年10月01日,这篇文章主要为大家展示了"C语言如何开发实现井字棋",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C语言如何开发实现井字棋"这篇文章吧。总体思路井字棋棋盘我
千家信息网最后更新 2024年10月01日C语言如何开发实现井字棋
这篇文章主要为大家展示了"C语言如何开发实现井字棋",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C语言如何开发实现井字棋"这篇文章吧。
总体思路
井字棋棋盘我们总体可以当成一个二维数组来操作,我们分别需要实现初始化二维数组,打印棋盘,玩家下棋,电脑下棋,判断输赢等代码
项目的创建
我们创建了头文件用于放函数的声明,game.c文件放置函数的实现,test.c文件用于测试。
测试结果
电脑获胜:
玩家获胜:
平局:
各函数代码的实现
我们在game.c文件中实现函数功能的代码
初始化二维数组
void InitBoard(char Board[ROW][COL], int row, int col){ for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { Board[i][j] = ' '; } }}
打印棋盘
void DisplayBoard(char Board[ROW][COL], int row, int col){ for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf(" %c ", Board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (int j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } } printf("\n"); }}
这里的棋盘我们只打印了井字的形状,如果为了美观,还可以进行封边,这里就留给朋友们自行实现啦。
玩家下棋
void PlayMove(char Board[ROW][COL], int row, int col){ while (1) { int x = 0, y = 0; printf("请输入坐标:\n"); 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,1)位置是空时,电脑先下这一步。
其他情况均随意落子。
void ComputerMove(char Board[ROW][COL], int row, int col){ int x = 0, y = 0; while (1) { if (JudgeComputer(Board, ROW, COL)) { for (int i = 0; i < row; i++) { if (Board[i][0] == Board[i][1] && Board[i][0] == '*' && Board[i][2] == ' ') { Board[i][2] = '*'; return; } else if (Board[i][0] == Board[i][2] && Board[i][0] == '*' && Board[i][1] == ' ') { Board[i][1] = '*'; return; } else if (Board[i][1] == Board[i][2] && Board[i][1] == '*' && Board[i][0] == ' ') { Board[i][0] = '*'; return; } } for (int j = 0; j < col; j++) { if (Board[0][j] == Board[1][j] && Board[0][j] == '*' && Board[2][j] == ' ') { Board[2][j] = '*'; return; } else if (Board[0][j] == Board[2][j] && Board[0][j] == '*' && Board[1][j] == ' ') { Board[1][j] = '*'; return; } else if (Board[1][j] == Board[2][j] && Board[1][j] == '*' && Board[0][j] == ' ') { Board[0][j] = '*'; return; } } if (Board[0][0] == Board[1][1] && Board[0][0] == '*' && Board[2][2] == ' ') { Board[2][2] = '*'; return; } else if (Board[0][0] == Board[2][2] && Board[0][0] == '*' && Board[1][1] == ' ') { Board[1][1] = '*'; return; } else if (Board[1][1] == Board[2][2] && Board[1][1] == '*' && Board[0][0] == ' ') { Board[0][0] = '*'; return; } else if (Board[0][2] == Board[1][1] && Board[0][2] == '*' && Board[2][0] == ' ') { Board[2][0] = '*'; return; } else if (Board[0][2] == Board[2][0] && Board[0][2] == '*' && Board[1][1] == ' ') { Board[1][1] = '*'; return; } else if (Board[2][0] == Board[1][1] && Board[2][0] == '*' && Board[0][2] == ' ') { Board[0][2] = '*'; return; } } else if (JudgePlayer(Board, ROW, COL)) { for (int i = 0; i < row; i++) { if (Board[i][0] == Board[i][1] && Board[i][0] == '#' && Board[i][2] == ' ') { Board[i][2] = '*'; return; } else if (Board[i][0] == Board[i][2] && Board[i][0] == '#' && Board[i][1] == ' ') { Board[i][1] = '*'; return; } else if (Board[i][1] == Board[i][2] && Board[i][1] == '#' && Board[i][0] == ' ') { Board[i][0] = '*'; return; } } for (int j = 0; j < col; j++) { if (Board[0][j] == Board[1][j] && Board[0][j] == '#' && Board[2][j] == ' ') { Board[2][j] = '*'; return; } else if (Board[0][j] == Board[2][j] && Board[0][j] == '#' && Board[1][j] == ' ') { Board[1][j] = '*'; return; } else if (Board[1][j] == Board[2][j] && Board[1][j] == '#' && Board[0][j] == ' ') { Board[0][j] = '*'; return; } } if (Board[0][0] == Board[1][1] && Board[0][0] == '#' && Board[2][2] == ' ') { Board[2][2] = '*'; return; } else if (Board[0][0] == Board[2][2] && Board[0][0] == '#' && Board[1][1] == ' ') { Board[1][1] = '*'; return; } else if (Board[1][1] == Board[2][2] && Board[1][1] == '#' && Board[0][0] == ' ') { Board[0][0] = '*'; return; } else if (Board[0][2] == Board[1][1] && Board[0][2] == '#' && Board[2][0] == ' ') { Board[2][0] = '*'; return; } else if (Board[0][2] == Board[2][0] && Board[0][2] == '#' && Board[1][1] == ' ') { Board[1][1] = '*'; return; } else if (Board[2][0] == Board[1][1] && Board[2][0] == '#' && Board[0][2] == ' ') { Board[0][2] = '*'; return; } } else { if (Board[1][1] == ' ') { Board[1][1] = '*'; return; } else { x = rand() % row; y = rand() % col; if (Board[x][y] == ' ') { Board[x][y] = '*'; break; } } } }}
判断电脑是否有位置可以获胜
static int JudgeComputer(char Board[ROW][COL], int row, int col){ for (int i = 0; i < row; i++) { if (Board[i][0] == Board[i][1] && Board[i][0] == '*' && Board[i][2] == ' ') return 1; else if (Board[i][0] == Board[i][2] && Board[i][0] == '*' && Board[i][1] == ' ') return 1; else if (Board[i][1] == Board[i][2] && Board[i][1] == '*' && Board[i][0] == ' ') return 1; } for (int j = 0; j < col; j++) { if (Board[0][j] == Board[1][j] && Board[0][j] == '*' && Board[2][j] == ' ') return 1; else if (Board[0][j] == Board[2][j] && Board[0][j] == '*' && Board[1][j] == ' ') return 1; else if (Board[1][j] == Board[2][j] && Board[1][j] == '*' && Board[0][j] == ' ') return 1; } if (Board[0][0] == Board[1][1] && Board[0][0] == '*' && Board[2][2] == ' ') return 1; else if (Board[0][0] == Board[2][2] && Board[0][0] == '*' && Board[1][1] == ' ') return 1; else if (Board[1][1] == Board[2][2] && Board[1][1] == '*' && Board[0][0] == ' ') return 1; else if (Board[0][2] == Board[1][1] && Board[0][2] == '*' && Board[2][0] == ' ') return 1; else if (Board[0][2] == Board[2][0] && Board[0][2] == '*' && Board[1][1] == ' ') return 1; else if (Board[2][0] == Board[1][1] && Board[2][0] == '*' && Board[0][2] == ' ') return 1; else return 0;}
判断玩家是否有位置获胜
static int JudgePlayer(char Board[ROW][COL], int row, int col){ for (int i = 0; i < row; i++) { if (Board[i][0] == Board[i][1] && Board[i][0] == '#' && Board[i][2] == ' ') return 1; else if (Board[i][0] == Board[i][2] && Board[i][0] == '#' && Board[i][1] == ' ') return 1; else if (Board[i][1] == Board[i][2] && Board[i][1] == '#' && Board[i][0] == ' ') return 1; } for (int j = 0; j < col; j++) { if (Board[0][j] == Board[1][j] && Board[0][j] == '#' && Board[2][j] == ' ') return 1; else if (Board[0][j] == Board[2][j] && Board[0][j] == '#' && Board[1][j] == ' ') return 1; else if (Board[1][j] == Board[2][j] && Board[1][j] == '#' && Board[0][j] == ' ') return 1; } if (Board[0][0] == Board[1][1] && Board[0][0] == '#' && Board[2][2] == ' ') return 1; else if (Board[0][0] == Board[2][2] && Board[0][0] == '#' && Board[1][1] == ' ') return 1; else if (Board[1][1] == Board[2][2] && Board[1][1] == '#' && Board[0][0] == ' ') return 1; else if (Board[0][2] == Board[1][1] && Board[0][2] == '#' && Board[2][0] == ' ') return 1; else if (Board[0][2] == Board[2][0] && Board[0][2] == '#' && Board[1][1] == ' ') return 1; else if (Board[2][0] == Board[1][1] && Board[2][0] == '#' && Board[0][2] == ' ') return 1; else return 0;}
判断输赢
char IsWin(char Board[ROW][COL], int row, int col)for (int i = 0; i < row; i++) { if (Board[i][0] == Board[i][1] && Board[i][2] == Board[i][1] && Board[i][1] != ' ') { return Board[i][0]; } } for (int j = 0; j < col; j++) { if (Board[0][j] == Board[1][j] && Board[1][j] == Board[2][j] && Board[j][1] != ' ') { return Board[0][j]; } } if (Board[0][0] == Board[1][1] && Board[2][2] == Board[1][1] && Board[2][2] != ' ') return Board[0][0]; if (Board[0][2] == Board[1][1] && Board[2][0] == Board[1][1] && Board[1][1] != ' ') return Board[1][1]; if (IsFull(Board, ROW, COL)) { return 'o'; } return 'C';}
判断和棋
static int IsFull(char Board[ROW][COL], int row, int col){ for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (Board[i][j] == ' ') return 0; } } return 1;}
声明代码
我们在game.h头文件中进行函数的声明。
void meun();#define ROW 3#define COL 3//游戏主函数void game();//初始化二维数组void InitBoard(char Board[ROW][COL], int row, int col);//打印棋盘void DisplayBoard(char Board[ROW][COL], int row, int col);//玩家下棋void PlayMove(char Board[ROW][COL], int row, int col);//电脑下棋void ComputerMove(char Board[ROW][COL], int row, int col);//判断赢否char IsWin(char Board[ROW][COL], int row, int col);//判断棋盘满了吗//int IsFull(char Board[ROW][COL], int row, int col);//判断电脑下一部是否可以直接赢//int JudgeComputer(char Board[ROW][COL], int row, int col);//判断玩家下一步是否会赢//int JudgePlayer(char Board[ROW][COL], int row, int col);
测试代码
我们在test.c文件中测试该游戏。
#include "game.h"void game(){ char ret = 0; char Board[ROW][COL] = { 0 }; //初始化数组 InitBoard(Board, ROW, COL); //打印棋盘 printf("棋盘如下:\n"); DisplayBoard(Board, ROW, COL); while (1) { //玩家下棋 printf("玩家落子:\n"); PlayMove(Board, ROW, COL); //每下一步打印一次棋盘 DisplayBoard(Board, ROW, COL); //每下一步判断一次胜负 ret = IsWin(Board, ROW, COL); if (ret != 'C') { break; } //电脑下棋 printf("电脑落子:\n"); 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 if (ret == 'o') printf("卧龙凤雏\n");}void test(){ int input = 0; srand((size_t)time(NULL)); do { meun(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戏结束\n"); break; default: printf("输入错误,请重新输入:\n"); break; } } while (input);}int main(){ test(); return 0;}
以上是"C语言如何开发实现井字棋"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
电脑
玩家
棋盘
j++
函数
文件
输入
井字
代码
数组
位置
二维
测试
语言
开发
内容
篇文章
总体
情况
输赢
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
pc蛋蛋3个服务器
美国最大网络安全公司
数据库mdb精度
能做网络服务器的路由器
库房管理数据库模板
支付宝的数据库怎么打开
脏小豆骗赞数服务器视频合集
数据库服务器硬盘配置
途强在线服务器地址
石家庄服务器配置网关
数据库circle
sql更改数据库表格
达梦数据库集群软件
农行软件开发解决户口吗
朔州网络技术质量
如何提升网络安全度
数据库user_idx表空间
南威软件软件开发氛围
商丘有计算机软件开发学校
数据库发展的经历
建设银行电话客服数据库异常
怎么去网络安全科技馆
浙江专业的网络安全机构包住宿
363_新员工网络安全
Q绑查询16e数据库 网盘
数据库插入数据空指针
东伟服务器
物联网好还是网络安全好
多方协作与维护网络安全合力
怎么用电脑本地连接服务器