提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、实现逻辑

基本逻辑:判断同行、同列、正副对角线是否有两棋相同,且可能三连的位置为空

其余情况均为此思考模式,注意讨论对角线时需区分正副对角线

二、实现代码

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智能落子(简单语法)相关推荐

  1. 程序员成长之旅——C语言三子棋

    程序员成长之旅--C语言三子棋 简易介绍三子棋 三子棋编程过程 三子棋代码总览 game.h game.c test.c 简易介绍三子棋 进行了这么多天的c语言学习,今天给大家讲一下三子棋是如何用c语 ...

  2. C语言-三子棋游戏的实现

    C语言-三子棋游戏的实现 目录 C语言-三子棋游戏的实现 游戏背景介绍 游戏实现思路 test模块 menu模块 **game模块** init_board(初始化棋盘) print_board(打印 ...

  3. C语言三子棋,五子棋,n子棋的代码实现

    C语言三子棋,五子棋,n子棋的代码实现 这里以五子棋为例,来说明开发过程 开发思路 菜单打印 棋盘的打印 棋子的打印 电脑下棋(随机数) 判断输赢 代码整合 注意事项 这里以五子棋为例,来说明开发过程 ...

  4. C语言三子棋(九宫棋)游戏

    分析需求 制作菜单进入或退出游戏 实现棋盘和落子的显示 玩家落子 判断是否获胜 判断是否和棋 代码实现 1.制作菜单进入或退出游戏 void menu() {printf("1.开始游戏\n ...

  5. C语言—三子棋小游戏解析

    一.问题描述 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋.田字棋.对角棋等.将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了.但是, ...

  6. C语言三子棋游戏进阶版详解(包括多子棋)

    目录 一,总体思路介绍 二,具体思路的实现 1.初始化游戏界面 2.初始化棋盘 3.打印棋盘 4.玩家移动 5.电脑移动 6.判断输赢 三,源码展示 game.h game.c test.c 一,总体 ...

  7. c语言 三子棋详细解析 (零基础也能看懂)附源码 c语言小游戏

    代码运行结果如下 代码实现 test.c(测试游戏的逻辑) game.h(关于游戏相关的函数声明符号声明)头文件包含的 game.c游戏相关函数的实现 test.c 游戏如何玩 希望游戏玩完一把还可以 ...

  8. C语言三子棋游戏的编程实现

    程序界面实现如图所示的人与电脑互动的三子棋游戏 文件模块 test.c 测试三子棋游戏 game.h 游戏的函数声明(头文件) game.c 游戏函数的实现 代码模块 初始化棋盘 (每个位置初始为空格 ...

  9. 【19】C语言 | 三子棋

    目录 1.三子棋设置三个文件中 2.数组传参的两种方法 3.三子棋代码 [game.h文件的代码] [game.c的代码] [ test.c的代码] 1.三子棋设置三个文件中 test.c 测试游戏的 ...

最新文章

  1. 异常检测概念、异常检测的思路、孤立森林Isolation Forest、​​​​​​​局部异常因子LOF、OneClassSVM、EllipticEnvelop
  2. 2.5 亿!华为成立新公司!
  3. MOSS2007最终用户培训资料
  4. JdbcTemplate详解 - 2
  5. FindBugs和JSR-305
  6. excel重复上一步快捷键_工作再忙也要学会的十个Excel快捷键
  7. Apache JMeter (二)性能测试 入门实例
  8. C#基础 面试中常出现的问题
  9. 数据治理之数据质量管控流程(参考)
  10. 【二】[详细]针孔相机模型、相机镜头畸变模型、相机标定与OpenCV实现
  11. gpio rk3399 控制_RK3326 RK3399 GPIO寄存器操作笔记
  12. Android Studio中使用android:src=quot;@drawable/ic_launcherquot;报错
  13. Win XP iis组件补丁(ghost xp)iis5.1
  14. manjaro 亮度调节
  15. 个人理财--知识点总结
  16. 软件工程毕业设计选题java_2021年计算机专业Java相关毕业设计如何选题更容易通过...
  17. 博雅数智|3.23直播笔记
  18. The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be reso site:blog.csdn.net
  19. 伴随状语的动作与主句的动作间的关系
  20. ajax微信浏览器,jquery1.8版本使用ajax实现微信调用出现的问题分析及解决办法

热门文章

  1. 可变类型与不可变类型的作用和意义
  2. 克服“测试怠惰”的习惯
  3. 水星UD6S网卡Linux驱动,水星UD6S驱动|水星UD6S无线网卡驱动下载 v1.0 官方版 - 比克尔下载...
  4. 003--北大考研计算机--考研经验贴
  5. 计算机培训动员会演讲稿,计算机协会社长就职演讲稿与计算机培训心得体会合集.doc...
  6. ORACLE 数据、表误删恢复(转)
  7. python内置函数getattr()和setattr()
  8. matlab牛顿解方程,牛顿迭代法解非线性方程matlab实现
  9. 关于基于Linux的电子词典的编写
  10. c3p0-config.xml配置文件的那些事