JavaScript五子棋

这个代码是按照网上一个JS教程写的。

这个代码有点bug吧,那就是一直封你的棋而不会去赢。

html:


<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>五子棋</title>
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
    <body>
        <canvas id="chess" width="450px" height="450px"></canvas>
        <script type="text/javascript" src="script.js"></script>
    </body>
</html>


JS:


var chessBoard = [];
var me = true;
var over = false;

var wins = [];//赢法数组

var myWin = [];//玩家赢法统计数组
var computerWin = [];//计算机赢法统计数组

//初始化棋盘的标记数组
for(var i=0;i<15;++i){
    chessBoard[i] = [];
    for(var j=0;j<15;++j){
        chessBoard[i][j] = 0;
    }
}

//赢法数组开三维空间
for(var i=0;i<15;++i){
    wins[i] = [];
    for(var j=0;j<15;++j){
        wins[i][j] = [];
    }
}

//赢法统计
var count = 0;
//横向赢法
for(var i=0;i<15;++i){
    for(var j=0;j<11;++j){
        for(var k =0;k<5;++k){
            wins[i][j+k][count] = true;
        }
        count++;
    }
}
//竖向赢法
for(var i=0;i<15;++i){
    for(var j=0;j<11;++j){
        for(var k =0;k<5;++k){
            wins[j+k][i][count] = true;
        }
        count++;
    }
}

//斜向赢法
for(var i=0;i<11;++i){
    for(var j=0;j<11;++j){
        for(var k =0;k<5;++k){
            wins[i+k][j+k][count] = true;
        }
        count++;
    }
}

//反斜向赢法
for(var i=0;i<11;++i){
    for(var j=14;j>3;--j){
        for(var k =0;k<5;++k){
            wins[i+k][j-k][count] = true;
        }
        count++;
    }
}

console.log(count);

//初始化玩家和电脑的赢法统计数组
for(var i=0;i<count;++i){
    myWin[i] = 0;
    computerWin[i] = 0;
}

var chess = document.getElementById('chess');
var context = chess.getContext('2d');

context.strokeStyle = "#BFBFBF";

//加载完代码立即运行函数的内容
onload = function()
{
    if(over)return;
    if(!me)return;
    drawChessBoard();
}

//画棋盘
var drawChessBoard = function(){
    for(var i=0;i<15;++i){
        context.moveTo(15 + i*30,15);
        context.lineTo(15 + i*30,435);
        context.stroke();
        context.moveTo(15,15 + i*30);
        context.lineTo(435,15 + i*30);
        context.stroke();
    }
}

//下棋(i,j)地方,me表示是计算机还是玩家
var oneStep = function(i,j,me){
    context.beginPath();
    context.arc(15 + i*30,15 + j*30,13,0,2*Math.PI);
    context.closePath();
    var gradient = context.createRadialGradient(15 + i*30+2,15 + j*30-2,50,15 + i*30+2,15 + j*30-2,0);
    if(me){
        gradient.addColorStop(0,"#0A0A0A");
        gradient.addColorStop(1,"#636766");
    }else{
        gradient.addColorStop(0,"#D1D1D1");
        gradient.addColorStop(1,"#F9F9F9");
    }
    context.fillStyle = gradient;
    context.fill();
}

chess.onclick = function(e){
    var x = e.offsetX;
    var y = e.offsetY;
    var i = Math.floor(x/30);
    var j = Math.floor(y/30);
    //没有棋在此位置
    if(chessBoard[i][j]==0){
        oneStep(i,j,me);
        chessBoard[i][j] = 1;
        //枚举count种赢法
        for(var k=0;k<count;++k){
            if(wins[i][j][k]){
                //第k种赢法玩家占有了
                myWin[k]++;
                //计算机不可能从第k种赢法赢
                computerWin[k] = 6;
                if(myWin[k] == 5){
                    window.alert("You Win!");
                    over = true;
                }
            }
        }
        //没有结束,计算机下棋
        if(!over){
             me = !me;
            computerAI();
        }
    }
}

var computerAI = function(){
    //玩家分数
    var myScore = [];
    //计算机分数
    var computerScore = [];
    var max = 0;
    var u = 0,v = 0;
    //初始化为二维数组
    for(var i=0;i<15;++i){
        myScore[i] = [];
        computerScore[i] = [];
        for(var j=0;j<15;++j){
            myScore[i][j] = 0;
            computerScore[i][j] = 0;
        }
    }
    //枚举整个棋盘的位置,每个位置的count种赢法
    for(var i=0;i<15;++i){
        for(var j=0;j<15;++j){
            if(chessBoard[i][j]==0){
                for(var k=0;k<count;++k){
                    if(wins[i][j][k]){
                        if(myWin[k] == 1){
                            myScore[i][j] += 200;
                        }else if(myWin[k]==2){
                            myScore[i][j] += 400;
                        }else if(myWin[k]==3){
                            myScore[i][j] += 2000;
                        }else if(myWin[k]==4){
                            myScore[i][j] += 10000;
                        }
                    }
                    if(computerWin[k]){
                        if(myWin[k] == 1){
                            computerScore[i][j] += 220;
                        }else if(computerWin[k]==2){
                            computerScore[i][j] += 420;
                        }else if(computerWin[k]==3){
                            computerScore[i][j] += 2200;
                        }else if(computerWin[k]==4){
                            computerScore[i][j] += 20000;
                        }
                    }
                }
                if(myScore[i][j]>max){
                    max = myScore[i][j];
                    u = i,v = j;
                }else if(myScore[i][j] == max){
                    if(computerScore[i][j]>computerScore[u][v]){
                        u = i,v = j;
                    }
                }
                 if(computerScore[i][j]>max){
                    max = computerScore[i][j];
                    u = i,v = j;
                }else if(computerScore[i][j] == max){
                    if(myScore[i][j]>myScore[u][v]){
                        u = i,v = j;
                    }
                }
            }
        }
    }
    oneStep(u,v,false);
    chessBoard[u][v] = 2;
    for(var k=0;k<count;++k){
            if(wins[u][v][k]){
                computerWin[k]++;
                myWin[k] = 6;
                if(computerWin[k] == 5){
                    window.alert("computer Win!");
                    over = true;
                }
            }
        }
        if(!over){
             me = !me;
        }
}


CSS:


canvas {
    display: block;
    margin: 50px auto;
    box-shadow: -2px -2px 2px #EFEFEF,5px 5px 5px #B9B9B9;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值