物理国际象棋每移动一个棋子记录棋盘(PGN),并追踪棋子

weixin_42183831 2019-08-05 10:07:09
一个国际象棋版, 上面有黑方 和 白芳 各 16个棋子, 在棋盘上每举起一个棋子就会在服务器显示log

" payload to sent @@@HH@HHPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0Published go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HHmessage sent"





其中Published 前面的0表示举起,1,表示放下, 再之前的两到四位数表示它的横坐标和纵坐标 比如 3,3 表示a8, 3,5 表示b8 , 3,7 表示c8
5,3 5,5 5,7 表示 a7, b7,c7....list goes on , 每一个框都有对应的数值 (为了理解方便我方一个chess board 的图)


为了用现有的日志翻译出 棋谱我做了个简单的js网页
下面是逻辑代码(可以说是很糟糕,整个思路也是都是错的)
<script type="text/javascript">

//function 点击启动事件
function toC(obj) {
// 获取value
var src = document.getElementById("sentence").value;
var src1 = document.getElementById("output_text");

//截字符
src=src.slice(96,102);
// src=src.substring(src.indexOf( 'payload to sent @@@HH@HHPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray')+95,src.lastIndexOf('Published go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HHmessage sent'))
//转换
src=src.replace (/0/ig, "");
src=src.replace (/1P/ig, "");
src=src.replace (/P/ig, "");
src=src.replace (/P/ig, "");


src=src.replace (/17,3/, "a1");
src=src.replace (/17,5/, "b1");
src=src.replace (/17,7/, "c1");
src=src.replace (/17,9/, "d1");
src=src.replace (/17,11/, "e1");
src=src.replace (/17,13/, "f1");
src=src.replace (/17,15/, "g1");
src=src.replace (/17,17/, "h1");

src=src.replace (/15,3/, "a2");
src=src.replace (/15,5/, "b2");
src=src.replace (/15,7/, "c2");
src=src.replace (/15,9/, "d2");
src=src.replace (/15,11/, "e2");
src=src.replace (/15,13/, "f2");
src=src.replace (/15,15/, "g2");
src=src.replace (/15,17/, "h2");

src=src.replace (/13,3/, "a3");
src=src.replace (/13,5/, "b3");
src=src.replace (/13,7/, "c3");
src=src.replace (/13,9/, "d3");
src=src.replace (/13,11/, "e3");
src=src.replace (/13,13/, "f3");
src=src.replace (/13,15/, "g3");
src=src.replace (/13,17/, "h3");

src=src.replace (/11,3/, "a4");
src=src.replace (/11,5/, "b4");
src=src.replace (/11,7/, "c4");
src=src.replace (/11,9/, "d4");
src=src.replace (/11,11/, "e4");
src=src.replace (/11,13/, "f4");
src=src.replace (/11,15/, "g4");
src=src.replace (/11,17/, "h4");

src=src.replace (/9,3/, "a5");
src=src.replace (/9,5/, "b5");
src=src.replace (/9,7/, "c5");
src=src.replace (/9,9/, "d5");
src=src.replace (/9,11/, "e5");
src=src.replace (/9,13/, "f5");
src=src.replace (/9,15/, "g5");
src=src.replace (/9,17/, "h5");

src=src.replace (/7,3/, "a6");
src=src.replace (/7,5/, "b6");
src=src.replace (/7,7/, "c6");
src=src.replace (/7,9/, "d6");
src=src.replace (/7,11/, "e6");
src=src.replace (/7,13/, "f6");
src=src.replace (/7,15/, "g6");
src=src.replace (/7,17/, "h6");

src=src.replace (/5,3/, "a7");
src=src.replace (/5,5/, "b7");
src=src.replace (/5,7/, "c7");
src=src.replace (/5,9/, "d7");
src=src.replace (/5,11/, "e7");
src=src.replace (/5,13/, "f7");
src=src.replace (/5,15/, "g7");
src=src.replace (/5,17/, "h7");

src=src.replace (/3,3/, "a8");
src=src.replace (/3,5/, "b8");
src=src.replace (/3,7/, "c8");
src=src.replace (/3,9/, "d8");
src=src.replace (/3,11/, "e8");
src=src.replace (/3,13/, "f8");
src=src.replace (/3,15/, "g8");
src=src.replace (/3,17/, "h8");
// ---------------------------------






//显示
document.getElementById("output_text").value += src;
}

function toB(obj){
var get = document.getElementById("sentence").value;
var show= document.getElementById("output_text").value;
// get=get.slice(101,103);

get=get.substring(get.indexOf(',')+3,get.lastIndexOf('P'))


get=get.replace(/0/," )(up");

get=get.replace(/1/,",down");

document.getElementById("output_text").value+=get+"+";
//alert(get);
}



</script>

输入一段日志结果后,输出的结果大概会是: up+f2 down+f4

在f2 举起 在f4 放下

这里的问题是 我不知道利用已有的这些数据后怎么让他知道是哪一个棋子, 比如 如果是pawn 走了两步,按国际pgn 的规则来说这里输出
不应该是up+f2 down+f4, 而是pf4 这里的p 指的是pawn, 并且如果 在f4的这个棋子到别的框之后也需要让它知道这是一个pawn, 每一个棋子都应该知道自己是什么棋子, 用 up 和down 来追踪每一个棋子.

请帮助我,并用代码 谢谢.







...全文
835 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_42183831 2019-08-08
  • 打赏
  • 举报
