【C语言】三子棋实现AI智能落子(简单语法)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
一、实现逻辑
基本逻辑:判断同行、同列、正副对角线是否有两棋相同,且可能三连的位置为空
其余情况均为此思考模式,注意讨论对角线时需区分正副对角线
二、实现代码
1.一手占中,若中心被占则占角
2.有三连机会,尝试三连
3.玩家有三连机会,进行拦截
4.无三连机会,且无需拦截,则靠近己方棋子落子,创造三连机会
总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、实现逻辑
- 落子优先级(叙述为电脑视角)
- 一手占中,若中心被占则占角(默认为电脑后手)
- 有三连机会,尝试三连
- 玩家有三连机会,进行拦截
- 靠近己方棋子落子
- 实现方法均为基础的循环和判断语句,并且适用于不同规格的棋盘
基本逻辑:判断同行、同列、正副对角线是否有两棋相同,且可能三连的位置为空
以同列且两棋不相邻为例(为确保一般性,这里使用4x4棋盘)。- 棋盘中实心红点为判断起始点(if语句的参考点)的所有可能位置,右侧为三连机会示例,中心为可能存在的制胜棋位置
其余情况均为此思考模式,注意讨论对角线时需区分正副对角线
二、实现代码
1.一手占中,若中心被占则占角
代码如下:
//电脑第一步
void FirstMove(char board[ROW][COL], int row, int col)
{int ar1[2] = { 0, row - 1 };int ar2[2] = { 0, col - 1 };int x = ar1[rand() % (row - 1)], y = ar2[rand() % (col - 1)];//判断中心点是否被占,玩家先中则不走边if (board[row / 2][col / 2] == '*'){while (1){if (board[x][y] == ' '){board[x][y] = '#';break;}}}//反则占中心elseboard[row / 2][col / 2] = '#';
}
2.有三连机会,尝试三连
代码如下:
//电脑三连机会,三连成功返回0,反之返回1
int ComputerWin(char board[ROW][COL], int row, int col)
{//1.同一行int i = 0, j = 0;//1.1一行相同两枚棋子相邻,判断参考点起点[0][0],终点[row-1][col-2]for (i = 0; i < row; i++){for (j = 0; j < col - 1; j++){if (board[i][j] == board[i][j + 1] && board[i][j] == '#'){if (j < col - 2 && board[i][j + 2] == ' '){board[i][j + 2] = '#';return 0;}elseif (board[i][j - 1] == ' '){board[i][j - 1] = '#';return 0;}}}}//1.2一行相同两枚棋子不相邻,判断参考点起点[0][0],终点[row-1][col-3]for (i = 0; i < row; i++){for (j = 0; j < col - 2; j++){if (board[i][j] == board[i][j + 2] && board[i][j] == '#' ){if (board[i][j + 1] == ' '){board[i][j + 1] = '#';return 0;}}}}//2.同一列//2.1一列相同两枚棋子相邻,判断参考点起点[0][0],终点[col - 2][row - 1]for (i = 0; i < row - 1; i++){for (j = 0; j < col; j++){if (board[i][j] == board[i + 1][j] && board[i][j] == '#'){if (i < col - 2 && board[i + 2][j] == ' '){board[i + 2][j] = '#';return 0;}elseif (board[i - 1][j] == ' '){board[i - 1][j] = '#';return 0;}}}}//2.2一列相同两枚棋子不相邻,判断参考点起点[0][0],终点[col - 3][row - 1]for (i = 0; i < row - 2; i++){for (j = 0; j < col; j++){if (board[i][j] == board[i + 2][j] && board[i][j] == '#' && board[i + 1][j] == ' '){board[i + 1][j] = '#';return 0;}}}//3.拦截对角线//3.1正对角线for (i = 0; i < row - 2; i++){for (j = 0; j < col - 2; j++){if (board[i][j] == board[i + 1][j + 1] && board[i][j] == '#'){if (board[i + 2][j + 2] == ' '){board[i + 2][j + 2] = '#';return 0;}}if (board[i][j] == board[i + 2][j + 2] && board[i][j] == '#'){if (board[i + 1][j + 1] == ' '){board[i + 1][j + 1] = '#';return 0;}}}}for (i = 1; i < row - 1; i++){for (j = 1; j < col - 1; j++){if (board[i][j] == board[i + 1][j + 1] && board[i][j] == '#'){if (board[i - 1][j - 1] == ' '){board[i - 1][j - 1] = '#';return 0;}}}}//3.2副对角线for (i = 2; i < row; i++){for (j = 0; j < col - 1; j++){if (board[i][j] == board[i - 1][j + 1] && board[i][j] == '#'){if (board[i - 2][j + 2] == ' '){board[i - 2][j + 2] = '#';return 0;}}if (board[i][j] == board[i - 2][j + 2] && board[i][j] == '#'){if (board[i - 1][j + 1] == ' '){board[i - 1][j + 1] = '#';return 0;}}}}for (i = 1; i < row - 1; i++){for (j = 1; j < col - 1; j++){if (board[i][j] == board[i - 1][j + 1] && board[i][j] == '#'){if (board[i + 1][j - 1] == ' '){board[i + 1][j - 1] = '#';return 0;}}}}return 1;
}
3.玩家有三连机会,进行拦截
首先判断玩家是否存在三连机会,代码如下:
//判断是否需要拦截,需要即返回1,反之返回0
int IsDanger(char board[ROW][COL], int row, int col)
{int i = 0, j = 0;//1.同一行三连//1.1一行相同两枚棋子相邻,判断参考点起点[0][0],终点[row-1][col-2]for (i = 0; i < row; i++){for (j = 0; j < col - 1; j++){if (board[i][j] == board[i][j + 1] && board[i][j] == '*'){if (j < col - 2 && board[i][j + 2] == ' '){return 1;}elseif (board[i][j - 1] == ' '){return 1;}}}}//1.2一行相同两枚棋子不相邻,判断参考点起点[0][0],终点[row-1][col-3]for (i = 0; i < row; i++){for (j = 0; j < col - 2; j++){if (board[i][j] == board[i][j + 2] && board[i][j] == '*' && board[i][j + 1] == ' '){return 1;}}}//2.同一列三连//2.1一列相同两枚棋子相邻,判断参考点起点[0][0],终点[col - 2][row - 1]for (i = 0; i < row - 1; i++){for (j = 0; j < col; j++){if (board[i][j] == board[i + 1][j] && board[i][j] == '*'){if (i < col - 2 && board[i + 2][j] == ' '){return 1;}elseif (board[i - 1][j] == ' '){return 1;}}}}//2.2一列相同两枚棋子不相邻,判断参考点起点[0][0],终点[col - 3][row - 1]for (i = 0; i < row - 2; i++){for (j = 0; j < col; j++){if (board[i][j] == board[i + 2][j] && board[i][j] == '*' && board[i + 1][j] == ' '){return 1;}}}//3.对角线//3.1正对角线for (i = 0; i < row - 2; i++){for (j = 0; j < col - 2; j++){if (board[i][j] == board[i + 1][j + 1] && board[i][j] == '*'){if (board[i + 2][j + 2] == ' '){return 1;}}if (board[i][j] == board[i + 2][j + 2] && board[i][j] == '*'){if (board[i + 1][j + 1] == ' '){return 1;}}}}for (i = 1; i < row - 1; i++){for (j = 1; j < col - 1; j++){if (board[i][j] == board[i + 1][j + 1] && board[i][j] == '*'){if (board[i - 1][j - 1] == ' '){return 1;}}}}//3.2副对角线for (i = 2; i < row; i++){for (j = 0; j < col - 1; j++){if (board[i][j] == board[i - 1][j + 1] && board[i][j] == '*'){if (board[i - 2][j + 2] == ' '){return 1;}}if (board[i][j] == board[i - 2][j + 2] && board[i][j] == '*'){if (board[i - 1][j + 1] == ' '){return 1;}}}}for (i = 1; i < row - 1; i++){for (j = 1; j < col - 1; j++){if (board[i][j] == board[i - 1][j + 1] && board[i][j] == '*'){if (board[i + 1][j - 1] == ' '){return 1;}}}}return 0;
}
然后进行拦截,代码如下:
//拦截玩家函数
int BlockPlayer(char board[ROW][COL], int row, int col)
{//1.同一行int i = 0, j = 0;//1.1一行相同两枚棋子相邻,判断参考点起点[0][0],终点[row-1][col-2]for (i = 0; i < row; i++){for (j = 0; j < col-1; j++){if (board[i][j] == board[i][j + 1] && board[i][j] == '*'){if (j < col - 2 && board[i][j + 2] == ' '){board[i][j + 2] = '#';return 0;}elseif (board[i][j - 1] == ' '){board[i][j - 1] = '#';return 0;}}}}//1.2一行相同两枚棋子不相邻,判断参考点起点[0][0],终点[row-1][col-3]for (i = 0; i < row; i++){for (j = 0; j < col - 2; j++){if (board[i][j] == board[i][j + 2] && board[i][j] == '*' && board[i][j + 1] == ' '){board[i][j + 1] = '#';return 0;}}}//2.同一列//2.1一列相同两枚棋子相邻,判断参考点起点[0][0],终点[col - 2][row - 1]for (i = 0; i < row - 1; i++){for (j = 0; j < col; j++){if (board[i][j] == board[i + 1][j] && board[i][j] == '*'){if (i < col - 2 && board[i + 2][j] == ' '){board[i + 2][j] = '#';return 0;}elseif (board[i - 1][j] == ' '){board[i - 1][j] = '#';return 0;}}}}//2.2一列相同两枚棋子不相邻,判断参考点起点[0][0],终点[col - 3][row - 1]for (i = 0; i < row - 2; i++){for (j = 0; j < col; j++){if (board[i][j] == board[i + 2][j] && board[i][j] == '*' && board[i + 1][j] == ' '){board[i + 1][j] = '#';return 0;}}}//3.对角线//3.1正对角线for (i = 0; i < row - 2; i++){for (j = 0; j < col - 2; j++){if (board[i][j] == board[i + 1][j + 1] && board[i][j] == '*'){if (board[i + 2][j + 2] == ' '){board[i + 2][j + 2] = '#';return 0;}}if (board[i][j] == board[i + 2][j + 2] && board[i][j] == '*'){if (board[i + 1][j + 1] == ' '){board[i + 1][j + 1] = '#';return 0;}}}}for (i = 1; i < row - 1; i++){for (j = 1; j < col - 1; j++){if (board[i][j] == board[i + 1][j + 1] && board[i][j] == '*'){if (board[i - 1][j - 1] == ' '){board[i - 1][j - 1] = '#';return 0;}}}}//3.2副对角线for (i = 2; i < row; i++){for (j = 0; j < col - 1; j++){if (board[i][j] == board[i - 1][j + 1] && board[i][j] == '*'){if (board[i - 2][j + 2] == ' '){board[i - 2][j + 2] = '#';return 0;}}if (board[i][j] == board[i - 2][j + 2] && board[i][j] == '*'){if (board[i - 1][j + 1] == ' '){board[i - 1][j + 1] = '#';return 0;}}}}for (i = 1; i < row - 1; i++){for (j = 1; j < col - 1; j++){if (board[i][j] == board[i - 1][j + 1] && board[i][j] == '*'){if (board[i + 1][j - 1] == ' '){board[i + 1][j - 1] = '#';return 0;}}}}return 1;
}
4.无三连机会,且无需拦截,则靠近己方棋子落子,创造三连机会
代码如下:
//无三连机会,无需拦截,自行制造机会
int CreatWin(char board[ROW][COL], int row, int col)
{int i = 0, j = 0;int a = 0, b = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == '#'){for (a = 0; a < row; a++){for (b = 0; b < col; b++){if ((a - i == -1 && b - j == -1)|| (a - i == -1 && b - j == 0)|| (a - i == -1 && b - j == 1)|| (a - i == 0 && b - j == -1)|| (a - i == 0 && b - j == 1)|| (a - i == 1 && b - j == -1)|| (a - i == 1 && b - j == 0)|| (a - i == 1 && b - j == 1)){if (board[a][b] == ' '){board[a][b] = '#';return 0;}}}}}}}}
总结
1-3步均使用一套判断模式,第4步可应用在扫雷中的排查雷的步骤中。
【C语言】三子棋实现AI智能落子(简单语法)相关推荐
- 程序员成长之旅——C语言三子棋
程序员成长之旅--C语言三子棋 简易介绍三子棋 三子棋编程过程 三子棋代码总览 game.h game.c test.c 简易介绍三子棋 进行了这么多天的c语言学习,今天给大家讲一下三子棋是如何用c语 ...
- C语言-三子棋游戏的实现
C语言-三子棋游戏的实现 目录 C语言-三子棋游戏的实现 游戏背景介绍 游戏实现思路 test模块 menu模块 **game模块** init_board(初始化棋盘) print_board(打印 ...
- C语言三子棋,五子棋,n子棋的代码实现
C语言三子棋,五子棋,n子棋的代码实现 这里以五子棋为例,来说明开发过程 开发思路 菜单打印 棋盘的打印 棋子的打印 电脑下棋(随机数) 判断输赢 代码整合 注意事项 这里以五子棋为例,来说明开发过程 ...
- C语言三子棋(九宫棋)游戏
分析需求 制作菜单进入或退出游戏 实现棋盘和落子的显示 玩家落子 判断是否获胜 判断是否和棋 代码实现 1.制作菜单进入或退出游戏 void menu() {printf("1.开始游戏\n ...
- C语言—三子棋小游戏解析
一.问题描述 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋.田字棋.对角棋等.将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了.但是, ...
- C语言三子棋游戏进阶版详解(包括多子棋)
目录 一,总体思路介绍 二,具体思路的实现 1.初始化游戏界面 2.初始化棋盘 3.打印棋盘 4.玩家移动 5.电脑移动 6.判断输赢 三,源码展示 game.h game.c test.c 一,总体 ...
- c语言 三子棋详细解析 (零基础也能看懂)附源码 c语言小游戏
代码运行结果如下 代码实现 test.c(测试游戏的逻辑) game.h(关于游戏相关的函数声明符号声明)头文件包含的 game.c游戏相关函数的实现 test.c 游戏如何玩 希望游戏玩完一把还可以 ...
- C语言三子棋游戏的编程实现
程序界面实现如图所示的人与电脑互动的三子棋游戏 文件模块 test.c 测试三子棋游戏 game.h 游戏的函数声明(头文件) game.c 游戏函数的实现 代码模块 初始化棋盘 (每个位置初始为空格 ...
- 【19】C语言 | 三子棋
目录 1.三子棋设置三个文件中 2.数组传参的两种方法 3.三子棋代码 [game.h文件的代码] [game.c的代码] [ test.c的代码] 1.三子棋设置三个文件中 test.c 测试游戏的 ...
最新文章
- 异常检测概念、异常检测的思路、孤立森林Isolation Forest、​​​​​​​局部异常因子LOF、OneClassSVM、EllipticEnvelop
- 2.5 亿!华为成立新公司!
- MOSS2007最终用户培训资料
- JdbcTemplate详解 - 2
- FindBugs和JSR-305
- excel重复上一步快捷键_工作再忙也要学会的十个Excel快捷键
- Apache JMeter (二)性能测试 入门实例
- C#基础 面试中常出现的问题
- 数据治理之数据质量管控流程(参考)
- 【二】[详细]针孔相机模型、相机镜头畸变模型、相机标定与OpenCV实现
- gpio rk3399 控制_RK3326 RK3399 GPIO寄存器操作笔记
- Android Studio中使用android:src=quot;@drawable/ic_launcherquot;报错
- Win XP iis组件补丁(ghost xp)iis5.1
- manjaro 亮度调节
- 个人理财--知识点总结
- 软件工程毕业设计选题java_2021年计算机专业Java相关毕业设计如何选题更容易通过...
- 博雅数智|3.23直播笔记
- The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be reso site:blog.csdn.net
- 伴随状语的动作与主句的动作间的关系
- ajax微信浏览器,jquery1.8版本使用ajax实现微信调用出现的问题分析及解决办法
热门文章
- 可变类型与不可变类型的作用和意义
- 克服“测试怠惰”的习惯
- 水星UD6S网卡Linux驱动,水星UD6S驱动|水星UD6S无线网卡驱动下载 v1.0 官方版 - 比克尔下载...
- 003--北大考研计算机--考研经验贴
- 计算机培训动员会演讲稿,计算机协会社长就职演讲稿与计算机培训心得体会合集.doc...
- ORACLE 数据、表误删恢复(转)
- python内置函数getattr()和setattr()
- matlab牛顿解方程,牛顿迭代法解非线性方程matlab实现
- 关于基于Linux的电子词典的编写
- c3p0-config.xml配置文件的那些事