zoukankan      html  css  js  c++  java
  • JS+canvas实现人机大战之五子棋

     

    效果图:

    html代码如下:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
            <title>五子棋</title>
            <link rel="stylesheet" type="text/css" href="css/style.css"/>
        </head>
        <body>
            <canvas id="chess" width="450px" height="450px"></canvas>
            <div id='restart' class="restart">
                <span>重新开始</span>
            </div>
            <script src="js/script.js" type="text/javascript" charset="utf-8"></script>
        </body>
    </html>

    css代码如下:

    canvas{
        display: block;
        margin: 50px auto;
        box-shadow: -2px -2px 2px #efefef, 5px 5px 5px #b9b9b9;
    }
    .restart{
        text-align: center;
    }
    .restart>span{
        display: inline-block;
        padding: 10px 20px;
        color: #fff;
        background-color: #45c01a;
        border-radius: 5px;
    }
    js代码如下:


    var over = false;
    var me = true; //我

    var chressBord = [];//棋盘
    for(var i = 0; i < 15; i++){
        chressBord[i] = [];
        for(var j = 0; j < 15; j++){
            chressBord[i][j] = 0;
        }
    }

    //赢法的统计数组
    var myWin = [];
    var computerWin = [];

    //赢法数组
    var wins = [];
    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++;
        }
    }

    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'; //边框颜色

    var logo = new Image();
    logo.src = 'img/logo.png';
    logo.onload  = function(){
        context.drawImage(logo,0,0,450,450);
        drawChessBoard();
    }

    document.getElementById("restart").onclick = function(){
        window.location.reload();
    }
    chess.onclick = function(e){
        if(over){
            return;
        }
        if(!me){
            return;
        }
        var x = e.offsetX;
        var y = e.offsetY;
        var i = Math.floor(x / 30);
        var j = Math.floor(y / 30);
        if(chressBord[i][j] == 0){
            oneStep(i,j,me);
            chressBord[i][j] = 1;//我        
                        
            for(var k = 0; k < count; k++){
                if(wins[i][j][k]){
                    myWin[k]++;
                    computerWin[k] = 6;//这个位置对方不可能赢了
                    if(myWin[k] == 5){
                        window.alert('你赢了');
                        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;
            }
        }
        for(var i = 0; i < 15; i++){
            for(var j = 0; j < 15; j++){
                if(chressBord[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] == 1){
                                computerScore[i][j] += 220;
                            }else if(computerWin[k] == 2){
                                computerScore[i][j] += 420;
                            }else if(computerWin[k] == 3){
                                computerScore[i][j] += 2100;
                            }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);
        chressBord[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('计算机赢了');
                    over = true;
                }
            }
        }
        if(!over){
            me = !me;
        }
    }

    //绘画棋盘
    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();
        }
    }
    //画旗子
    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, 13, 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();
    }
     

  • 相关阅读:
    stata如何建立交互项
    PSM的stata实现
    Stata结果输出:outreg2命令详解
    stata固定效应
    【C++/Qt】cmake生成可执行文件流程(Windows/Linux)
    【数学相关】概率论手写笔记
    【搜索】dfs&bfs
    【C/C++】对拍教程
    【MySQL】MySQL基础操作(下)
    【Linux】ubuntu初始配置
  • 原文地址:https://www.cnblogs.com/gdcgy/p/5379159.html
Copyright © 2011-2022 走看看