回复
引用 20 楼 文盲老顾的回复:
[quote=引用 18 楼 weixin_42183831 的回复:] [quote=引用 16 楼 文盲老顾的回复:]第一,由于你的日志记录中不包含棋子信息,所以我们需要自己记录棋子信息,即:
var pieces = [{Rook:[[17,3,1],[17,17,1]],Knight:[[17,5,1],[17,15,1]],Bishop:[[17,7,1],[17,13,1]],Queen:[[17,9,1]],King:[[17,11,1]],Pawn:[[15,3,1],[15,5,1],[15,7,1],[15,9,1],[15,11,1],[15,13,1],[15,15,1],[15,17,1]]},
{Rook:[[3,3,1],[3,17,1]],Knight:[[3,5,1],[3,15,1]],Bishop:[[3,7,1],[3,13,1]],Queen:[[3,9,1]], King:[[3,11,1]],Pawn:[[5,3,1],[5,5,1],[5,7,1],[5,9,1],[5,11,1],[5,13,1],[5,15,1],[5,17,1]]}]
然后,我们需要把棋子移动日志放进来,也就是
// 获得日志数据
var log = 'payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,15,1\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\n';
再然后,我们根据棋子举起动作获得棋子信息,根据落子动作更新棋子位置及是否被杀,所以有了
        for(var x=0;x<pieces.length;x++){
            // 循环匹配各类棋子信息
            for(var y in pieces[x]){
                // 循环匹配每个棋子的位置信息
                for(var z=0;z<pieces[x][y].length;z++){
                    // 如果位置信息匹配成功,则获得棋子信息
                    if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][1]==1)
                    {
                        // 输出信息中追加棋子名称
                        out+=(x==0?'黑':'白')+y;
                        // 获得棋子信息
                        piece = {x:x,y:y,z:z};
                        break;
                    }
                }
                // 如果已匹配到棋子跳出循环
                if (piece)
                {
                    break;
                }
            }
           // 如果已匹配到棋子跳出循环
               if (piece)
            {
                break;
                }
            }
那么问题就出在这里了,如果给出的日志记录不是从第一步开始的,那么在匹配棋子位置时,必定会出现部分棋子信息不匹配的现象 例如本段代码中Published go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0 棋子的位置在 11,17 举起,但是我们初始化的棋子位置中没有对应的棋子,所以找不到对应的棋子,那么后边就全部出错了 所以,一定要用第一步开始的日志
那请问 报错的 x of null 是什么原因呢, 我在var log 里面添日志的时候可以两三个一起添吗还是需要一个一个来解读, 还有请看一下我去掉的out+=的部分是否正确 是不是因为那个才在报错, 现在我是这样的, 第一个log 谢了17,3,0 因为他初始是1(放下) 拿上也就是第一个步 就会是0 第二个 是15,3,1 走了两步 但是我这样写完再alert (piece )或 alert(out)什么都没有并且报错说property x of null 不知您是否有在您的电脑上测试过[/quote] 17楼代码我测试过了,黑方自己杀自己棋子了,嘿嘿[/quote] 我要哭了怎么会有像您这样的好人, 我好高兴, 谢谢您, 这对我来说非常重要的一个代码
文盲老顾 2019-08-08
  • 打赏
  • 举报
回复
Published go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0 如果这中间的 1068652 是棋局号,那么多个日志自己分离好即可
文盲老顾 2019-08-08
  • 打赏
  • 举报
回复
引用 21 楼 weixin_42183831 的回复:
哈哈哈这个没有关系,规则是自己决定的,只需要记录就好啦, 请问您是怎么测试的呀,我这边不知道咋弄
使用17楼的定义,然后
var log = 'payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 15,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 13,17,1\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\n';
log+='payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 5,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 7,15,1\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\n';
alert(parseLog(log))
文盲老顾 2019-08-08
  • 打赏
  • 举报
回复
日志的话,每一盘是一个,不管多少步,但如果是多个棋局的话,每个棋局需要单独处理
weixin_42183831 2019-08-08
  • 打赏
  • 举报
回复
引用 20 楼 文盲老顾的回复:
[quote=引用 18 楼 weixin_42183831 的回复:] [quote=引用 16 楼 文盲老顾的回复:]第一,由于你的日志记录中不包含棋子信息,所以我们需要自己记录棋子信息,即:
var pieces = [{Rook:[[17,3,1],[17,17,1]],Knight:[[17,5,1],[17,15,1]],Bishop:[[17,7,1],[17,13,1]],Queen:[[17,9,1]],King:[[17,11,1]],Pawn:[[15,3,1],[15,5,1],[15,7,1],[15,9,1],[15,11,1],[15,13,1],[15,15,1],[15,17,1]]},
{Rook:[[3,3,1],[3,17,1]],Knight:[[3,5,1],[3,15,1]],Bishop:[[3,7,1],[3,13,1]],Queen:[[3,9,1]], King:[[3,11,1]],Pawn:[[5,3,1],[5,5,1],[5,7,1],[5,9,1],[5,11,1],[5,13,1],[5,15,1],[5,17,1]]}]
然后,我们需要把棋子移动日志放进来,也就是
// 获得日志数据
var log = 'payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,15,1\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\n';
再然后,我们根据棋子举起动作获得棋子信息,根据落子动作更新棋子位置及是否被杀,所以有了
        for(var x=0;x<pieces.length;x++){
            // 循环匹配各类棋子信息
            for(var y in pieces[x]){
                // 循环匹配每个棋子的位置信息
                for(var z=0;z<pieces[x][y].length;z++){
                    // 如果位置信息匹配成功,则获得棋子信息
                    if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][1]==1)
                    {
                        // 输出信息中追加棋子名称
                        out+=(x==0?'黑':'白')+y;
                        // 获得棋子信息
                        piece = {x:x,y:y,z:z};
                        break;
                    }
                }
                // 如果已匹配到棋子跳出循环
                if (piece)
                {
                    break;
                }
            }
           // 如果已匹配到棋子跳出循环
               if (piece)
            {
                break;
                }
            }
