实现五子棋html AI+普通结合

本文介绍了如何使用JavaScript实现一个五子棋游戏,包括AI算法的运用和悔棋、撤销悔棋功能。游戏基于15*15的棋盘,通过三维数组进行状态跟踪,并通过计算不同赢法的得分来决定AI的落子位置。同时提供了代码资源链接和相关教程参考。
摘要由CSDN通过智能技术生成

AI/普通 实现五子棋html

大二期末,js老师布置实训任务中其中一项:五子棋。
先了解一下五子棋算法慨念吧。
五子棋应该大多数都玩过,人机或两人作战,各执黑白棋子,上下左右,左上,左下,右上,右下等方向若凑齐5颗连成线均为赢。
在网上各大博客中,都有谈到AI来实现算法,用三维数组,这里可以参考百度搜一下来看看。

现在,关键是如何利用这个三维数组,其实很多机器博弈其实就是在打分,再把棋子下到分高(或分低)的地方,比如下红色位置,如果没有棋子,应该 给一个较高分,因为在下一个白棋子就赢了,但是如果下了一个黑棋子,那么,上面的第一种赢法无论如何也不可能了,所以直接设置为零分。所以在设置两个一位数组,记录每种赢法的得分,再查找棋盘上哪些位置可以实现这种赢法,给这些位置加分,最后从所有位置中,找出分最高的落子即可。而且,一种赢法上的落子越多,就越接近获胜,所以分数应该越高。

    // 计算机下棋
    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;
                            }
                        }
                    }
                }
            }
            _compi = u;
            _compj = v;
            oneStep(u, v, false);
            chressBord[u][v] = 2;//计算机占据位置
        for(var k = 0; k < count; k++) {
            if(wins[u][v][k]) {
                computerWin[k]++;
                _myWin[k] = myWin[k];
                myWin[k] = 6; //这个位置对方不可能赢了
                if(computerWin[k] == 5) {
                    resultTxt.innerHTML = '遗憾,计算机赢了,继续加油哦!';
                    over = true;
                }
            }
        }
        if(!over) {
            me = !me;
        }
        backAble = true;
        returnAble = false;
        var hasClass = new RegExp('unable').test(' ' + returnbtn.className + ' ');
        if(!hasClass) {
            returnbtn.className+=' '+'unable';
        }
    }

首先棋盘设定是15*15
赢的方式有572中赢法

//赢法的统计数组
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liumce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值