JavaScript实现一个带AI的井字棋游戏源码

发布时间:2020-09-05 00:56:12

来源:脚本之家

阅读:100

作者:小楼夜听雨QAQ

最近有一门课结束了,需要做一个井字棋的游戏,我用JavaScript写了一个。首先界面应该问题不大,用html稍微写一下就可以。主要是人机对弈时的ai算法,如何使电脑方聪明起来,是值得思考一下的。开始游戏后,由玩家先行。那么站在计算机的角度,可以对多种情况进行分析,并按照重要程度赋予权值。

情况如下:

1、同一排(行。列。对角线)有且只有两个棋子,并且都是自己的,只要再进一步就能获胜,那么剩下的那个位置权值最高,优先级最大。赋予一级权值。

2、同一排(行。列。对角线)有且只有两个棋子,并且都是对方的(也就是玩家的),只要再进一步,玩家就会成功,所以“我”要堵住,剩下的那个位置赋予二级权值。

3、因为电脑方后行,如果聪明点,需要一直堵玩家方,所以当一排只有一个棋,且是玩家的棋子,那么该排其他位置的权值设为三级。

4、四级权值:一排只有己方(电脑方)的棋子。

5、五级权限:同排没有棋子,包括对方和己方。

实现的时候,每个位置的棋子,可以用二维数组full表示,每个位置的权值大小也用一个二维数组val来表示。玩家方下完后,调用AI方的函数,AI方行棋前,先更新一下权值,然后选出权值最大的位置落子(最优解)。无论是ai还是玩家方,每次落子后都要判断有没有产生输赢。用alert()函数输出结果。

为了表示权值的大小,规定按照一级到五级顺序,依次加  10000、1000、10、5、3

注:由于可能要提交源码,我没有分离出css样式和js文件,不过最好还是分开写更规范。如有不足之处,欢迎批评指正。

源码如下:

井字棋

//定义全局变量

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();

}

井字棋

总结

以上所述是小编给大家介绍的JavaScript实现一个带AI的井字棋游戏源码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对亿速云网站的支持!

java井字棋ai_JavaScript实现一个带AI的井字棋游戏源码相关推荐

  1. 用java的二维数组做一个简易计算优惠小程序(附带源码)

    要求: 1.单点: 溜肥肠24元 酱肘子32 米饭3元 2.订单满30打八折 3.优惠价: 溜肥肠18元 4.打八折与优惠价不能同时使用,点这三样,最少多少钱? 思路: 首先定义一个 String 类 ...

  2. java学习文档_阿里技术专家带你玩转JVM,从底层源码到项目实战,都在这份文档里...

    作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识. JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准.而大多数人可能没有对 JVM 的实际开发和 ...

  3. html百分比代码怎么写,参考Bootstrap写的一个带百分比的进度条(附源码)

    最近需要写一个进度条的效果,网上找了一些,但都不能完美的实现需求. 于是就自己改造了一个,效果如下图: 因为动态图太大,我上传到 GitHub 了,就不在博客上再上传了. 百分比跟随进度条移动,百分比 ...

  4. 【Pygame小游戏】不怕你走不过系列:极致AI走迷宫,学习完带你打开新世界大门~(附游戏源码)

    前言

  5. JAVA带财务进销存ERP管理系统源码,免费分享源码

    JAVA带财务进销存ERP管理系统源码 开发语言 : JAVA 数据库 : MySQL 开发工具 : Eclipse 源码类型:全开源免费分享,需要源码学习可以私信我. 系统概述: 系统主要模块有零售 ...

  6. JAVA带财务进销存 ERP管理系统源码《免费分享源码》

    <免费分享源码>JAVA带财务进销存 ERP管理系统源码 开发语言 : JAVA 数据库 : MySQL 开发工具 : Eclipse 源码类型 : WebForm 开源地址:http:/ ...

  7. java毕业设计——基于java+EVENODD编码的基于纠错码的冗余技术设计与实现(毕业论文+程序源码)——基于纠错码的冗余技术

    基于java+EVENODD编码的基于纠错码的冗余技术设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+EVENODD编码的基于纠错码的冗余技术设计与实现,文章末尾附有本毕业设计的 ...

  8. java毕业设计——基于java+eclipse+sqlserver的银行帐目管理系统设计与实现(毕业论文+程序源码)——银行帐目管理系统

    基于java+eclipse+sqlserver的银行帐目管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+eclipse+sqlserver的银行帐目管理系统设计与实现, ...

  9. java毕业设计——基于java+J2EE+Hibernate的校园二手交易网站设计与实现(毕业论文+程序源码)——二手交易网站

    基于java+J2EE+Hibernate的校园二手交易网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2EE+Hibernate的校园二手交易网站设计与实现,文章末尾附有 ...

最新文章

  1. 用漫画了解 Linux 内核到底长啥样
  2. android游戏开发笔记(0)——游戏开发分析及开发所需知识
  3. onWindowFocusChanged重要作用(得到/失去焦点call) 、
  4. 文巾解题 5. 最长回文子串
  5. ie禁止html复制元素,JavaScript_禁止选中文字兼容IE、Chrome、FF等,复制代码 代码如下: $(el).attr('u - phpStudy...
  6. JavaScript-正则表达式
  7. python open写入_Python3 open() 函数详解 读取文件写入文件追加文件二进制文件
  8. java打开输入框,java – 在Android中打开输入对话框
  9. 对弈类游戏的人工智能(3)--博弈树优化
  10. iOS 文字样式处理总结(字体、前背景色、斜体、加粗、对齐、行间距、段间距、动态获取字符串label宽高等)...
  11. BZOJ4199 NOI2015品酒大会(后缀树)
  12. JDK源码学习笔记——String
  13. 【渝粤教育】广东开放大学 计算机硬件组装与维护 形成性考核 (38)
  14. Android IntentService的使用和源代码分析
  15. 清除centos上面kde软件的一个脚本,基本好用
  16. C#项目xxx针对的是.NETFramework,Version=vxxx之解决方案
  17. 龙卷风路径_【龙卷风的防范措施】龙卷风的易发地点_龙卷风如何分级 - 妈妈网百科...
  18. GDC2013 Horizon and Beyond A Look into Tomb Raider's Tools
  19. 2008'中国地理信息系统优秀工程公示
  20. 多无线路由器AP使用同一个SSID号无缝连接漫游

热门文章

  1. 图片编辑工具Movavi Photo Editor 6Mac
  2. pNA修饰肽:H-D-Leu-Thr-Arg-pNA,H-D-Leu-Thr-Arg-pNA,CAS号: 122630-72-2/3326-63-4
  3. 【百度搜索推出惊雷算法】靠刷点击上首页已走到尽头
  4. 关于利率的c语言程序,C语言程序,求存款利息的计算。有1000元...
  5. 苹果x重启方法_苹果手机iPhone没法发短信
  6. 2020中国跨境消费报告:“小镇辣妈”“熟龄单身姐姐”“百万年薪大佬”都买啥?...
  7. Windows服务调用Office时,未将对象引用的实例
  8. php 麻辣心情笑话网,吃辣条心情说说 秒评搞笑句子
  9. 如何更好更快地完成设计之快速原型
  10. Excel 解压后 结构