那么问题就出在这里了,如果给出的日志记录不是从第一步开始的,那么在匹配棋子位置时,必定会出现部分棋子信息不匹配的现象 例如本段代码中Published go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0 棋子的位置在 11,17 举起,但是我们初始化的棋子位置中没有对应的棋子,所以找不到对应的棋子,那么后边就全部出错了 所以,一定要用第一步开始的日志
那请问 报错的 x of null 是什么原因呢, 我在var log 里面添日志的时候可以两三个一起添吗还是需要一个一个来解读, 还有请看一下我去掉的out+=的部分是否正确 是不是因为那个才在报错, 现在我是这样的, 第一个log 谢了17,3,0 因为他初始是1(放下) 拿上也就是第一个步 就会是0 第二个 是15,3,1 走了两步 但是我这样写完再alert (piece )或 alert(out)什么都没有并且报错说property x of null 不知您是否有在您的电脑上测试过[/quote] 17楼代码我测试过了,黑方自己杀自己棋子了,嘿嘿[/quote] 哈哈哈这个没有关系,规则是自己决定的,只需要记录就好啦, 请问您是怎么测试的呀,我这边不知道咋弄
文盲老顾 2019-08-08
  • 打赏
  • 举报
回复
引用 18 楼 weixin_42183831 的回复:
[quote=引用 16 楼 文盲老顾的回复:]第一,由于你的日志记录中不包含棋子信息,所以我们需要自己记录棋子信息,即:
var pieces = [{Rook:[[17,3,1],[17,17,1]],Knight:[[17,5,1],[17,15,1]],Bishop:[[17,7,1],[17,13,1]],Queen:[[17,9,1]],King:[[17,11,1]],Pawn:[[15,3,1],[15,5,1],[15,7,1],[15,9,1],[15,11,1],[15,13,1],[15,15,1],[15,17,1]]},
{Rook:[[3,3,1],[3,17,1]],Knight:[[3,5,1],[3,15,1]],Bishop:[[3,7,1],[3,13,1]],Queen:[[3,9,1]], King:[[3,11,1]],Pawn:[[5,3,1],[5,5,1],[5,7,1],[5,9,1],[5,11,1],[5,13,1],[5,15,1],[5,17,1]]}]
然后,我们需要把棋子移动日志放进来,也就是
// 获得日志数据
var log = 'payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,15,1\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\n';
再然后,我们根据棋子举起动作获得棋子信息,根据落子动作更新棋子位置及是否被杀,所以有了
        for(var x=0;x<pieces.length;x++){
            // 循环匹配各类棋子信息
            for(var y in pieces[x]){
                // 循环匹配每个棋子的位置信息
                for(var z=0;z<pieces[x][y].length;z++){
                    // 如果位置信息匹配成功,则获得棋子信息
                    if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][1]==1)
                    {
                        // 输出信息中追加棋子名称
                        out+=(x==0?'黑':'白')+y;
                        // 获得棋子信息
                        piece = {x:x,y:y,z:z};
                        break;
                    }
                }
                // 如果已匹配到棋子跳出循环
                if (piece)
                {
                    break;
                }
            }
           // 如果已匹配到棋子跳出循环
               if (piece)
            {
                break;
                }
            }
那么问题就出在这里了,如果给出的日志记录不是从第一步开始的,那么在匹配棋子位置时,必定会出现部分棋子信息不匹配的现象 例如本段代码中Published go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0 棋子的位置在 11,17 举起,但是我们初始化的棋子位置中没有对应的棋子,所以找不到对应的棋子,那么后边就全部出错了 所以,一定要用第一步开始的日志
那请问 报错的 x of null 是什么原因呢, 我在var log 里面添日志的时候可以两三个一起添吗还是需要一个一个来解读, 还有请看一下我去掉的out+=的部分是否正确 是不是因为那个才在报错, 现在我是这样的, 第一个log 谢了17,3,0 因为他初始是1(放下) 拿上也就是第一个步 就会是0 第二个 是15,3,1 走了两步 但是我这样写完再alert (piece )或 alert(out)什么都没有并且报错说property x of null 不知您是否有在您的电脑上测试过[/quote] 17楼代码我测试过了,黑方自己杀自己棋子了,嘿嘿
文盲老顾 2019-08-08
  • 打赏
  • 举报
回复
最后,就是复盘的话,直接将所有步骤计算好并输出 然后,点击到某一步时棋盘各棋子的位置,有两种办法实现 1、从新计算日志,并到指定的步数结束 2、在每次移动棋子时,整盘记录棋子信息,并存入数组 这个根据需要自己实现即可
weixin_42183831 2019-08-08
  • 打赏
  • 举报
回复
引用 16 楼 文盲老顾的回复:
第一,由于你的日志记录中不包含棋子信息,所以我们需要自己记录棋子信息,即:
var pieces = [{Rook:[[17,3,1],[17,17,1]],Knight:[[17,5,1],[17,15,1]],Bishop:[[17,7,1],[17,13,1]],Queen:[[17,9,1]],King:[[17,11,1]],Pawn:[[15,3,1],[15,5,1],[15,7,1],[15,9,1],[15,11,1],[15,13,1],[15,15,1],[15,17,1]]},
{Rook:[[3,3,1],[3,17,1]],Knight:[[3,5,1],[3,15,1]],Bishop:[[3,7,1],[3,13,1]],Queen:[[3,9,1]], King:[[3,11,1]],Pawn:[[5,3,1],[5,5,1],[5,7,1],[5,9,1],[5,11,1],[5,13,1],[5,15,1],[5,17,1]]}]
然后,我们需要把棋子移动日志放进来,也就是
// 获得日志数据
var log = 'payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,15,1\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\n';
再然后,我们根据棋子举起动作获得棋子信息,根据落子动作更新棋子位置及是否被杀,所以有了
        for(var x=0;x<pieces.length;x++){
            // 循环匹配各类棋子信息
            for(var y in pieces[x]){
                // 循环匹配每个棋子的位置信息
                for(var z=0;z<pieces[x][y].length;z++){
                    // 如果位置信息匹配成功,则获得棋子信息
                    if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][1]==1)
                    {
                        // 输出信息中追加棋子名称
                        out+=(x==0?'黑':'白')+y;
                        // 获得棋子信息
                        piece = {x:x,y:y,z:z};
                        break;
                    }
                }
                // 如果已匹配到棋子跳出循环
                if (piece)
                {
                    break;
                }
            }
           // 如果已匹配到棋子跳出循环
               if (piece)
            {
                break;
                }
            }
