亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

基于C++實現五子棋AI算法思想

2020-05-23 13:34:30
字體:
來源:轉載
供稿:網友

         今天我想要分享一下我做五子棋AI的思路。因為在做這個之前,我沒有接觸過任何像這種類似的東西。通過這一次,我也算是有所了解,我的思路也是來自很多網絡上的博客,看了很多,最終總結出了自己的這樣一個。

         那我的五子棋是15*15的大?。ㄒ话阋簿褪沁@樣的一個大?。?。我的AI算法要求每一次落子之后都要去計算每一個空暇的位置的“分值”,簡單的說,我們需要一個存放棋子的數組,表示是否存放了棋子,還要一個計算每一個空格的數組來記錄“分數”,這個分數是后期AI用來運算的基礎,也是你AI難度控制的點。

         我現有的思路就是分兩部分。首先是如果是玩家先落子,那么要求電腦AI隨即在你落子的地方的任意一個方向,隨機落子,這是第一步。接下來以后就正式進入到算法中去。

首先初始化你的分數數組,讓他們全部為零。然后在每一次落子之后進行全盤的遍歷,如果發現該處為空白,于是檢查其四周八個方向(當然如果是邊緣位置就相對修改,判斷是否出了邊界)。若在空白處,且發現在某一對角線方向發現有一個其他顏色的棋子,那么相對的給這個空白區域的分數數組加上一定的分值,然后繼續往這個方向檢測是否還有連續的同一顏色的棋子,若沒有則檢查其他方向或者檢測下一個空白位置。若是還在同一方向上面找到了相同顏色的棋子,那么第二個棋子的出現,你可以給改空白處加上雙倍的分值,表明這個空白位置更加重要。一次類推,繼續檢測。(PS:因為最終AI棋子落在什么地方,依靠的是最后遍歷整個分數數組,然后根據分數的高低來進行判斷落子落在哪里的,在下面講)。

         經過上一遍的遍歷,每一次落子都會使得分數數組得到一些變化,每一次都會導致AI判斷的變化。在這個基礎上,每一次落子還要進行一次對自己本身棋子顏色的一個遍歷,判斷自己的情況,同時加分加在分數數組之中,這樣一來,電腦就會根據自己的棋子的情況以及玩家的落子情況進行判斷,哪一個地方更加適合落子。

         因為我是第一次做AI,網絡上搜到的一些思想一般也是這種類似的遍歷思想。理解了以后寫代碼就比較方便。最后可能會有一些點的分數是相同的,所以還有設置一下隨機落子。把分數相同的地點隨機落子。

         個人感覺AI的強弱是根據你每一次給他增加分數的多少來確定的。這個我的AI有時候也會抽風,不過一般情況比較正常,可能運氣也占了一部分,當初設計加分的時候其實沒想那么多,現在卻發現好像還不錯。

         大家要多去實踐練習,多改改分數可能就會出來不錯的AI了,o(^▽^)o。

下面貼上我的代碼! 

