JS实现井字棋游戏步骤详解

这次给大家带来JS实现井字棋游戏步骤详解,JS实现井字棋游戏的注意事项有哪些,下面就是实战案例,一起来看一下。

最近有一门课结束了,需要做一个井字棋的游戏,我用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;jtemp){         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 callback回调函数使用案例详解

使用React Navigation注意事项有哪些

以上就是JS实现井字棋游戏步骤详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2759283.html

(0)
上一篇 2025年3月8日 08:25:20
下一篇 2025年2月27日 03:17:07

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS实现飞页特效步骤详解

    这次给大家带来JS实现飞页特效步骤详解,JS实现飞页特效的注意事项有哪些,下面就是实战案例,一起来看一下。 这个效果使用了自己封装的一个运动函数;这个效果的巧妙之处在于,在开始用数组存放了每个li的位置信息,然后在点击按钮(页码)的时候让l…

    2025年3月8日
    200
  • JS实现文件拖拽上传步骤详解

    这篇文章主要介绍了JS实现的文件拖拽上传功能,涉及javascript事件触发、页面元素属性动态修改等相关操作技巧,需要的朋友可以参考下 本文实例讲述了JS实现的文件拖拽上传功能。分享给大家供大家参考,具体如下: JS文件拖拽上传p{ wi…

    2025年3月8日
    200
  • JS实现碰撞检测步骤详解

    这次给大家带来JS实现碰撞检测步骤详解,JS实现碰撞检测的注意事项有哪些,下面就是实战案例,一起来看一下。 JS碰撞检测p{width:100px; height:100px;}#box{background:red; position:a…

    2025年3月8日
    200
  • JS实现json对象数组按对象属性排序步骤详解

    这次给大家带来JS实现json对象数组按对象属性排序步骤详解,JS实现json对象数组按对象属性排序的注意事项有哪些,下面就是实战案例,一起来看一下。 在实际工作经常会出现这样一个问题:后台返回一个数组中有i个json数据,需要我们根据js…

    2025年3月8日
    200
  • JS实现3des+base64加密解密算法步骤详解

    这次给大家带来JS实现3des+base64加密解密算法,JS实现3des+base64加密解密算法的注意事项有哪些,下面就是实战案例,一起来看一下。 1. index.html: BASE64编码 var str = “网址:http:/…

    2025年3月8日
    200
  • JS调用本地摄像头功能步骤详解

    这次给大家带来JS调用本地摄像头功能步骤详解,JS调用本地摄像头功能的注意事项有哪些,下面就是实战案例,一起来看一下。 今天学习了一下js调用本地摄像头,其实是实现不是很麻烦,下面是代码部分,连接上Tomcat服务器,然后再到网页上打开即可…

    编程技术 2025年3月8日
    200
  • JS累加、迭代、穷举、递归等常用算法使用总结

    这次给大家带来JS累加、迭代、穷举、递归等常用算法使用总结,JS累加、迭代、穷举、递归等常用算法使用的注意事项有哪些,下面就是实战案例,一起来看一下。 累加和累积 累加:将一系列的数据加到一个变量里面。最后的得到累加的结果 比如:将1到10…

    编程技术 2025年3月8日
    200
  • vue-cli引入、配置axios步骤详解

    这次给大家带来vue-cli引入、配置axios步骤详解,vue-cli引入、配置axios的注意事项有哪些,下面就是实战案例,一起来看一下。 一、npm 安装axios,文件根目录下安装,指令如下 npm install axios &#…

    编程技术 2025年3月8日
    200
  • JS计算圆周率到小数点后100位实现步骤详解

    这次给大家带来JS计算圆周率到小数点后100位实现步骤详解,JS计算圆周率到小数点后100位的注意事项有哪些,下面就是实战案例,一起来看一下。 浮点数的有效数位是16位,我自己做了一个大数类,能存储100位有效数位,并实现了大数类的基本运算…

    编程技术 2025年3月8日
    200
  • Vue.js实现微信公众号菜单编辑器步骤详解(上)

    这次给大家带来Vue.js实现微信公众号菜单编辑器步骤详解(上),Vue.js实现微信公众号菜单编辑器的注意事项有哪些,下面就是实战案例,一起来看一下。 学习一段时间Vue.js,于是想尝试着做一个像微信平台里那样的菜单编辑器,在这里分享下…

    2025年3月8日
    200

发表回复

登录后才能评论