那么问题就出在这里了,如果给出的日志记录不是从第一步开始的,那么在匹配棋子位置时,必定会出现部分棋子信息不匹配的现象 例如本段代码中Published go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0 棋子的位置在 11,17 举起,但是我们初始化的棋子位置中没有对应的棋子,所以找不到对应的棋子,那么后边就全部出错了 所以,一定要用第一步开始的日志
那请问 报错的 x of null 是什么原因呢, 我在var log 里面添日志的时候可以两三个一起添吗还是需要一个一个来解读, 还有请看一下我去掉的out+=的部分是否正确 是不是因为那个才在报错, 现在我是这样的, 第一个log 谢了17,3,0 因为他初始是1(放下) 拿上也就是第一个步 就会是0 第二个 是15,3,1 走了两步 但是我这样写完再alert (piece )或 alert(out)什么都没有并且报错说property x of null 不知您是否有在您的电脑上测试过
weixin_42183831 2019-08-08
  • 打赏
  • 举报
回复
引用 10 楼 文盲老顾的回复:
不能直接使用,落子时的输出有问题,out+=那个要删除,我直接复制的,没注意 另外,你最好复制一个完整的日志测试一下
有三个地方有out+=........ 那我把out+=去掉了, 还有就是 该怎么获取日志啊 日志在服务器里边,我需要提出吗还是直接放到gitlab 里面就会自己执行了, 如果需要用ajax 提出的话 请可以给我写下代码吗 谢谢
文盲老顾 2019-08-08
  • 打赏
  • 举报
回复
// 日志作为参数传递进来
function parseLog(log){
	// 初始化输出信息
	var out = '';
	// 初始化x轴坐标名
	var xx = {3:'a',5:'b',7:'c',9:'d',11:'e',13:'f',15:'g',17:'h'}
	// 初始化y轴坐标名
	var yy = {3:8,5:7,7:6,9:5,11:4,13:3,15:2,17:1}
	// 初始化棋盘棋子坐标,并分组白方和黑方
	var pieces = [{Rook:[[17,3,1],[17,17,1]],Knight:[[17,5,1],[17,15,1]],Bishop:[[17,7,1],[17,13,1]],Queen:[[17,9,1]],King:[[17,11,1]],Pawn:[[15,3,1],[15,5,1],[15,7,1],[15,9,1],[15,11,1],[15,13,1],[15,15,1],[15,17,1]]},
	{Rook:[[3,3,1],[3,17,1]],Knight:[[3,5,1],[3,15,1]],Bishop:[[3,7,1],[3,13,1]],Queen:[[3,9,1]], King:[[3,11,1]],Pawn:[[5,3,1],[5,5,1],[5,7,1],[5,9,1],[5,11,1],[5,13,1],[5,15,1],[5,17,1]]}]
	// 使用正则拆分日志的棋子移动记录
	var stp = log.match(/payload[\s\S]*?message sent/gi);
	// 声明一个用来存放当前棋子信息的变量
	var piece=null;
	// 循环,分析每一步棋子移动细节
	for (var i=0;i<stp.length;i++){
		// 分析每步的坐标
		var c = /payload to sent (.*)[\r\n]+.*?bytearray \d+ (\d+,\d+,\d+)/gi.exec(stp[i])
		// 拆分坐标和状态
		var l = c[2].split(',');
		// 如果状态为举起棋子,获得棋子名称
		if (parseInt(l[2])==0)
		{
			// 循环匹配两方棋子信息
			for(var x=0;x<pieces.length;x++){
				// 循环匹配各类棋子信息
				for(var y in pieces[x]){
					// 循环匹配每个棋子的位置信息
					for(var z=0;z<pieces[x][y].length;z++){
						//document.getElementById('ot').value+='\n'+x+','+y+','+z+':'+pieces[x][y][z][0]+','+pieces[x][y][z][1];
						// 如果位置信息匹配成功,则获得棋子信息
						if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][2]==1)
						{
							// 输出信息中追加棋子名称
							out+=(x==0?'黑':'白')+y;
							// 获得棋子信息
							piece = {x:x,y:y,z:z};
							break;
						}
					}
					// 如果已匹配到棋子跳出循环
					if (piece)
					{
						break;
					}
				}
				// 如果已匹配到棋子跳出循环
				if (piece)
				{
					break;
				}
			}
			if (!piece)
			{
				alert('未找到指定坐标的棋子信息,日志分析结束');
				return out;
			}
		}else{
			var kill = null;
			// 循环匹配两方棋子信息
			for(var x=0;x<pieces.length;x++){
				// 循环匹配各类棋子信息
				for(var y in pieces[x]){
					// 循环匹配每个棋子的位置信息
					for(var z=0;z<pieces[x][y].length;z++){
						// 如果位置信息匹配成功,则获得落子位置原有棋子信息,该棋子需要将状态修改为被杀
						if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][2]==1)
						{
							// 获得落子位置原有棋子信息
							kill = {x:x,y:y,z:z};
							break;
						}
					}
					// 如果已匹配到棋子跳出循环
					if (kill)
					{
						break;
					}
				}
				if (kill)
				{
					break;
				}
			}
			if (kill)
			{
				// 修改被杀棋子的状态
				pieces[kill.x][kill.y][kill.z][2]=0;
			}
			// 输出信息追加移动位置信息
			out+=':'+xx[l[1]]+yy[l[0]]+'\n';
			// 更新棋子的落子位置信息
			pieces[piece.x][piece.y][piece.z][0]=parseInt(l[0]);
			pieces[piece.x][piece.y][piece.z][1]=parseInt(l[1]);
			// 当前棋子信息清除
			piece=null;
		}
	}
	return out; 
}
alert(parseLog('payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 15,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 15,15,1\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\n'))
之前匹配位置和状态有点小问题 if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][2]==1)
文盲老顾 2019-08-08
  • 打赏
  • 举报
