diff options
Diffstat (limited to 'gameserver/gameserver.js')
-rwxr-xr-x | gameserver/gameserver.js | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/gameserver/gameserver.js b/gameserver/gameserver.js index ddc6f0b..8ab4bbc 100755 --- a/gameserver/gameserver.js +++ b/gameserver/gameserver.js @@ -127,8 +127,24 @@ function moveIsLegal(bd,mv,forpl){ return true; } +function checkWin(bd,pljustmoved){ + var i,neuidx=-1,newidx; + for(i=0;i<25;i++)if(bd[i]==3){neuidx=i;break;} + assert(neuidx!=-1); + if(neuidx<5)return 1; + if(neuidx>=20)return 2; + for(i=0;i<8;i++){ + newidx=idxAfterSlide(bd,neuidx,i); + if(newidx!=neuidx)break; + } + if(i==8){ //no shifts of the neutron possible + return pljustmoved; + } + return 0; +} + function handleMessage(conn,msg){ - var cmd=msg.split(" "),list,i,game,c2,mv; + var cmd=msg.split(" "),list,i,game,c2,mv,won; switch(cmd[0]){ case "nick": conn.ws.send("nick \""+conn.nick+"\""); @@ -203,10 +219,20 @@ function handleMessage(conn,msg){ game.board=applyMove(game.board,mv); console.log("new board:"); console.log(game.board); - game.onturn=3-game.onturn; conn.ws.send("game_doturn "+JSON.stringify([true,mv])); + game.onturn=3-game.onturn; c2=conns[findby(conns,"id",conn.id==game.i1?game.i2:game.i1)]; - c2.ws.send("your_turn "+JSON.stringify(mv)); + c2.ws.send("other_turn "+JSON.stringify(mv)); + won=checkWin(game.board,3-game.onturn); //player that just moved + if(won){ + conn.ws.send("game_win "+won); + c2.ws.send("game_win "+won); + games.splice(findby(games,"id",conn.gameid),1); + conn.gameid=null; + c2.gameid=null; + break; + } + c2.ws.send("your_turn true"); game.firstmove=false; break; default: @@ -234,6 +260,7 @@ new WebSocketServer({port:WSPORT}).on("connection",function(ws){ conns[otherplayeridx].gameid=null; conn.gameid=null; games.splice(gameidx,1); + conns[otherplayeridx].ws.send("game_stop \"Other player quit\""); } }); }); |