• 浅析基本AI五子棋算法


      五子棋是所有棋类博弈中比较简单的了,这里介绍的也只是一种非常基本的AI策略。其实,包括之前的AI贪吃蛇,感觉这两个AI其实体现的都是一种建模思想,把一个现实中的问题模型化,抽象化,得到其一般特征,再设计数据结构及算法。

      首先,要意识到一件事情,我们可以用一个三维数组记录所有的获胜局势,比如

      

      再如:

      

      这种获胜局势是有限可数的,所以,AI的关键一步就是得到这个三维数组:

     1 //统计所有可能的赢法,需要好好理解
     2 for (var i = 0; i < 15; i++){
     3     for (var j = 0; j < 11; j++){
     4         for (var k = 0; k < 5; k++){
     5             wins[i][j+k][count] = true;
     6         }
     7         count++;
     8     }
     9 }
    10 for (var i = 0; i < 11; i++){
    11     for (var j = 0; j < 15; j++){
    12         for (var k = 0; k < 5; k++){
    13             wins[i+k][j][count] = true;
    14         }
    15         count++;
    16     }
    17 }
    18 for (var i = 0; i < 11; i++){
    19     for (var j = 0; j < 11; j++){
    20         for (var k = 0; k < 5; k++){
    21             wins[i+k][j+k][count] = true;
    22         }
    23         count++;
    24     }
    25 }
    26 for (var i = 0; i < 11; i++){
    27     for (var j = 14; j > 3; j--){
    28         for (var k = 0; k < 5; k++){
    29             wins[i+k][j-k][count] = true;
    30         }
    31         count++;
    32     }
    33 }
    34 //共 572 赢法

      现在,关键是如何利用这个三维数组,其实很多机器博弈其实就是在打分,再把棋子下到分高(或分低)的地方,比如以下红色位置,如果没有棋子,应该 给一个较高分,因为在下一个白棋子就赢了,但是如果下了一个黑棋子,那么,上面的第一种赢法无论如何也不可能了,所以直接设置为零分。所以在设置两个一位数组,记录每种赢法的得分,再查找棋盘上哪些位置可以实现这种赢法,给这些位置加分,最后从所有位置中,找出分最高的落子即可。而且,一种赢法上的落子越多,就越接近获胜,所以分数应该越高。

     1     for (var i = 0; i < 15; i++){
     2         for (var j = 0; j < 15; j++){
     3             if (0 == chessBoard[i][j]){//no chessman
     4                 for (var k = 0; k <count; k++){
     5                     if (wins[i][j][k]){
     6                         if (1 == myWin[k]){
     7                             myScore[i][j] += 200;
     8                         } else if (2 == myWin[k]){
     9                             myScore[i][j] += 400;
    10                         } else if (3 == myWin[k]){
    11                             myScore[i][j] += 2000;
    12                         } else if (4 == myWin[k]){
    13                             myScore[i][j] += 10000;
    14                         }
    15                         if (1 == computerWin[k]){
    16                             computerScore[i][j] += 320;
    17                         } else if (2 == computerWin[k]){
    18                             computerScore[i][j] += 420;
    19                         } else if (3 == computerWin[k]){
    20                             computerScore[i][j] += 4200;
    21                         } else if (4 == computerWin[k]){
    22                             computerScore[i][j] += 20000;
    23                         }
    24                     }
    25                 }
    26                 if (myScore[i][j] > max){
    27                     max = myScore[i][j];
    28                     u = i;
    29                     v = j;
    30                 } else if (myScore[i][j] == max){
    31                     if (computerScore[i][j] > computerScore[u][v]){
    32                         u = i;
    33                         v = j;
    34                     }
    35                 }
    36                 if (computerScore [i][j] > max){
    37                     max = computerScore[i][j];
    38                     u = i;
    39                     v = j;
    40                 } else if (computerScore[i][j] == max){
    41                     if (myScore[i][j] > myScore[u][v]){
    42                         u = i;
    43                         v = j;
    44                     }
    45                 }
    46             }
    47         }

      最后,只需要统计每落子一次是否有一方赢了即可,这里谈及了AI核心思想,其他部分比如判断胜负,交替落子等逻辑可以找到很多学习资料。

      总结,AI看似高大上,但是其实际是对实际问题的高度抽象、模型化以及大量计算(正是计算机的优势)。如果能缜密地设计好编码思路,那么效率就会很高,比如昨天写的贪吃蛇,很多情况没想到,所以总是陷入困境,当代码量增加,逻辑结构变的复杂时,一定要事先规划,或者说,设计模式。自己要突破目前的瓶颈期可能要学习一下这方面的东西了!!!

      此外,还利用Hbuilder生成了APP,首先是自己这么想了,然后还真找到办法实现了,所以创意,眼界,技术,同样重要。

      

      

          完整代码点这里

      小记。

  • 相关阅读:
    2020-3-23学习地图
    HashMap<K,V>类
    2020-3-21学习地图
    模板模式
    2020-3-20学习地图
    字符串常量池String Constant Pool
    2020-3-19学习地图
    2020-3-18学习地图
    MySQL游标
    2020-3-16学习地图
  • 原文地址:https://www.cnblogs.com/zhaoyu1995/p/5639101.html
Copyright © 2020-2023  润新知