jocly
Version:
Board games 3D/2D UI and AI web library
1 lines • 4.25 kB
JavaScript
exports.model=Model={Game:{},Board:{},Move:{}},Model.Game.InitGame=function(){for(var t=this.mOptions.width,i=this.mOptions.height,s=this.mOptions.lines,o=[[-1,-1],[0,-1],[1,-1],[-1,0]],h=[],e=0;e<i;e++)for(var r=0;r<t;r++)for(var n=0;n<o.length;n++){var l,a=o[n][0],p=o[n][1],d=[];for(l=0;l<s;l++){var u;if(u=this.mOptions.torus?(e+p*l)*t+(r+a*l+t)%t:(e+p*l)*t+r+a*l,this.mOptions.torus&&(e+p*l<0||e+p*l>=i))break;if(!this.mOptions.torus&&(r+a*l<0||r+a*l>=t||e+p*l<0||e+p*l>=i))break;d.push(u)}l==s&&h.push(d)}this.g.TuplesList=h;for(var m={},l=0;l<h.length;l++)for(var d=h[l],v=0;v<d.length;v++){var u=d[v];void 0===m[u]&&(m[u]=[]),m[u].push(d)}this.g.Tuples=m,this.zobrist=new JocGame.Zobrist({board:{type:"array",size:this.mOptions.width*this.mOptions.height,values:["1","-1"]}})},Model.Move.Init=function(t){this.op=t.op,this.col=t.col},Model.Move.CopyFrom=function(t){this.Init(t)},Model.Move.ToString=function(){var t="";switch(this.op){case"+":t+="+";break;case"-":t+="-";break;default:t+="?"}return t+=String.fromCharCode(65+this.col)},Model.Board.Init=function(t){this.zSign=0},Model.Board.InitialPosition=function(t){this.board=[];for(var i=t.mOptions.width,s=t.mOptions.height,o=0;o<s;o++)for(var h=0;h<i;h++)this.board.push(0);this.tuples={};for(var e=1;e<=t.mOptions.lines;e++)this.tuples[e]=0,this.tuples[-e]=0;this.cols=[];for(var h=0;h<i;h++)this.cols.push(0);if(t.mOptions.fillSides)for(var e=0;e<s;e++){var r=e*i,n=e%2?-1:1,l=0;this.board[r]=n,this.cols[l]++,this.tuples[n]++,this.zSign=t.zobrist.update(this.zSign,"board",n,r);var r=e*i+i-1,n=e%2?1:-1,l=i-1;this.board[r]=n,this.cols[l]++,this.tuples[n]++,this.zSign=t.zobrist.update(this.zSign,"board",n,r)}},Model.Board.GenerateMoves=function(t){for(var i=[],s=t.mOptions.height,o=0;o<t.mOptions.width;o++)this.cols[o]<s&&i.push({op:"+",col:o});if(t.mOptions.remove)for(var o=0;o<t.mOptions.width;o++)this.board[o]==this.mWho&&i.push({op:"-",col:o});this.mMoves=i,0==i.length&&(this.mFinished=!0,this.mWinner=JocGame.DRAW)},Model.Board.Evaluate=function(t){if(this.mEvaluation=0,this.mWinner=0,t.mOptions.preventRepeat&&t.GetRepeatOccurence(this)>2)return this.mFinished=!0,void(this.mWinner=JocGame.DRAW);if(this.tuples[t.mOptions.lines]>0&&(this.mFinished=!0,this.mWinner=1),this.tuples[-t.mOptions.lines]>0)return this.mFinished=!0,void(this.mWinner?this.mWinner=JocGame.DRAW:this.mWinner=-1);if(!this.mFinished)for(var i=t.mOptions.levelOptions,s=1;s<t.mOptions.lines;s++)this.mEvaluation+=this.tuples[s]*i["evalTuple"+s],this.mEvaluation-=this.tuples[-s]*i["evalTuple"+s]},Model.Board.ApplyMove=function(t,i){if("+"==i.op){for(var s=i.col,o=this.cols[s],h=o*t.mOptions.width+s,e=0;e<t.g.Tuples[h].length;e++){for(var r=t.g.Tuples[h][e],n={1:0,0:0,"-1":0},l=0;l<r.length;l++)n[this.board[r[l]]]++;n[1]>0&&0==n[-1]?this.tuples[n[1]]--:n[-1]>0&&0==n[1]&&this.tuples[-n[-1]]--,n[this.mWho]++,n[1]>0&&0==n[-1]?this.tuples[n[1]]++:n[-1]>0&&0==n[1]&&this.tuples[-n[-1]]++}this.board[h]=this.mWho,this.cols[s]++,this.zSign=t.zobrist.update(this.zSign,"board",this.mWho,h)}else if("-"==i.op){for(var o=0;o<this.cols[i.col];o++)for(var h=o*t.mOptions.width+i.col,e=0;e<t.g.Tuples[h].length;e++){for(var r=t.g.Tuples[h][e],n={1:0,0:0,"-1":0},l=0;l<r.length;l++)n[this.board[r[l]]]++;n[1]>0&&0==n[-1]?this.tuples[n[1]]--:n[-1]>0&&0==n[1]&&this.tuples[-n[-1]]--}for(var e=0;e<this.cols[i.col];e++){var h=e*t.mOptions.width+i.col,a=h+t.mOptions.width,p=0;a<this.board.length&&(p=this.board[a]),this.zSign=t.zobrist.update(this.zSign,"board",this.board[h],h),p&&(this.zSign=t.zobrist.update(this.zSign,"board",p,h)),this.board[h]=p}this.cols[i.col]--;for(var o=0;o<this.cols[i.col];o++)for(var h=o*t.mOptions.width+i.col,e=0;e<t.g.Tuples[h].length;e++){for(var r=t.g.Tuples[h][e],n={1:0,0:0,"-1":0},l=0;l<r.length;l++)n[this.board[r[l]]]++;n[1]>0&&0==n[-1]?this.tuples[n[1]]++:n[-1]>0&&0==n[1]&&this.tuples[-n[-1]]++}}else console.error("Invalid move",i)},Model.Board.CopyFrom=function(t){this.tuples={};for(var i in t.tuples)this.tuples[i]=t.tuples[i];this.board=[];for(var s=0;s<t.board.length;s++)this.board.push(t.board[s]);this.cols=[];for(var o=0;o<t.cols.length;o++)this.cols.push(t.cols[o]);this.mWho=t.mWho,this.zSign=t.zSign},Model.Board.GetSignature=function(){return this.zSign};