回复
第一,由于你的日志记录中不包含棋子信息,所以我们需要自己记录棋子信息,即:
var pieces = [{Rook:[[17,3,1],[17,17,1]],Knight:[[17,5,1],[17,15,1]],Bishop:[[17,7,1],[17,13,1]],Queen:[[17,9,1]],King:[[17,11,1]],Pawn:[[15,3,1],[15,5,1],[15,7,1],[15,9,1],[15,11,1],[15,13,1],[15,15,1],[15,17,1]]},
{Rook:[[3,3,1],[3,17,1]],Knight:[[3,5,1],[3,15,1]],Bishop:[[3,7,1],[3,13,1]],Queen:[[3,9,1]], King:[[3,11,1]],Pawn:[[5,3,1],[5,5,1],[5,7,1],[5,9,1],[5,11,1],[5,13,1],[5,15,1],[5,17,1]]}]
然后,我们需要把棋子移动日志放进来,也就是
// 获得日志数据
var log = 'payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,15,1\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\n';
再然后,我们根据棋子举起动作获得棋子信息,根据落子动作更新棋子位置及是否被杀,所以有了
        for(var x=0;x<pieces.length;x++){
            // 循环匹配各类棋子信息
            for(var y in pieces[x]){
                // 循环匹配每个棋子的位置信息
                for(var z=0;z<pieces[x][y].length;z++){
                    // 如果位置信息匹配成功,则获得棋子信息
                    if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][1]==1)
                    {
                        // 输出信息中追加棋子名称
                        out+=(x==0?'黑':'白')+y;
                        // 获得棋子信息
                        piece = {x:x,y:y,z:z};
                        break;
                    }
                }
                // 如果已匹配到棋子跳出循环
                if (piece)
                {
                    break;
                }
            }
           // 如果已匹配到棋子跳出循环
               if (piece)
            {
                break;
                }
            }
那么问题就出在这里了,如果给出的日志记录不是从第一步开始的,那么在匹配棋子位置时,必定会出现部分棋子信息不匹配的现象 例如本段代码中Published go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0 棋子的位置在 11,17 举起,但是我们初始化的棋子位置中没有对应的棋子,所以找不到对应的棋子,那么后边就全部出错了 所以,一定要用第一步开始的日志
weixin_42183831 2019-08-08
  • 打赏
  • 举报
回复
<script type="text/javascript">
       
	// 初始化输出信息

	var out = '';

// 初始化x轴坐标名

var xx = {3:'a',5:'b',7:'c',9:'d',11:'e',13:'f',15:'g',17:'h'}

// 初始化y轴坐标名

var yy = {3:8,5:7,7:6,9:5,11:4,13:3,15:2,17:1}


// 初始化棋盘棋子坐标,并分组白方和黑方

var pieces = [{Rook:[[17,3,1],[17,17,1]],Knight:[[17,5,1],[17,15,1]],Bishop:[[17,7,1],[17,13,1]],Queen:[[17,9,1]],King:[[17,11,1]],Pawn:[[15,3,1],[15,5,1],[15,7,1],[15,9,1],[15,11,1],[15,13,1],[15,15,1],[15,17,1]]},
{Rook:[[3,3,1],[3,17,1]],Knight:[[3,5,1],[3,15,1]],Bishop:[[3,7,1],[3,13,1]],Queen:[[3,9,1]], King:[[3,11,1]],Pawn:[[5,3,1],[5,5,1],[5,7,1],[5,9,1],[5,11,1],[5,13,1],[5,15,1],[5,17,1]]}]

// 获得日志数据
var log = 'payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,15,1\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\n';

// 使用正则拆分日志的棋子移动记录

var stp = log.match(/payload[\s\S]*?message sent/gi);



// 声明一个用来存放当前棋子信息的变量

var piece=null;

// 循环,分析每一步棋子移动细节

