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

首頁 > 開發 > JS > 正文

JavaScript實現一個帶AI的井字棋游戲源碼

2024-05-06 16:44:31
字體:
來源:轉載
供稿:網友

最近有一門課結束了,需要做一個井字棋的游戲,我用JavaScript寫了一個。首先界面應該問題不大,用html稍微寫一下就可以。主要是人機對弈時的ai算法,如何使電腦方聰明起來,是值得思考一下的。開始游戲后,由玩家先行。那么站在計算機的角度,可以對多種情況進行分析,并按照重要程度賦予權值。

情況如下:

1、同一排(行。列。對角線)有且只有兩個棋子,并且都是自己的,只要再進一步就能獲勝,那么剩下的那個位置權值最高,優先級最大。賦予一級權值。

2、同一排(行。列。對角線)有且只有兩個棋子,并且都是對方的(也就是玩家的),只要再進一步,玩家就會成功,所以“我”要堵住,剩下的那個位置賦予二級權值。

3、因為電腦方后行,如果聰明點,需要一直堵玩家方,所以當一排只有一個棋,且是玩家的棋子,那么該排其他位置的權值設為三級。

4、四級權值:一排只有己方(電腦方)的棋子。

5、五級權限:同排沒有棋子,包括對方和己方。

       實現的時候,每個位置的棋子,可以用二維數組full表示,每個位置的權值大小也用一個二維數組val來表示。玩家方下完后,調用AI方的函數,AI方行棋前,先更新一下權值,然后選出權值最大的位置落子(最優解)。無論是ai還是玩家方,每次落子后都要判斷有沒有產生輸贏。用alert()函數輸出結果。

       為了表示權值的大小,規定按照一級到五級順序,依次加  10000、1000、10、5、3

       注:由于可能要提交源碼,我沒有分離出css樣式和js文件,不過最好還是分開寫更規范。如有不足之處,歡迎批評指正。

源碼如下:

<html><head><meta charset="utf-8"><title>井字棋</title><script>//定義全局變量var full=[[0,0,0],[0,0,0],[0,0,0]];//0表示null,1表示我下的,2表示電腦下的var val=[[1,1,1],[1,1,1],[1,1,1]];//表示每個位置的權值function judge(){   //檢測是否有人贏   //行   for(var i=0;i<3;i++){     if(full[i][0]==full[i][1]&&full[i][1]==full[i][2]&&full[i][0]!=0){             if(full[i][0]==1){                window.alert("you win!");                return true;             }             else {                window.alert("you lose");                return true;             }                     }   }   //列   for(var i=0;i<3;i++){     if(full[0][i]==full[1][i]&&full[1][i]==full[2][i]&&full[0][i]!=0){             if(full[0][i]==1){                window.alert("you win!");                 return true;             }             else {                window.alert("you lose");                  return true;             }                     }   }   //主對角線   if(full[0][0]==full[1][1]&&full[1][1]==full[2][2]&&full[0][0]!=0){             if(full[0][0]==1){                window.alert("you win!");                return true;            }             else {                window.alert("you lose");                return true;            }                   }   if(full[0][2]==full[1][1]&&full[2][0]==full[1][1]&&full[0][2]!=0){             if(full[0][2]==1){                window.alert("you win!");                return true;            }             else {               window.alert("you lose");               return true;            }   }   for(var i=0;i<3;i++){     for(var j=0;j<3;j++){      if(full[i][j]==0)        return false;//說明還沒結束       if(i==2&&j==2)        {window.alert("平局!");          return true;        }             }   }   return false;//無結果}function bn(i,j){   //如果已經下過,則無效   if(full[i][j]!=0){      return 0;   }else{      //沒下過      full[i][j]=1;      num1=(i*3+j+1)+"";      document.getElementById(num1).value="X";      if(judge()==true){        return;      }      ai();//切換   }}//重置權值:function resetValue(){   for(var i=0;i<3;i++){      for(var j=0;j<3;j++){        if(full[i][j]!=0)          val[i][j]=0;        else{      //看行和列:           //最高權值         if(((full[0][j]+full[1][j]+full[2][j])==4)&&(full[0][j]*full[1][j]*full[2][j])==0         &&((full[0][j]-1)*(full[1][j]-1)*(full[2][j]-1))==-1)            val[i][j]=val[i][j]+10000;         if(((full[i][0]+full[i][1]+full[i][2])==4)&&(full[i][0]*full[i][1]*full[i][2])==0         &&((full[i][0]-1)*(full[i][1]-1)*(full[i][2]-1))==-1)            val[i][j]=val[i][j]+10000;         //次級權值         if(((full[0][j]+full[1][j]+full[2][j])==2)&&(full[0][j]*full[1][j]*full[2][j])==0         &&((full[0][j]-1)*(full[1][j]-1)*(full[2][j]-1))==0)            val[i][j]=val[i][j]+1000;         if(((full[i][0]+full[i][1]+full[i][2])==2)&&(full[i][0]*full[i][1]*full[i][2])==0         &&((full[i][0]-1)*(full[i][1]-1)*(full[i][2]-1))==0)            val[i][j]=val[i][j]+1000;         //三級權值(一排只有一個X)         if(((full[0][j]+full[1][j]+full[2][j])==1)&&(full[0][j]*full[1][j]*full[2][j])==0         &&((full[0][j]-1)*(full[1][j]-1)*(full[2][j]-1))==0)            val[i][j]=val[i][j]+10;         if(((full[i][0]+full[i][1]+full[i][2])==1)&&(full[i][0]*full[i][1]*full[i][2])==0         &&((full[i][0]-1)*(full[i][1]-1)*(full[i][2]-1))==0)            val[i][j]=val[i][j]+10;         //四級權值(一排只有一個O)         if(((full[0][j]+full[1][j]+full[2][j])==2)&&(full[0][j]*full[1][j]*full[2][j])==0         &&((full[0][j]-1)*(full[1][j]-1)*(full[2][j]-1))==1)            val[i][j]=val[i][j]+5;         if(((full[i][0]+full[i][1]+full[i][2])==2)&&(full[i][0]*full[i][1]*full[i][2])==0         &&((full[i][0]-1)*(full[i][1]-1)*(full[i][2]-1))==1)            val[i][j]=val[i][j]+5;         //五級權限(該行沒有X或O)         if(((full[0][j]+full[1][j]+full[2][j])==0)&&(full[0][j]*full[1][j]*full[2][j])==0         &&((full[0][j]-1)*(full[1][j]-1)*(full[2][j]-1))==-1)            val[i][j]=val[i][j]+2;         if(((full[i][0]+full[i][1]+full[i][2])==0)&&(full[i][0]*full[i][1]*full[i][2])==0         &&((full[i][0]-1)*(full[i][1]-1)*(full[i][2]-1))==-1)            val[i][j]=val[i][j]+2;    //主對角線:同上          if((i==0&&j==0)||(i==2&&j==2)||(i==1&&j==1)){            if(((full[0][0]+full[1][1]+full[2][2])==4)&&(full[0][0]*full[1][1]*full[2][2])==0            &&((full[0][0]-1)*(full[1][1]-1)*(full[2][2]-1))==-1)            val[i][j]=val[i][j]+10000;         //次級權值         if(((full[0][0]+full[1][1]+full[2][2])==2)&&(full[0][0]*full[1][1]*full[2][2])==0         &&((full[0][0]-1)*(full[1][1]-1)*(full[2][2]-1))==0)            val[i][j]=val[i][j]+1000;         //三級權值(一排只有一個X)         if(((full[0][0]+full[1][1]+full[2][2])==1)&&(full[0][0]*full[1][1]*full[2][2])==0         &&((full[0][0]-1)*(full[1][1]-1)*(full[2][2]-1))==0)            val[i][j]=val[i][j]+10;         //四級權值(一排只有一個O)         if(((full[0][0]+full[1][1]+full[2][2])==2)&&(full[0][0]*full[1][1]*full[2][2])==0         &&((full[0][0]-1)*(full[1][1]-1)*(full[2][2]-1))==1)            val[i][j]=val[i][j]+5;         //五級權值(該行沒有X或O)         if(((full[0][0]+full[1][1]+full[2][2])==0)&&(full[0][0]*full[1][1]*full[2][2])==0         &&((full[0][0]-1)*(full[1][1]-1)*(full[2][2]-1))==-1)            val[i][j]=val[i][j]+2;        }     //副對角線(同上)        if((i==0&&j==2)||(i==2&&j==0)||(i==1&&j==1)){            //一級           if(((full[0][2]+full[1][1]+full[2][0])==4)&&(full[0][2]*full[1][1]*full[2][0])==0           &&((full[0][2]-1)*(full[1][1]-1)*(full[2][0]-1))==-1)            val[i][j]=val[i][j]+10000;            //二級            if(((full[0][2]+full[1][1]+full[2][0])==2)&&(full[0][2]*full[1][1]*full[2][0])==0            &&((full[0][2]-1)*(full[1][1]-1)*(full[2][0]-1))==0)            val[i][j]=val[i][j]+1000;            //三級權值(一排只有一個X)            if(((full[0][2]+full[1][1]+full[2][0])==1)&&(full[0][2]*full[1][1]*full[2][0])==0            &&((full[0][2]-1)*(full[1][1]-1)*(full[2][0]-1))==0)            val[i][j]=val[i][j]+10;            //四級權值(一排只有一個O)            if(((full[0][2]+full[1][1]+full[2][0])==2)&&(full[0][2]*full[1][1]*full[2][0])==0            &&((full[0][2]-1)*(full[1][1]-1)*(full[2][0]-1))==1)            val[i][j]=val[i][j]+5;            //五級權值(該行沒有X或O)            if(((full[0][2]+full[1][1]+full[2][0])==0)&&(full[0][2]*full[1][1]*full[2][0])==0            &&((full[0][2]-1)*(full[1][1]-1)*(full[2][0]-1))==-1)            val[i][j]=val[i][j]+2;           }          }      }   }  }function ai(){   if(judge()==true){     return;   }   //挑選權值最大的   resetValue();   var mi=0,mj=0,temp=0;   for(var i=0;i<3;i++)     for(var j=0;j<3;j++){       if(val[i][j]>temp){         temp=val[i][j];         mi=i;         mj=j;       }     }     full[mi][mj]=2;     num1=(mi*3+mj+1)+"";     document.getElementById(num1).value="O";     if(judge()==true){     return;   }}function lose(){window.alert("you lose");location.reload();}</script></head><body><h1 align=center> 井字棋</h1><table border=2px bordercolor="blue"width="300"height="300" style="font-size:50 " align=center><tr><td><input type="button" id="1" Style="width:100px;height:100px;" value=" " onclick="bn(0,0)"/></td><td><input type="button" id="2" Style="width:100px;height:100px;" value=" " onclick="bn(0,1)"/></td><td><input type="button" id="3" Style="width:100px;height:100px;" value=" " onclick="bn(0,2)"/></td></tr><tr><td><input type="button" id="4" Style="width:100px;height:100px;" value=" " onclick="bn(1,0)"/></td><td><input type="button" id="5" Style="width:100px;height:100px;" value=" " onclick="bn(1,1)"/></td><td><input type="button" id="6" Style="width:100px;height:100px;" value=" " onclick="bn(1,2)"/></td></tr><tr ><td><input type="button" id="7" Style="width:100px;height:100px;" value=" " onclick="bn(2,0)"/></td><td><input type="button" id="8" Style="width:100px;height:100px;" value=" " onclick="bn(2,1)"/></td><td><input type="button" id="9" Style="width:100px;height:100px;" value=" " onclick="bn(2,2)"/></td></tr></table><div ><input type="button" style="position:relative;left:500px;top:5px;width:100px;height:50px;" value="重新開始" onclick="location.reload() "/>   <input type="button" style="position:relative;left:550px;top:5px;width:100px;height:50px;" value="認  輸" onclick="lose()"/></div><body></html>

