[JavaScript]陈年老代码:自带AI的井字棋游戏
2017-12-03 22:48
423 查看
翻硬盘的时候,翻出来一份不知道什么时候写的井字棋小游戏。自带简单AI,玩了一下,感觉还行。想了想,好像是以前上什么课时的时候偷偷在桌底下写的。
![](https://img-blog.csdn.net/20171203224513189?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU2hlbnBpYmFpcGFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
>Html页面
>JS脚本
>Html页面
<html> <head> <title>井字棋游戏</title> <script type="text/javascript" src="jinziqi.js"></script> <body> <p><b><h2>井字棋对战(可选AI)</h2></b><p> <table border="1" width="50"> <tr> <td><input type="button" id="bt7" value=" "width="50" onclick="bn(7)"></td> <td><input type="button" id="bt8" value=" "width="50" onclick="bn(8)"></td> <td><input type="button" id="bt9" value=" "width="50" onclick="bn(9)"></td> </tr> <tr> <td><input type="button" id="bt4" value=" "width="50" onclick="bn(4)"></td> <td><input type="button" id="bt5" value=" "width="50" onclick="bn(5)"></td> <td><input type="button" id="bt6" value=" "width="50" onclick="bn(6)"></td> </tr> <tr> <td><input type="button" id="bt1" value=" "width="50" onclick="bn(1)"></td> <td><input type="button" id="bt2" value=" "width="50" onclick="bn(2)"></td> <td><input type="button" id="bt3" value=" "width="50" onclick="bn(3)"></td> </tr> </table> <br> <input type="text" id="info" value="游戏开始!玩家先行!" disabled="true"> <br><br> <input type="button" id="restart" value="重新开始" onclick="restart()"> <input type="button" id="enableAI" value="关闭AI" onclick="cgAI()"> <br> <br>O胜利:<input type="text" id="o_win" value="0" disabled="true"> <br>X胜利:<input type="text" id="x_win" value="0" disabled="true"> <br>_平局:<input type="text" id="draw" value="0" disabled="true"> <br><br><font color="red" size="4"><b>Create by 身披白袍</b></font> </body> </html>
>JS脚本
var jin = new Array(0,0,0,0,0,0,0,0,0,0);//井字格,O为1,X为-1 var XorO = 0;//轮到O还是X下棋 var enableAI = 1;//默认启用AI var gameover = false;//游戏是否结束 var player_won = 0; var AI_won = 0; var draw =0; function AI(me,emy){ var maxValue=new Array(0,0,0,0,0,0,0,0,0,0); var hisValue=new Array(0,0,0,0,0,0,0,0,0,0); var i=0; //AI的价值 for(i=1;i<10;i++){ var y=parseInt((i-1)/3); var x=parseInt((i-1)%3); if(jin[3*y+1]!=emy && jin[3*y+2]!=emy && jin[3*y+3]!=emy)maxValue[i]++;//横排 if(jin[x+1]!=emy && jin[x+1+3]!=emy && jin[x+1+6]!=emy)maxValue[i]++;//竖排 if(i==7 || i==5 || i==3){ if(jin[7]!=emy && jin[5]!=emy && jin[3]!=emy)maxValue[i]++;//斜排1 } if(i==1 || i==5 || i==9){ if(jin[1]!=emy && jin[5]!=emy && jin[9]!=emy)maxValue[i]++;//斜排2 } } //玩家的价值 for(i=1;i<10;i++){ var y=parseInt((i-1)/3); var x=parseInt((i-1)%3); if(jin[3*y+1]!=me && jin[3*y+2]!=me && jin[3*y+3]!=me)hisValue[i]++;//横排 if(jin[x+1]!=me && jin[x+1+3]!=me && jin[x+1+6]!=me)hisValue[i]++;//竖排 if(i==7 || i==5 || i==3){ if(jin[7]!=me && jin[5]!=me && jin[3]!=me)hisValue[i]++;//斜排1 } if(i==1 || i==5 || i==9){ if(jin[1]!=me && jin[5]!=me && jin[9]!=me)hisValue[i]++;//斜排2 } } //判断绝对价值 for(i=1;i<10;i++){ var y=parseInt((i-1)/3); var x=parseInt((i-1)%3); if((jin[3*y+1]+jin[3*y+2]+jin[3*y+3])==emy*2)maxValue[i]=100;//横排 if((jin[x+1]+jin[x+1+3]+jin[x+1+6])==emy*2)maxValue[i]=100;//竖排 if(i==7 || i==5 || i==3){ if((jin[7]+jin[5]+jin[3])==emy*2)maxValue[i]=100;//斜排1 } if(i==1 || i==5 || i==9){ if((jin[1]+jin[5]+jin[9])==emy*2)maxValue[i]=100;//斜排2 } } for(i=1;i<10;i++)maxValue[i]+=hisValue[i];//价值求和 //选择最高价值的一步棋 var max=-100,go=1; for(i=1;i<10;i++){ if(maxValue[i]>max && jin[i]==0){//该格未被走过 go=i; max=maxValue[i]; } } bn(go); } function bn(i){ if(jin[i]!=0 || gameover)return ;//游戏结束时或该棋格已被下过 if(XorO==0){ if(i==1)document.getElementById("bt1").value="O"; else if(i==2)document.getElementById("bt2").value="O"; else if(i==3)document.getElementById("bt3").value="O"; else if(i==4)document.getElementById("bt4").value="O"; else if(i==5)document.getElementById("bt5").value="O"; else if(i==6)document.getElementById("bt6").value="O"; else if(i==7)document.getElementById("bt7").value="O"; else if(i==8)document.getElementById("bt8").value="O"; else if(i==9)document.getElementById("bt9").value="O"; jin[i]=1; } else{ if(i==1)document.getElementById("bt1").value="X"; else if(i==2)document.getElementById("bt2").value="X"; else if(i==3)document.getElementById("bt3").value="X"; else if(i==4)document.getElementById("bt4").value="X"; else if(i==5)document.getElementById("bt5").value="X"; else if(i==6)document.getElementById("bt6").value="X"; else if(i==7)document.getElementById("bt7").value="X"; else if(i==8)document.getElementById("bt8").value="X"; else if(i==9)document.getElementById("bt9").value="X"; jin[i]=-1; } cgTurn(); } //交换回合 function cgTurn(){ var sum=0; for(var i=0;i<10;i++)if(jin[i]!=0)sum++; if( checkWin()==true ){ gameover=true; if(XorO==0){ document.getElementById("info").value="O胜利!"; player_won++;balance(); } else { document.getElementById("info").value="X胜利!"; AI_won++;balance(); } return ; } if(sum==9){ document.getElementById("info").value="平局!"; draw++;balance(); return ; } XorO=(XorO+1)%2; if(XorO==0)document.getElementById("info").value="轮到O"; else { document.getElementById("info").value="轮到X"; if(enableAI==1)AI(-1,1);//默认玩家走O AI走X } } //判断是否有人胜利 function checkWin(){ var num=false; if(jin[7]+jin[8]+jin[9]==-3 || jin[7]+jin[8]+jin[9]==3)return true; else if(jin[4]+jin[5]+jin[6]==-3 || jin[4]+jin[5]+jin[6]==3)return true; else if(jin[1]+jin[2]+jin[3]==-3 || jin[1]+jin[2]+jin[3]==3)return true; else if(jin[1]+jin[4]+jin[7]==-3 || jin[1]+jin[4]+jin[7]==3)return true; else if(jin[2]+jin[5]+jin[8]==-3 || jin[2]+jin[5]+jin[8]==3)return true; else if(jin[3]+jin[6]+jin[9]==-3 || jin[3]+jin[6]+jin[9]==3)return true; else if(jin[1]+jin[5]+jin[9]==-3 || jin[1]+jin[5]+jin[9]==3)return true; else if(jin[7]+jin[5]+jin[3]==-3 || jin[7]+jin[5]+jin[3]==3)return true; } function restart(){ for(i=1;i<10;i++)jin[i]=0; document.getElementById("bt1").value=" "; document.getElementById("bt2").value=" "; document.getElementById("bt3").value=" "; document.getElementById("bt4").value=" "; document.getElementById("bt5").value=" "; document.getElementById("bt6").value=" "; document.getElementById("bt7").value=" "; document.getElementById("bt8").value=" "; document.getElementById("bt9").value=" "; document.getElementById("info").value="游戏开始!玩家先行!" XorO = 0; gameover=false; } //更变AI启用状态 function cgAI(){ enableAI=(enableAI+1)%2; if(enableAI==0)document.getElementById("enableAI").value="开启AI"; else document.getElementById("enableAI").value="关闭AI"; } //结算、更新界面 function balance(){ document.getElementById("o_win").value=player_won; document.getElementById("x_win").value=AI_won; document.getElementById("draw").value=draw; }
相关文章推荐
- JavaScript实现一个带AI的井字棋游戏源码
- JavaScript实现一个简易的计算器实例代码
- HTML5全屏来袭:支持浏览器原生全屏的JavaScript代码发布
- ASP动态生成的javascript表单验证代码
- javascript 局部页面打印实现代码
- Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
- 纯JavaScript实现的前端分页代码
- 【javascript】如何延迟加载JavaScript(Google推荐的代码)
- Javascript工具 - 使用JSDoc建立JavaScript代码的文档
- IE和FF都兼容的加入收藏的javascript代码
- 图片漂浮代码javascript
- 设为首页和增加收藏javascript代码
- 【javascript】js中,巧妙运用 && 和 || 优化代码
- javascript实现youku的视频代码自适应宽度
- 如何让动态插入的javascript脚本代码跑起来。
- css和javascript代码写在页面中的位置说明
- javascript中不等于的代码是什么怎么写
- 调试Javascript代码(浏览器F12及VS中debugger关键字)
- C#中使用MSScriptControl中执行 javascript代码
- 编写高质量JavaScript代码的一些建议