void GameScene::Robot(int *x, int *y, int *Sum) {   ExWhile1 = true;   if (*Sum == 1)   {     while (ExWhile1)     {       ChessOne(*x, *y);       if (ch[*x][*y] == 2){ ExWhile1 = false; }     }     ch[*x][*y] = tp;   //記錄這個點     printpart(*x, *y, tp);     //打印出電腦AI第一次落子     isTouch = true;     tp++;     tp = tp % 2;   }   else      //從第2步開始,使用評分系統   {     Findscore(*x, *y);   } }   void GameScene::Findscore(int &x, int &y)   //查找評分最高的坐標 {   srand((unsigned)time(NULL));   int i, j, x1, x2, y1, y2, lx;   int Max = 0;   ChessScore();      //調用評分函數   for (i = 0; i<15; i++)   {     for (j = 0; j<15; j++)     {       if (Score[i][j]>Max)       {         Max = Score[i][j];  //獲取所有點中,評分最高的         x1 = i;         y1 = j;       }     }   }   x2 = x1; y2 = y1;   for (i = 0; i<15; i++)    //可能的話,有評分相同的多個點   {     for (j = 0; j<15; j++)     {       if (Score[i][j] == Max&&i != x2&&j != y2)   //在這么多個相同分數的點中,隨機找一個       {         lx = rand() % 10;         if (lx<5)         {           x2 = i, y2 = j;           break;         }       }     }   }   if (x2 != x1 || y2 != y1)   //棋盤上有2個最高分   {     lx = rand() % 10;    //隨機一個     if (lx>6)     {       x = x1, y = y1;     }     else     {       x = x2, y = y2;     }   }   else    //棋盤上只有一個最高分   {     x = x1, y = y1;   }   Max = 0;    //清空最大值   ch[x][y] = tp;       //記錄這個點   printpart(x, y, tp);    //打印出電腦AI落子   if (winerValue==2)   {     isTouch = true;   }      tp++;   tp = tp % 2; }   inline void GameScene::ChessOne(int &x, int &y)   //玩家走第1步時的落子 {   int i, j;   srand((unsigned)time(NULL));    //隨機數隨著時間的改變而改變   for (i = 0; i<15; i++)   {     for (j = 0; j<15; j++)     {       if (ch[i][j] == 0)  //如果找到了玩家的棋子,在它的8個方的任意一點落子       {         int lx = rand() % 7;         if (lx == 0)         {           x = i + 1; y = j + 1;           if (ch[x][y] == 2){ break; }         }         else if (lx == 1)         {           x = i + 1; y = j - 1;           if (ch[x][y] == 2){ break; }         }         else if (lx == 2)         {           x = i - 1; y = j - 1;           if (ch[x][y] == 2){ break; }         }         else if (lx == 3)         {           x = i - 1; y = j + 1;           if (ch[x][y] == 2){ break; }         }         else if (lx == 4)         {           x = i - 1; y = j;    //上           if (ch[x][y] == 2){ break; }         }         else if (lx == 5)         {           x = i; y = j - 1;   //左           if (ch[x][y] == 2){ break; }         }         else if (lx == 6)         {           x = i; y = j + 1;   //右           if (ch[x][y] == 2){ break; }         }         else         {           x = i + 1; y = j;    //下           if (ch[x][y] == 2){ break; }         }       }     }   } }  void GameScene::ChessScore() {   int x, y, i, j, k;      //循環變量   int number1 = 0, number2 = 0;   //number用來統計玩家或電腦棋子連成個數   int empty = 0;    //empty用來統計空點個數   memset(Score, 0, sizeof(Score));                    //把評分數組先清零   for (x = 0; x<15; x++)   {     for (y = 0; y<15; y++)     {       if (ch[x][y] == 2)    //如果這個點為空        {         for (i = -1; i <= 1; i++)         {           for (j = -1; j <= 1; j++)   //判斷8個方向            {             if (i != 0 || j != 0)   //若是都為0的話,那不就是原坐標嘛             {               //對玩家落點評分               for (k = 1; i <= 4; k++)   //循環4次               {                        //這點沒越界  且這點存在黑子(玩家)                 if (x + k*i >= 0 && x + k*i <= 14 &&                    y + k*j >= 0 && y + k*j <= 14 &&                    ch[x + k*i][y + k*j] == 0)                 {                    number1++;                 }                 else if (ch[x + k*i][y + k*j] == 2)     //這點是個空點,+1后退出                 {                    empty++;                    break;                  }                    else                    //否則是墻或者對方的棋子了                  {                    break;                  }                   }               for (k = -1; k >= -4; k--)            //向它的相反方向判斷                {                        //這點沒越界  且這點存在黑子(玩家)                 if (x + k*i >= 0 && x + k*i <= 14 &&                   y + k*j >= 0 && y + k*j <= 14 &&                    ch[x + k*i][y + k*j] == 0)                 {                    number1++;                 }                 else if (ch[x + k*i][y + k*j] == 2)     //這點是個空點,+1后退出                 {                    empty++;                    break;                  }                   else                 {                    break;                 }               }               if (number2 == 1)   //2個棋子                {                  Score[x][y] += 1;                }                 else if (number1 == 2)   //3個棋子                {                 if (empty == 1)                     {                   Score[x][y] += 5;   //有一個空點+5分 死3                  }                      else if (empty == 2)                  {                    Score[x][y] += 10;  //有兩個空點+10分 活3                 }                }               else if (number1 == 3)   //4個棋子                {                 if (empty == 1)                    {                    Score[x][y] += 20;  //有一個空點+20分 死4                  }                   else if (empty == 2)                 {                    Score[x][y] += 100;  //有2個空點+100分 活4                 }                 }               else if (number1 >= 4)                 {                  Score[x][y] += 1000;  //對方有5個棋子,分數要高點,先堵               }                  empty = 0;   //統計空點個數的變量清零                 //對電腦落點評分               for (k = 1; i <= 4; k++)   //循環4次               {       //這點沒越界  且這點存在白子(電腦)                 if (x + k*i >= 0 && x + k*i <= 14 &&                    y + k*j >= 0 && y + k*j <= 14 &&                    ch[x + k*i][y + k*j] == 1)                 {                    number2++;                 }                 else if (ch[x + k*i][y + k*j] == 2)                 {                    empty++; break;   //空點                 }                  else                  {                   break;                 }               }               for (k = -1; k >= -4; k--)   //向它的相反方向判斷                {                 if (x + k*i >= 0 && x + k*i <= 14 &&                   y + k*j >= 0 && y + k*j <= 14 &&                    ch[x + k*i][y + k*j] == 1)                 {                    number2++;                 }                 else if (ch[x + k*i][y + k*j] == 2)                 {                    empty++; break;                 }                 else                 {                    break;   //注釋與上面玩家版相同                 }                     }               if (number2 == 0)                  {                  Score[x][y] += 1;    //1個棋子               }                else if (number2 == 1)                 {                 Score[x][y] += 2;    //2個棋子                }                  else if (number2 == 2)   //3個棋子               {                 if (empty == 1)                    {                    Score[x][y] += 8;  //死3                 }                   else if (empty == 2)                  {                    Score[x][y] += 30;  //活3                  }                }               else if (number2 == 3)   //4個棋子               {                 if (empty == 1)                    {                    Score[x][y] += 50;   //死4                 }                   else if (empty == 2)                  {                    Score[x][y] += 200;   //活4                 }                 }               else if (number2 >= 4)                {                  Score[x][y] += 10000;   //自己落在這點能形成5個,也就能勝利了,分數最高               }                 number1 = 0;     //清零,以便下次重新統計               number2 = 0;                                 empty = 0;             }           }         }       }     }   } } 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一乱一性一交一视频| 国产精品久久久久久av下载红粉| 久久国产精品亚洲| 亚洲性生活视频在线观看| 色综合色综合久久综合频道88| 亚洲国产成人在线视频| 欧美午夜片欧美片在线观看| 亚洲午夜激情免费视频| 中文字幕自拍vr一区二区三区| 欧美一区二粉嫩精品国产一线天| 国产精品网址在线| 欧美国产极速在线| 欧美日韩中文字幕在线视频| 久久久女人电视剧免费播放下载| 日韩一区二区福利| 国产丝袜视频一区| 精品亚洲国产成av人片传媒| 亚洲人在线观看| 97视频在线观看免费高清完整版在线观看| 欧美第一黄网免费网站| 欧美日韩人人澡狠狠躁视频| 国产精品视频公开费视频| 国产精品久久久久不卡| 在线国产精品播放| 全亚洲最色的网站在线观看| 日本成人在线视频网址| 欧美大片第1页| 亚洲欧美成人在线| 国产精品视频公开费视频| 欧美网站在线观看| 丝袜亚洲另类欧美重口| 成人久久久久久| 欧美重口另类videos人妖| 8x海外华人永久免费日韩内陆视频| 亚洲免费视频在线观看| 亚洲一区二区三区四区视频| 国产精品欧美日韩| 久久久久久久久久久人体| 91老司机精品视频| 欧美黑人又粗大| 韩国日本不卡在线| 久久久av电影| 国产91精品在线播放| 中文字幕日韩精品有码视频| 亚洲字幕在线观看| 国产精品久久久久久久久久东京| 大胆欧美人体视频| 国产99久久精品一区二区 夜夜躁日日躁| 欧美亚洲国产另类| 日韩精品久久久久久福利| 欧美成人午夜免费视在线看片| 国产一区二区三区精品久久久| 国产在线久久久| 欧美日韩国产精品一区二区三区四区| 亚洲国产精品成人精品| 5566日本婷婷色中文字幕97| 2021国产精品视频| 亚洲国产精品999| y97精品国产97久久久久久| 欧美日韩亚洲成人| 国产精品视频一| 日韩有码在线视频| 日韩电影大片中文字幕| 人体精品一二三区| 正在播放亚洲1区| 91av在线精品| 午夜精品久久久久久久白皮肤| 38少妇精品导航| 日韩一二三在线视频播| 欧美一区二粉嫩精品国产一线天| 亚洲国产精品999| 欧美专区福利在线| 92裸体在线视频网站| 欧美大片在线看| 欧美一级高清免费播放| 国产不卡av在线| 亚洲国产第一页| 91免费观看网站| 亚洲一区二区三区视频| 国产精品va在线播放| 中文字幕v亚洲ⅴv天堂| 国产69久久精品成人看| 国内久久久精品| 狠狠躁夜夜躁久久躁别揉| 亚洲国产精品小视频| 日本欧美在线视频| 欧美日韩在线视频一区二区| 日本三级韩国三级久久| 97av在线视频免费播放| 欧美日韩精品在线| 国产精品夫妻激情| 国产第一区电影| 91精品视频在线播放| 国产精品视频中文字幕91| 色阁综合伊人av| 午夜精品久久久久久久男人的天堂| 日韩精品黄色网| 久久亚洲私人国产精品va| 欧美精品制服第一页| 91在线高清视频| 午夜精品蜜臀一区二区三区免费| 日韩在线观看成人| 国产精品日韩欧美| 欧美日韩亚洲成人| 成人av色在线观看| 久久视频免费在线播放| 免费av在线一区| 日av在线播放中文不卡| 曰本色欧美视频在线| 亚洲黄页网在线观看| 麻豆精品精华液| 亚洲欧美一区二区三区四区| 欧美电影在线播放| 4438全国成人免费| 在线观看国产精品日韩av| 欧美日韩国产区| 亚洲精品日韩av| 国产日韩欧美夫妻视频在线观看| 欧美视频中文在线看| 日韩在线视频播放| 国内精品久久久久久中文字幕| 92国产精品视频| 精品国产精品三级精品av网址| 92版电视剧仙鹤神针在线观看| 国产婷婷色综合av蜜臀av| 日本高清不卡在线| 色中色综合影院手机版在线观看| 亚洲色图25p| 91老司机在线| 日韩高清电影免费观看完整版| 日韩在线免费高清视频| 懂色av影视一区二区三区| 国产欧美一区二区白浆黑人| 国产欧美一区二区三区四区| 欧美中文字幕精品| 亚洲视频在线观看| 神马久久桃色视频| 伦理中文字幕亚洲| 久久91亚洲精品中文字幕| 精品久久久久久久中文字幕| 欧美肥老妇视频| 久色乳综合思思在线视频| 日本精品久久电影| 国产成人自拍视频在线观看| 亚洲综合在线做性| 日韩激情视频在线播放| 国产精品久久久久久av下载红粉| 亚洲精品一区二区网址| 国产免费一区视频观看免费| 精品国产精品自拍| 欧美日产国产成人免费图片| 国产精品午夜视频| 97视频免费在线观看| 亚洲人午夜精品| 亚洲人永久免费| 91在线观看免费高清完整版在线观看| 欧美另类暴力丝袜| 精品欧美一区二区三区| 国内免费久久久久久久久久久| 日韩av网站导航| 在线观看久久av| 亚洲国产精品va在看黑人| 91沈先生作品| 欧美色欧美亚洲高清在线视频|