猫史档案馆


[box3]实现5子琪人机对弈

用户:datacatdatacat查看:2 回复:8 评论:2 创建时间:2021-06-30T15:01:11


/*
*1.赢法数组
*2.棋盘数组
*3.分析落子
*/

|所需变量

var me = 1;
var over = 0; //?false
var board = [];
var wins = [];
var count = 0;

var playerWin = [];
var computerWin = [];

|赢法数组

//棋盘数组初始化
for (let i = 0; i < 15; i++) {
    board[i] = [];
    for (let j = 0; j < 15; j++) {
        board[i][j] = 0;
    }
}


for (let i = 0; i < 15; i++) {
    wins[i] = [];
    for (let j = 0; j < 15; j++) {
        wins[i][j] = [];
    }
}
//*横线赢法
for (let i = 0; i < 15; i++) {
    for (let j = 0; j < 11; j++) {
        for (let k = 0; k < 5; k++) {
            wins[i][j + k][count] = 1;
        }
        count++;
    }
}

//*竖线赢法
for (let i = 0; i < 15; i++) {
    for (let j = 0; j < 11; j++) {
        for (let k = 0; k < 5; k++) {
            wins[j + k][i][count] = 1;
        }
        count++;
    }
}

//*斜线赢法
for (let i = 0; i < 11; i++) {
    for (let j = 0; j < 11; j++) {
        for (let k = 0; k < 5; k++) {
            wins[i + k][j + k][count] = 1;
        }
        count++;
    }
}

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

console.log(count);
//15x15棋盘,572赢法

|下棋函数

canvas版:

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

context.strokeStyle = "#BFBFBF"

const logo = new Image();
logo.src = "./logo.jfif";//水印
logo.onload = function () {
    context.drawImage(logo, 0, 0, 450, 450);
    darwchessbord();

}
const darwchessbord = () => {
    for (let 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 = (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();
}

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 (board[i][j] == 0) {
        oneStep(i, j, me)
        board[i][j] = 1;
        for (let k = 0; k < count; k++) {
            if (wins[i][j][k]) {
                playerWin[k]++;
                computerWin[k] = 6;
                if (playerWin[k] == 5) {
                    window.alert("player win!");
                    over = 1; //?true
                }
            }
        }
        if (!over) {
            me = !me;
            computerAI();
        }
    }
}

注:在box3运行可以自行转换,或我会在评论区发()

初始化:

for (let i = 0; i < count; i++) {
    playerWin[i] = 0;
    computerWin[i] = 0;
}

|计算机AI实现

var computerAI = async() => {
    var playerScore = [];
    var computerScore = [];
    var sleeptime = 0;
    var max = 0;
    var u = 0,
        v = 0;


    for (let i = 0; i < 15; i++) {
        playerScore[i] = [];
        computerScore[i] = [];
        for (let j = 0; j < 15; j++) {
            playerScore[i][j] = 0;
            computerScore[i][j] = 0;
        }
    }
    for (let i = 0; i < 15; i++) {
        for (let j = 0; j < 15; j++) {
            if (board[i][j] == 0) {
                for (let k = 0; k < count; k++) {
                    if (wins[i][j][k]) {
                        if (playerWin[k] == 1) playerScore[i][j] += 200;
                        else if (playerWin[k] == 2) playerScore[i][j] += 400;
                        else if (playerWin[k] == 3) playerScore[i][j] += 2000;
                        else if (playerWin[k] == 4) playerScore[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 (playerScore[i][j] > max) {
                    max = playerScore[i][j];
                    u = i;
                    v = j;
                } else if (playerScore[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 (playerScore[i][j] > playerScore[u][v]) {
                        u = i;
                        v = j;
                    }
                }
            }
        }
    }
    sleeptime = Math.floor(Math.random()*2000+2000);
    console.log(sleeptime);
    await sleep(sleeptime);
    oneStep(u,v,0);
    board[u][v] = 2;
    for (let k = 0; k < count; k++) {
        if (wins[u][v][k]) {
            computerWin[k]++;
            playerWin[k] = 6;
            if (computerWin[k] == 5) {
                window.alert("computer win!");
                over = 1; //?true
            }
        }
    }
    if(!over){
        me = !me;
    }
}

|等待函数

function sleep(time) {
    return new Promise((resolve) => setTimeout(resolve, time));
}

|结语

整个棋盘和下棋功能基于canvas

box3版预计在3天后发至评论区

emotion_编程猫_搓头

 


回复

上一页1 页 / 共 1下一页
86135clc86135clc

大佬教教我5怎么下~~~

点赞0


评论


指令者指令者

大佬教教我5子怎么下???emotion_委屈emotion_委屈emotion_委屈emotion_委屈emotion_委屈emotion_委屈emotion_委屈emotion_委屈emotion_委屈emotion_委屈emotion_委屈emotion_委屈emotion_dogeemotion_委屈emotion_委屈emotion_委屈emotion_委屈

点赞0


评论


ZNS_哪吒ZNS_哪吒

???d.d.是屏蔽词?

点赞0


评论


datacatdatacat

点赞0


评论


ssssSSSAssssSSSA

86135clc

半反源码精灵㵘贴工作室

 

 

大佬教教我5怎么下~~~

 

点赞0


评论


SHEL深空无尽SHEL深空无尽

点赞0


评论


神岛吉吉喵神岛吉吉喵

emotion_编程猫_点赞

点赞0


评论


BSS梅者如西BSS梅者如西

有禁手吗?检验一个五子棋是否专业,那么就看他的代码里是否有禁手代码(如没法看代码就随便试一下三三禁手)

点赞0


评论