for (var i=0;i<stp.length;i++){

    // 分析每步的坐标
    var c = /payload to sent (.*)[\r\n]+.*?bytearray \d+ (\d+,\d+,\d+)/gi.exec(stp[i])
    // 拆分坐标和状态
   
    var l = c[2].split(',');
    // 如果状态为举起棋子,获得棋子名称
   
   
    if (parseInt(l[2])==0)
    {
        // 循环匹配两方棋子信息
        for(var x=0;x<pieces.length;x++){
            // 循环匹配各类棋子信息
            for(var y in pieces[x]){
                // 循环匹配每个棋子的位置信息
                for(var z=0;z<pieces[x][y].length;z++){
                    // 如果位置信息匹配成功,则获得棋子信息
                    if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][1]==1)
                    {
                        // 输出信息中追加棋子名称
                        out+=(x==0?'黑':'白')+y;
                        // 获得棋子信息
                        piece = {x:x,y:y,z:z};
                     
                        break;
                        
                    }
                }
              
               
                // 如果已匹配到棋子跳出循环
                if (piece)
                {
                    break;
                }
            }
            
           // 如果已匹配到棋子跳出循环
               if (piece)
            {
                break;
                }
            }
            alert(piece);

    }else{

        var kill = null;
        // 循环匹配两方棋子信息
        for(var x=0;x<pieces.length;x++){
            // 循环匹配各类棋子信息
            for(var y in pieces[x]){
                // 循环匹配每个棋子的位置信息
                for(var z=0;z<pieces[x][y].length;z++){
                    // 如果位置信息匹配成功,则获得落子位置原有棋子信息,该棋子需要将状态修改为被杀
                    if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][1]==1)
                    {
                        // 输出信息中追加棋子名称
                    (x==0?'黑':'白')+y;
                        // 获得落子位置原有棋子信息
                        kill = {x:x,y:y,z:z};
                        break;
                    }
                }
                // 如果已匹配到棋子跳出循环
                if (kill)
                {
                    break;
                }
            }
            if (kill)
            {
                break;
            }
        }
        if (kill)
        {
            // 修改被杀棋子的状态
            pieces[kill.x][kill.y][kill.z][2]=0;
        }
        // 输出信息追加移动位置信息
        //xx[l[1]]+yy[l[0]]+'\n';
        // 更新棋子的落子位置信息
      pieces[piece.x][piece.y][piece.z][0]=parseInt(l[0]);

       pieces[piece.x][piece.y][piece.z][1]=parseInt(l[1]);
        // 当前棋子信息清除
        piece=null;

    }

}

console.log(out);
    </script>
我用了alert 来测了一下,(因为没有显示console.log) 我在最后测试alert(out) 没有任何数据, 我把log 里的 0 (up) 这个改成 1 的时候就出错了, 不知道是什么原因 还是说这个不应该这样测试. 这个样子; 每一条log 长这样 payload to sent @@@HH@HH Published go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0 Published go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH message sent 放下就会是 payload to sent @@@HH@HH Published go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,1 Published go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH message sent 需要更多log 的话只需要随便吧 位置的数字给换一下就行, 还有一个是 棋子的默认值的时候,比如刚开机的时候每个棋子会在他的自己的位置,这个时候它不应该显示位置信息的, (不知道现在是不是那样) 为了更好的理解我在做的东西 请看一下这个链接https://mp.weixin.qq.com/s/yCpotFn0RqP88vLBR5F_Pw 我不需要做那种用图片显示出来的,我需要做的只是把他的坐标给记录下来, 按旁边黑色块儿的那种格式把每一步记录下来, 玩家会走动真实的棋盘 然后就有个页面会显示他走的步. 大概就是这个意思, 谢谢您肯帮我, 这个对我来说太重要了, 做不好很可能会失去工作 所以非常感谢您,麻烦您帮我看看 谢谢
文盲老顾 2019-08-08
  • 打赏
  • 举报
回复
把测试用的日志整个粘贴上来,或者放到网络上弄个可访问的链接 把你修改后的代码整个放上来,然后把出错的提示也贴上来,这没头没脑的怎么猜
weixin_42183831 2019-08-08
  • 打赏
  • 举报
回复
对不起我又要麻烦您了, 因为我不知道还有谁像您这样这么清楚的知道我在做什么, 我把代码发给我的boss之后他说 "我: mqtt那个项目的代码很简单,你不明白应该早些问我,这就是为什么我让你可以直接改,直接部署到服务器,因为你可以control everything,而不是写log parser去parse 我们自己的log 我: 每个棋盘有个boardid,对应每个棋盘,所以每个棋盘需要有一个初始状态,从初始状态开始,每个move都记录下来,随时能够知道board处于哪个局面 mqttServer.ts 那些log 是从这里print 出来的, 找到入口把每个棋盘的状态装到一个object 里,初始状态的所有棋子都在初始位置, 开始下棋以后每一个棋盘都可以随时获取当前的位置信息,下一步该谁走, 每个棋盘都应该有一个object, 每个棋盘进来就可以获得这个棋盘之前的状态,包括 他之前走了多少步, 每一步的逻辑是什么,相当于每进来的时候他能够合法的走的步有哪些, 然后由此判断被放下的棋子是哪个棋子,拿起来的又是哪一个棋子" 上面是他的原话, 我觉得您帮我做的已经大部分是他这个意思了, 但是他想在哪个项目里面修改 这是代码请看一下:
      
import mosca from 'mosca';
import redis from 'redis';
// import { inspect } from 'util';
import {
  redisConfig,
  port,
} from './config';
import {
  oneCell,
  ab2Str
} from './board';

var ascoltatore = {
  type: 'redis',
  redis: redis,
  db: 12,
  port: redisConfig.port,
  return_buffers: true, // to handle binary payloads
  host: redisConfig.host
};

var moscaSettings = {
  port: port,
  backend: ascoltatore,
  persistence: {
    factory: mosca.persistence.Redis
  }
};

// send status control
export const getStatusMessage = (boardId, payload, qos, retain) => {
  const statusArr = payload.split(';');
  const buf = new ArrayBuffer(statusArr.length * 2);
  const bufView = new Uint8Array(buf);
  for (let i = 0; i < statusArr.length; i++) {
    const statusIndicateInfo = statusArr[i];
    const infoArr = statusIndicateInfo.split(',').map(Number);
    const [indexIndicater, state] = infoArr;
    bufView[i * 2 + 0] = indexIndicater;
    bufView[i * 2 + 1] = state;
  }
  const message = {
    topic: `go-iot/type/go9/board/${boardId}/cmd/statuscontrol/fmt/bytearray`,
    payload: ab2Str(bufView),
    qos: qos || 1, // 0, 1, or 2
    retain: retain || false // or true
  }
  return message
}

