87,907
社区成员
发帖
与我相关
我的任务
分享
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))
// 日志作为参数传递进来
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)
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 举起,但是我们初始化的棋子位置中没有对应的棋子,所以找不到对应的棋子,那么后边就全部出错了
所以,一定要用第一步开始的日志<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
我不需要做那种用图片显示出来的,我需要做的只是把他的坐标给记录下来,
按旁边黑色块儿的那种格式把每一步记录下来, 玩家会走动真实的棋盘 然后就有个页面会显示他走的步.
大概就是这个意思, 谢谢您肯帮我, 这个对我来说太重要了, 做不好很可能会失去工作 所以非常感谢您,麻烦您帮我看看 谢谢
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 上面的项目,我只需要在这个上面做出改变我的代码就会自动运行了, 请帮我最后一次, 非常感谢!!!!!!!
// 初始化输出信息
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);
日志获取需要自己替换
初始化棋盘的数组需要补全