aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomsmeding <hallo@tomsmeding.nl>2015-05-08 21:14:22 +0200
committertomsmeding <hallo@tomsmeding.nl>2015-05-08 21:14:22 +0200
commit864bce4ebdc625468969891b36784490448ceea3 (patch)
tree35627e2789a6cca99069389538c51531707b98ee
parent837341921ae81def54ada7a4adc9468a41ca6f8c (diff)
Bug fixing and win checking in gameserver
-rw-r--r--gameserver/gameserver.html42
-rwxr-xr-xgameserver/gameserver.js33
2 files changed, 62 insertions, 13 deletions
diff --git a/gameserver/gameserver.html b/gameserver/gameserver.html
index d8528ab..7fc27fc 100644
--- a/gameserver/gameserver.html
+++ b/gameserver/gameserver.html
@@ -74,19 +74,33 @@ function preinit(){
MOVES.push(arg[1]);
addmovelistrow(arg[1]);
nextmove();
- } else alert(arg[1]);
- } else if(cmd=="your_turn"){
- canAlreadyTurn=true;
- if(hasInited){
+ } else {
+ alert(arg[1]);
enableClicking(true,isFirstMove&&imPlayer==1);
- isFirstMove=false;
}
+ } else if(cmd=="other_turn"){
if(arg){
MOVES.push(arg);
addmovelistrow(arg);
nextmove();
}
- }
+ } else if(cmd=="your_turn"){
+ canAlreadyTurn=true;
+ if(hasInited){
+ enableClicking(true,isFirstMove&&imPlayer==1);
+ isFirstMove=false;
+ }
+ } else if(cmd=="game_stop"){
+ alert("Game has been stopped:\n"+arg);
+ enableClicking(false);
+ } else if(cmd=="game_win"){
+ bgcell(neuidx).classList.add("win");
+ if(arg==imPlayer){
+ alert("You have won the game!");
+ } else {
+ alert("You have lost the game! Better luck next time.");
+ }
+ } else alert("Unrecognised message "+msg);
});
ws.addEventListener("open",function(){
ws.send("nick");
@@ -262,8 +276,8 @@ function addmovelistrow(mv,i/*optional*/){
if(moveidx==target)return;
while(moveidx<target)nextmove(true);
while(moveidx>target)prevmove(true);
- setselectedmovelistline(i+1);
- };})(i+1));
+ setselectedmovelistline(target);
+ };})(i-1));
movelisttbody.appendChild(tr);
}
@@ -339,7 +353,7 @@ function nextmove(notimeout){
fgcells[neuidx]=null;
neuidx=newidx;
- if(moveidx==MOVES.length-1)bgcell(neuidx).classList.add("win");
+ //if(moveidx==MOVES.length-1)bgcell(neuidx).classList.add("win");
}
newidx=indexafterslide(MOVES[moveidx][1],MOVES[moveidx][2]);
@@ -371,7 +385,9 @@ function prevmove(notimeout){
if(moveidx==0||!canclick)return false;
moveidx--;
- if(MOVES[moveidx][0]!=-1&&moveidx==MOVES.length-1)winGlowIdxToRemove=neuidx;
+ //if(MOVES[moveidx][0]!=-1&&moveidx==MOVES.length-1)winGlowIdxToRemove=neuidx;
+ for(var i=0;i<S*S;i++)if(bgcell(i).classList.contains("win"))break;
+ if(i<S*S)winGlowIdxToRemove=i;
newidx=indexafterslide(MOVES[moveidx][1],MOVES[moveidx][2],true);
board[MOVES[moveidx][1]]=board[newidx];
@@ -559,6 +575,12 @@ div#movelist tr.selected{
input[type=button].selected{
background-color:#aaf;
}
+
+div#nickname{
+ margin-top:10px;
+ font-family:Sans-serif;
+ font-style:italic;
+}
</style>
</head>
<body>
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\"");
}
});
});