export const getLedMessage = (boardId, payload, qos, retain) => {
  const ledArr = payload.split(';');
  const buf = new ArrayBuffer(ledArr.length * 2);
  const bufView = new Uint8Array(buf);
  for (let i = 0; i < ledArr.length; i++) {
    const ledInfo = ledArr[i];
    const infoArr = ledInfo.split(',').map(Number);
    const [cord_x, color, cord_y, state] = infoArr;
    bufView[i * 2 + 0] = cord_x * 4 + color;
    bufView[i * 2 + 1] = cord_y * 4 + state;
  }
  return {
    topic: `go-iot/type/go9/board/${boardId}/cmd/ledcontrol/fmt/bytearray`,
    payload: ab2Str(bufView),
    qos: qos || 1, // 0, 1, or 2
    retain: retain || false // or true
  }
}


export const syncPublish = async (server, message) => {
  return new Promise((resolve) => {
    server.publish(message, function () {
      resolve()
    })
  })
}

const initMqtt = (setup) => {
  var mqttServer = new mosca.Server(moscaSettings);
  mqttServer.on('ready', setup);

  mqttServer.on('clientConnected', function (client) {
    console.log('client connected', client.id);
  });

  // fired when a message is received
  mqttServer.on('published', function (packet, client) {
    // console.log('got packet', inspect(packet), 'got client', inspect(client));
    let toPrint = packet.payload;
    if (typeof packet.payload !== 'string' && packet.payload.length > 0) {
      toPrint = packet.payload.join(',');
      if (packet.topic.indexOf('stonechange') > -1) {
        let posx = packet.payload[0];
        let posy = packet.payload[1];
        let isDown = packet.payload[2];
        if (posx >= 3 && posx <= 17 && posx % 2 === 1 && posy >= 3 && posy <= 17 && posy % 2 === 1) {
          let payloadToSend = String.fromCharCode.apply(null, oneCell(posx, posy, isDown));
          console.log('payload to sent', payloadToSend);
          let clientId = client.id || '1068652';
          if (!client.id) console.log('somehow no client.id available');
          let message = {
            topic: `go-iot/type/go9/board/${clientId}/cmd/ledcontrol/fmt/bytearray`,
            payload: payloadToSend,
            qos: 1,
            retain: false
          };
          mqttServer.publish(message, function () { console.log('message sent') });
        }
      }
    }
    console.log('Published', packet.topic, packet.payload.length, toPrint);
    //console.log('test',payload.length,toPrint);
    
  });
  return mqttServer;
}

// // fired when the mqtt server is ready
// function setup() {
//   console.log('Mosca server is up and running at port: ' + port)
// }

// export server
export default initMqtt;



 
这是gitlab 上面的项目,我只需要在这个上面做出改变我的代码就会自动运行了, 请帮我最后一次, 非常感谢!!!!!!!
weixin_42183831 2019-08-08
  • 打赏
  • 举报
回复
引用 11 楼 weixin_42183831的回复:
[quote=引用 10 楼 文盲老顾的回复:]不能直接使用,落子时的输出有问题,out+=那个要删除,我直接复制的,没注意 另外,你最好复制一个完整的日志测试一下
有三个地方有out+=........ 那我把out+=去掉了, 还有就是 该怎么获取日志啊 日志在服务器里边,我需要提出吗还是直接放到gitlab 里面就会自己执行了, 如果需要用ajax 提出的话 请可以给我写下代码吗 谢谢[/quote] 就是我 把日志上的17,17,0 改成1的时候
weixin_42183831 2019-08-08
  • 打赏
  • 举报
回复
不好意思,其实不需要ajax 的上传流程了我可以直接上传到gitlab 上会自己运行, 我测了一下这个代码 然后出了一些报错, 不知道这个是什么原因
weixin_42183831 2019-08-08
  • 打赏
  • 举报
回复
引用 20 楼 文盲老顾的回复:
[quote=引用 18 楼 weixin_42183831 的回复:] [quote=引用 16 楼 文盲老顾的回复:]第一,由于你的日志记录中不包含棋子信息,所以我们需要自己记录棋子信息,即:
var pieces = [{Rook:[[17,3,1],[17,17,1]],Knight:[[17,5,1],[17,15,1]],Bishop:[[17,7,1],[17,13,1]],Queen:[[17,9,1]],King:[[17,11,1]],Pawn:[[15,3,1],[15,5,1],[15,7,1],[15,9,1],[15,11,1],[15,13,1],[15,15,1],[15,17,1]]},
{Rook:[[3,3,1],[3,17,1]],Knight:[[3,5,1],[3,15,1]],Bishop:[[3,7,1],[3,13,1]],Queen:[[3,9,1]], King:[[3,11,1]],Pawn:[[5,3,1],[5,5,1],[5,7,1],[5,9,1],[5,11,1],[5,13,1],[5,15,1],[5,17,1]]}]
然后,我们需要把棋子移动日志放进来,也就是
// 获得日志数据
var log = 'payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,15,1\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\n';
再然后,我们根据棋子举起动作获得棋子信息,根据落子动作更新棋子位置及是否被杀,所以有了
        for(var x=0;x<pieces.length;x++){
            // 循环匹配各类棋子信息
            for(var y in pieces[x]){
                // 循环匹配每个棋子的位置信息
                for(var z=0;z<pieces[x][y].length;z++){
                    // 如果位置信息匹配成功,则获得棋子信息
                    if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][1]==1)
                    {
                        // 输出信息中追加棋子名称
                        out+=(x==0?'黑':'白')+y;
                        // 获得棋子信息
                        piece = {x:x,y:y,z:z};
                        break;
                    }
                }
                // 如果已匹配到棋子跳出循环
                if (piece)
                {
                    break;
                }
            }
           // 如果已匹配到棋子跳出循环
               if (piece)
            {
                break;
                }
            }
