这次给大家带来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;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();

}

井字棋

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

php井字游戏代码_JS实现井字棋游戏步骤详解相关推荐

  1. python井字棋游戏代码_python实现井字棋游戏

    python实现井字棋游戏 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  python实现井字棋游戏.txt ] (友情提示:右键点上行txt文档名->目标 ...

  2. php井字游戏,python实现井字棋游戏

    #本游戏python3.4.0下编写调试,只能在windows下运行. import random import subprocess import time #定义函数 def draw_board ...

  3. 井字游戏HTML,纯CSS3实现的井字棋游戏

    运行效果: html Restart Note: use the Full Page view for the best experience. css3 @charset "UTF-8&q ...

  4. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  5. C++井字棋游戏,DOS界面版

    据说有一个能保证不败的算法.明天看看先再写个PVC版的. 正题.今天无聊写了个井字棋游戏,顺便逐渐让自己习惯良好的代码风格,放上来给新手学习学习. jzq2.cpp /*N字棋游戏PVP版,DOS版本 ...

  6. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  7. 采用α-β算法实现井字棋游戏

    题目描述 (1)图形化界面. (2)随机选取先手后手. (3)可以人-计算机或计算机-计算机 界面效果 算法 基本思想 Max-Min算法: 采用Max-Min算法进行对抗搜索,Max和Min双方均要 ...

  8. React官网的井字棋游戏

    React官网的井字棋游戏 这个是我在官网再次复习这个小游戏时梳理的一些思路,其中也包含了我在尝试时出的一些bug 文章目录 React官网的井字棋游戏 1.整体分析项目 2.为变量添加state并绑 ...

  9. c语言井字棋程序设计报告,井字棋游戏(课程设计)总结报告.doc

    井字棋游戏(课程设计)总结报告 C语言贪吃蛇游戏设计总结报告 PAGE PAGE 5 丽水学院 计算机信息学院 <C语言课程设计(短一)> 指 导 书 二 ○ 一一 年 三 附件二 封面格 ...

最新文章

  1. 自定义博客园地址栏ico图标 标签logo
  2. 矩阵从左上到右下的最短距离问题
  3. Java数据结构与排序算法——堆和堆排序
  4. 单击触发jquery.autocomplete的两种方法
  5. 高斯消去法c++_高斯消去法的算法改进
  6. db2 创建样本数据库_db2创建数据库
  7. oracle 10g express linux,在Ubuntu下安装Oracle Database 10g Express Edition
  8. 渗透测试入门27之渗透测试学习建议
  9. matlab 指定区域随机游走_了解随机游走模型和移动平均过程(Python)
  10. 别再为了this发愁了:JS中的this机制
  11. java rest client_RestClient工具类
  12. .axf文件_一文看懂hex文件、bin文件、axf文件的区别
  13. MayaDay1:历史记录和删除历史记录
  14. 当你们玩挂机游戏累了(_杰森大师_JAVA)
  15. Python处理Excel求取某列固定间隔数的平均值
  16. Android仿QQ微信开场导航以及登陆界面
  17. python当前时间加一分钟_Python实现的当前时间多加一天、一小时、一分钟操作示例...
  18. Pycharm2018永久破解方法
  19. 用python控制大华摄像头简单转动
  20. 印象笔记Mac版的快捷键有哪些?

热门文章

  1. 老人机应用_老人手机排行榜10强,一机多用操作简单!
  2. 1.程序员自我修养 - 绪论1
  3. SQLSERVER2008 233 18456
  4. 手把手带你入坑树莓派(3B+)之第一篇,重装Rasbian系统
  5. matplotlib之疑难点figure、axes
  6. 微服务——Docker笔记(最全)
  7. 监控android App Activity生命周期
  8. 手把手解决解决Python安装PCV
  9. 技术直播:数据科学到底该怎么“玩”?
  10. 中国三维交互式投影仪行业市场供需与战略研究报告