Sovietlongbow 2021-12-08 22:53 采纳率: 100%
浏览 162
已结题

javascript 实现棋子随机移动

问题遇到的现象和发生背景

img

想使用改变目标格子的class属性的方式来实现两色棋子按顺序移动到随机白色部分内,但以下代码不稳定,无法实现棋子移动到目标位置,然后原位置回到白色状态的期望

问题相关代码,请勿粘贴截图
var pieces = [
    [ 0,-1, 0,-1, 0,-1, 0,-1],
    [-1, 0,-1, 0,-1, 0,-1, 0],
    [ 0,-1, 0,-1, 0,-1, 0,-1],
    [ 0, 0, 0, 0, 0, 0, 0, 0],
    [ 0, 0, 0, 0, 0, 0, 0, 0],
    [ 1, 0, 1, 0, 1, 0, 1, 0],
    [ 0, 1, 0, 1, 0, 1, 0, 1],
    [ 1, 0, 1, 0, 1, 0, 1, 0],
];
var INI = 1;//show that what color can move now
function randomMove() {
    document.getElementById("member3").innerHTML = "MaYiming";
    do {
        var r1=Math.floor(Math.random()*8)
        var c1=Math.floor(Math.random()*8)
        var r2=Math.floor(Math.random()*8)
        var c2=Math.floor(Math.random()*8)
    }
    while
        (pieces[r1][c1] == 0 ||
            pieces[r2][c2] !=0 ||
        (r2 + c2) % 2 == 0 ||
        (pieces[r1][c1] == -1 && INI == 0) ||
        (pieces[r1][c1] == 1 && INI == 1));//if the parameters did not met the requirment, continute until it does
       pieces[r2][c2] = pieces[r1][c1];//movement of the checkers must be noticed in the array
    if 
        (pieces[r1][c1] == 1 && INI == 0) 
        {document.getElementById(getCellID(8, r2, c2)).className = "Bc";INI += 1;pieces[r1][c1] = 0}
    else if 
        (pieces[r1][c1] == -1 && INI == 1) 
        {document.getElementById(getCellID(8, r2, c2)).className = "Rc";INI -=1;}
    pieces[r1][c1] = 0;
    {if ((r1 + c1) % 2 != 0) {document.getElementById(getCellID(8, r1, c1)).className = 'W';}
        else {document.getElementById(getCellID(8, r1, c1)).className = 'B';}
    }
}


td{ text-align: center;width: 100px;height: 100px; border: pink 1px solid;}
.W{background-color: white; }
.B{background-color: darkgrey ; }
.Rc{background-image: url("../image/Rc.jpg"); background-size: cover}
.Bc{background-image: url("../image/Bc.jpg");background-size: cover}
运行结果及报错内容

img


会出现这种。。奇怪的棋子增加了的。。状况,而只有那个突出来的红色棋子是想要的状态

我想要达到的结果

从红色开始,依次移动到随机白色格子内,并且不移动到同色棋子的位置,会吃掉其他颜色的棋子

  • 写回答

2条回答 默认 最新

  • CSDN专家-showbo 2021-12-09 11:23
    关注

    目测题主生成棋盘的时候还是用的上一个问题for循环的开始结束值

    上一个问题行列是从1开始的,8结束。
    而randomMove中行列是从0开始,7结束

    那么如果随机到0位置的棋子,那么生成的id会出错,导致下面获取的dom为null,导致设置样式出错而无法还原

    更改下棋盘for循环的开始结束位置为0~7就没问题了。代码如下

    img

    <style>
    td{ text-align: center;width: 50px;height: 50px; border: pink 1px solid;}
    .W{background-color: white; }
    .B{background-color: darkgrey ; }
    .Rc{background-image: url("r.jpg"); background-size: cover}
    .Bc{background-image: url("b.jpg");background-size: cover}
    </style>
    <div style="width:500px;margin:20px auto">
        <div id="board"></div>
        <div id="member3"></div>
        <input type="button" onclick="randomMove()" value="移动棋子" />
    </div>
    <script>
        var pieces = [
            [0, -1, 0, -1, 0, -1, 0, -1],
            [-1, 0, -1, 0, -1, 0, -1, 0],
            [0, -1, 0, -1, 0, -1, 0, -1],
            [0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0],
            [1, 0, 1, 0, 1, 0, 1, 0],
            [0, 1, 0, 1, 0, 1, 0, 1],
            [1, 0, 1, 0, 1, 0, 1, 0],
        ];
        var INI = 1;//show that what color can move now
        function randomMove() {
            document.getElementById("member3").innerHTML = "MaYiming";
            do {
                var r1 = Math.floor(Math.random() * 8)
                var c1 = Math.floor(Math.random() * 8)
                var r2 = Math.floor(Math.random() * 8)
                var c2 = Math.floor(Math.random() * 8)
            }
            while
                (pieces[r1][c1] == 0 ||
                pieces[r2][c2] != 0 ||
                (r2 + c2) % 2 == 0 ||
                (pieces[r1][c1] == -1 && INI == 0) ||
                (pieces[r1][c1] == 1 && INI == 1));//if the parameters did not met the requirment, continute until it does
    
            pieces[r2][c2] = pieces[r1][c1];//movement of the checkers must be noticed in the array
    
    
            if (pieces[r1][c1] == 1 && INI == 0) { document.getElementById(getCellID(8, r2, c2)).className = "Bc"; INI += 1; pieces[r1][c1] = 0 }
            else if (pieces[r1][c1] == -1 && INI == 1) { document.getElementById(getCellID(8, r2, c2)).className = "Rc"; INI -= 1; }
    
            pieces[r1][c1] = 0;
    
            if ((r1 + c1) % 2 != 0) { document.getElementById(getCellID(8, r1, c1)).className = 'W'; }
            else { document.getElementById(getCellID(8, r1, c1)).className = 'B'; }
    
        }
    
        var i, z = "0";
        var r = "";
        var c = "0";
        var kv = {'-1':'Rc',1:'Bc'}
    
        function drawGameBoard(r, c) {
            var table = document.createElement("table"); table.border = '1'
            for (i=0; i < r; i++) {//////////////////////////////////////////改这里
                var ttr = document.createElement("tr");
                for (z = 0; z < c; z++) {//////////////////////////////////////////改这里
                    var chess = kv[pieces[i ][z]] || '';
                    var ttd = document.createElement("td");
                    if (i % 2) {
                        ttd.className = z % 2 ? 'B' : "W";
                    }
                    else {
                        ttd.className = z % 2 ? 'W' : "B";
                    }
                    ttd.className += ' ' + chess;
                    ttd.id = getCellID(8, i, z);
                    ttr.appendChild(ttd)
                };
                table.appendChild(ttr)
            };
            var board = document.getElementById("board");
            document.getElementById("board").appendChild(table);
        };
        function getCellID(colsPerRow, r, c) { var id = colsPerRow * r + c; return "c" + id; };
        drawGameBoard(8, 8)
    </script>
    
    

    有帮助麻烦点下【采纳该答案】,谢谢~~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月17日
  • 已采纳回答 12月9日
  • 创建了问题 12月8日

悬赏问题

  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥15 想用@vueuse 把项目动态改成深色主题,localStorge里面的vueuse-color-scheme一开始就给我改成了dark,不知道什么原因(相关搜索:背景颜色)
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备
  • ¥100 如何用js写一个游戏云存档
  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题