那么问题就出在这里了,如果给出的日志记录不是从第一步开始的,那么在匹配棋子位置时,必定会出现部分棋子信息不匹配的现象 例如本段代码中Published go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0 棋子的位置在 11,17 举起,但是我们初始化的棋子位置中没有对应的棋子,所以找不到对应的棋子,那么后边就全部出错了 所以,一定要用第一步开始的日志
那请问 报错的 x of null 是什么原因呢, 我在var log 里面添日志的时候可以两三个一起添吗还是需要一个一个来解读, 还有请看一下我去掉的out+=的部分是否正确 是不是因为那个才在报错, 现在我是这样的, 第一个log 谢了17,3,0 因为他初始是1(放下) 拿上也就是第一个步 就会是0 第二个 是15,3,1 走了两步 但是我这样写完再alert (piece )或 alert(out)什么都没有并且报错说property x of null 不知您是否有在您的电脑上测试过[/quote] 17楼代码我测试过了,黑方自己杀自己棋子了,嘿嘿[/quote] 我的boss说我从头到尾都没有了解情况 alhazar0328 可以+我wx吗 🙏🙏🙏
文盲老顾 2019-08-07
  • 打赏
  • 举报
回复
还有就是,这个js对日志的处理,是从上到下的处理,也就是说,第一手应该是第一条日志
文盲老顾 2019-08-07
  • 打赏
  • 举报
回复
这个只是翻译日志成为可读模式,没有具体检测规则,比如是否可以杀自己的棋子,移动方式是否规范等
文盲老顾 2019-08-07
  • 打赏
  • 举报
回复
	// 初始化输出信息
	var out = '';
	// 初始化x轴坐标名
	var xx = {3:'a',5:'b',7:'c',9:'d',11:'e',13:'f',15:'g',17:'h'}
	// 初始化y轴坐标名
	var yy = {3:8,5:7,7:6,9:5,11:4,13:3,15:2,17:1}
	// 初始化棋盘棋子坐标,并分组红方和黑方
	var pieces = [{车:[[17,3,1],[17,17,1]],马:[[17,5,1],[17,15,1]],....},{车:[[3,3,1],[3,17,1]],马:[[3,5,1],[3,15,1]],....兵:[[5,3,1],[5,5,1],[5,7,1],[5,9,1],[5,11,1],[5,13,1],[5,15,1],[5,17,1]]}]
	// 获得日志数据
	var log = 'payload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent\npayload to sent @@@HH@HH\nPublished go-iot/type/go9/board/1068652/evt/stonechange/fmt/bytearray 3 11,17,0\nPublished go-iot/type/go9/board/1068652/cmd/ledcontrol/fmt/bytearray 8 @@@HH@HH\nmessage sent';
	// 使用正则拆分日志的棋子移动记录
	var stp = log.match(/payload[\s\S]*?message sent/gi);
	// 声明一个用来存放当前棋子信息的变量
	var piece=null;
	// 循环,分析每一步棋子移动细节
	for (var i=0;i<stp.length;i++){
		// 分析每步的坐标
		var c = /payload to sent (.*)[\r\n]+.*?bytearray \d+ (\d+,\d+,\d+)/gi.exec(stp[i])
		// 拆分坐标和状态
		var l = c[2].split(',');
		// 如果状态为举起棋子,获得棋子名称
		if (parseInt(l[2])==0)
		{
			// 循环匹配两方棋子信息
			for(var x=0;x<pieces.length;x++){
				// 循环匹配各类棋子信息
				for(var y in pieces[x]){
					// 循环匹配每个棋子的位置信息
					for(var z=0;z<pieces[x][y].length;z++){
						// 如果位置信息匹配成功,则获得棋子信息
						if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][1]==1)
						{
							// 输出信息中追加棋子名称
							out+=(x==0?'黑':'红')+y;
							// 获得棋子信息
							piece = {x:x,y:y,z:z};
							break;
						}
					}
					// 如果已匹配到棋子跳出循环
					if (piece)
					{
						break;
					}
				}
				if (piece)
				{
					break;
				}
			}
		}else{
			var kill = null;
			// 循环匹配两方棋子信息
			for(var x=0;x<pieces.length;x++){
				// 循环匹配各类棋子信息
				for(var y in pieces[x]){
					// 循环匹配每个棋子的位置信息
					for(var z=0;z<pieces[x][y].length;z++){
						// 如果位置信息匹配成功,则获得落子位置原有棋子信息,该棋子需要将状态修改为被杀
						if (parseInt(l[0])==pieces[x][y][z][0]&&parseInt(l[1])==pieces[x][y][z][1]&&pieces[x][y][z][1]==1)
						{
							// 输出信息中追加棋子名称
							out+=(x==0?'黑':'红')+y;
							// 获得落子位置原有棋子信息
							kill = {x:x,y:y,z:z};
							break;
						}
					}
					// 如果已匹配到棋子跳出循环
					if (kill)
					{
						break;
					}
				}
				if (kill)
				{
					break;
				}
			}
			if (kill)
			{
				// 修改被杀棋子的状态
				pieces[kill.x][kill.y][kill.z][2]=0;
			}
			// 输出信息追加移动位置信息
			out+=xx[l[1]]+yy[l[0]]+'\n';
			// 更新棋子的落子位置信息
			pieces[piece.x][piece.y][piece.z][0]=parseInt(l[0]);
			pieces[piece.x][piece.y][piece.z][1]=parseInt(l[1]);
			// 当前棋子信息清除
			piece=null;
		}
	}
	console.log(out);
日志获取需要自己替换 初始化棋盘的数组需要补全
加载更多回复(7)

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