總結

以上所述是小編給大家介紹的JavaScript實現一個帶AI的井字棋游戲源碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
懂色av中文一区二区三区天美| 欧美最猛性xxxx| 韩国v欧美v日本v亚洲| 久久久人成影片一区二区三区观看| 91高清视频免费| 亚洲欧美成人一区二区在线电影| 国产精品久久久久久亚洲影视| 久久国产一区二区三区| 国产精品视频免费在线观看| 日韩美女在线观看| 亚洲视频在线看| 视频一区视频二区国产精品| 国产97人人超碰caoprom| 日韩精品视频在线免费观看| 亚洲国产成人在线视频| 色噜噜狠狠色综合网图区| 国产精品九九九| 日韩av中文字幕在线播放| 91精品国产乱码久久久久久蜜臀| 欧美精品制服第一页| 欧美疯狂做受xxxx高潮| 国产精品免费一区| 成人国内精品久久久久一区| 亚洲九九九在线观看| 欧美性生交大片免费| 久久99亚洲热视| 国产精品自产拍在线观| 国产精品久久久久久久av大片| 亚洲欧美综合区自拍另类| 精品亚洲一区二区三区在线观看| 欧美专区在线播放| 欧美激情精品久久久久久免费印度| 久久人人爽亚洲精品天堂| 91人成网站www| 国产精品男女猛烈高潮激情| 国产精品视频一区二区三区四| 日韩动漫免费观看电视剧高清| 国产精品美女主播在线观看纯欲| 成人免费视频97| 成人日韩在线电影| 亚洲国产成人久久综合一区| 亚洲二区在线播放视频| 在线观看精品自拍私拍| 日本精品视频在线观看| 欧美激情亚洲综合一区| 一区二区三区久久精品| 一道本无吗dⅴd在线播放一区| 日韩福利视频在线观看| 亚洲日韩欧美视频| 2019中文字幕在线| 国产精品黄页免费高清在线观看| 亚洲精品美女免费| 一区二区欧美在线| 日本道色综合久久影院| 欧美精品videos性欧美| 亚洲专区中文字幕| 亚洲欧洲成视频免费观看| 成人久久18免费网站图片| 国产一区香蕉久久| 亚洲影视九九影院在线观看| 在线精品91av| 色777狠狠综合秋免鲁丝| 欧美香蕉大胸在线视频观看| 久久久久久成人| 亚洲大尺度美女在线| 国产精品尤物福利片在线观看| 亚洲精品短视频| 91av网站在线播放| 精品视频在线播放| 高清欧美一区二区三区| 久久国产精品电影| 国产999视频| 亚洲一区中文字幕| 日本一区二区三区在线播放| 成人激情视频在线| 久久影视电视剧凤归四时歌| 亚洲人成在线观| 欧美激情精品久久久| 5566日本婷婷色中文字幕97| 高跟丝袜一区二区三区| 日韩美女视频免费在线观看| 国产精品国产三级国产aⅴ浪潮| 中文字幕在线国产精品| 国产精品黄色影片导航在线观看| 亚洲在线免费视频| 日本久久久a级免费| 免费91麻豆精品国产自产在线观看| 中文字幕欧美精品在线| 久久久久久久999精品视频| 中日韩美女免费视频网址在线观看| 狠狠躁18三区二区一区| 日韩三级成人av网| 亚洲精品国产成人| 国产精品久久久久一区二区| 国产精品高清在线| 亚洲精品久久久久久久久久久久| 日本精品免费一区二区三区| 亚洲午夜国产成人av电影男同| 国产精品第一视频| 亚洲影院色在线观看免费| 欧美国产第二页| 欧美国产日韩一区二区在线观看| 国产日韩欧美在线播放| 亚洲性无码av在线| 亚洲成人久久电影| 亚洲精品久久视频| 蜜臀久久99精品久久久无需会员| 欧美理论电影在线播放| 97精品视频在线观看| 欧美激情亚洲精品| 欧美猛交免费看| 国产精品视频公开费视频| 亚洲美女又黄又爽在线观看| 欧美国产日韩一区二区三区| 日韩极品精品视频免费观看| 九九热视频这里只有精品| 欧美成人三级视频网站| 成人网在线观看| 成人午夜一级二级三级| 国产成人涩涩涩视频在线观看| 日韩欧美国产视频| 日韩一区二区福利| 九九精品在线观看| 日韩成人av在线播放| 欧美亚洲午夜视频在线观看| 日本精品一区二区三区在线播放视频| 美女av一区二区三区| 国产一区二区三区三区在线观看| 日韩精品欧美国产精品忘忧草| 色小说视频一区| 在线观看国产精品日韩av| 亚洲精品国产精品国自产在线| 久久久噜噜噜久噜久久| 亚洲成人黄色网| 亚洲欧美国产一区二区三区| 成人精品久久一区二区三区| 国产精品影片在线观看| 在线播放国产一区二区三区| 国产性色av一区二区| 精品国产区一区二区三区在线观看| 伊人亚洲福利一区二区三区| 国产精品久久久久久久久久免费| 日本aⅴ大伊香蕉精品视频| 色婷婷av一区二区三区久久| 欧美精品免费看| 亚洲国产成人久久综合| 欧美成人免费在线观看| 日日摸夜夜添一区| 伊人成人开心激情综合网| 亚洲精品99999| 中文字幕欧美专区| 久久成人精品一区二区三区| 久久久久久久亚洲精品| 国产精品美女久久| 精品在线欧美视频| 国产小视频国产精品| 亚洲成色999久久网站| 亚洲精品日韩av| 国产精品美女网站| 91麻豆桃色免费看| 久久精品夜夜夜夜夜久久| 国产精品专区h在线观看| 亚洲福利视频网站| 久久久999精品免费|