jocly
Version:
Board games 3D/2D UI and AI web library
1 lines • 6.44 kB
JavaScript
exports.model=Model={Game:{},Board:{},Move:{}},Model.Game.InitGame=function(){for(var t=this,a=this.mOptions.size,r=[],i=[],o=0,e=0,n=[],s=0;s<a;s++)n.push(e),e+=(a-s)*(a-s);for(var s=0;s<a;s++)for(var h=0;h<a-s;h++)for(var l=0;l<a-s;l++){var u=o++;r[u]=[h,l,s],i[u]=[];for(var v=0;v<2;v++)for(var f=0;f<2;f++){var p=s-1,c=h+v,d=l+f;p>=0&&p<a&&c>=0&&c<a-p&&d>=0&&d<a-p?i[u].push(n[p]+c*(a-p)+d):i[u].push(null)}for(var g=[[0,-1],[0,1],[-1,0],[1,0]],m=0;m<g.length;m++){var G=g[m],p=s,c=h+G[0],d=l+G[1];p>=0&&p<a&&c>=0&&c<a-p&&d>=0&&d<a-p?i[u].push(n[p]+c*(a-p)+d):i[u].push(null)}for(var v=-1;v<1;v++)for(var f=-1;f<1;f++){var p=s+1,c=h+v,d=l+f;p>=0&&p<a&&c>=0&&c<a-p&&d>=0&&d<a-p?i[u].push(n[p]+c*(a-p)+d):i[u].push(null)}}this.g.Graph=i,this.g.Coord=r,this.g.Over=[],this.g.Beneath=[];for(var u=0;u<this.g.Graph.length;u++)this.g.Over[u]=null,this.g.Beneath[u]=null;for(var u=0;u<this.g.Graph.length;u++)for(var r=this.g.Coord[u],b=u+1;b<this.g.Graph.length;b++){var M=this.g.Coord[b];if(M[2]==r[2]+2&&M[0]==r[0]-1&&M[1]==r[1]-1){this.g.Over[u]=b,this.g.Beneath[b]=u;break}}this.g.EachDirection=function(a,r){for(var i=0;i<12;i++){var o=t.g.Graph[a][i];if(null!=o&&0==r(o,i))return}},this.g.EachDirectionDown=function(a,r){for(var i=[0,1,2,3],o=0;o<i.length;o++){var e=t.g.Graph[a][i[o]];if(null!=e&&0==r(e,i[o]))return}},this.g.EachDirectionUp=function(a,r){for(var i=[8,9,10,11],o=0;o<i.length;o++){var e=t.g.Graph[a][i[o]];if(null!=e&&0==r(e,i[o]))return}},this.g.EachDirectionFlat=function(a,r){for(var i=[4,5,6,7],o=0;o<i.length;o++){var e=t.g.Graph[a][i[o]];if(null!=e&&0==r(e,i[o]))return}},this.g.EachDirectionFlatDown=function(a,r){for(var i=[0,1,2,3,4,5,6,7],o=0;o<i.length;o++){var e=t.g.Graph[a][i[o]];if(null!=e&&0==r(e,i[o]))return}},this.g.EachDirectionFlatUp=function(a,r){for(var i=[4,5,6,7,8,9,10,11],o=0;o<i.length;o++){var e=t.g.Graph[a][i[o]];if(null!=e&&0==r(e,i[o]))return}},this.zobrist=new JocGame.Zobrist({board:{type:"array",size:this.g.Graph.length,values:[0,1]}}),this.InitGameExtra()},Model.Game.MapSameLevelDiagGraph=function(){for(var t=[0,16,25,29],a=0;a<4;a++)for(var r=0;r<4-a;r++)for(var i=0;i<4-a;i++)for(var o=t[a]+r*(4-a)+i,e=-1;e<2;e+=2)for(var n=-1;n<2;n+=2){var s=a,h=r+e,l=i+n;s>=0&&s<4&&h>=0&&h<4-s&&l>=0&&l<4-s?this.g.Graph[o].push(t[s]+h*(4-s)+l):this.g.Graph[o].push(null)}},Model.Game.InitGameExtra=function(){},Model.Game.DestroyGame=function(){this.DestroyGameExtra()},Model.Game.DestroyGameExtra=function(){},Model.Game.spUpdateZobrist=function(t,a,r,i,o,e){for(var n=0;n<a.length;n++)t=this.zobrist.update(t,"board",r,a[n]);for(var n=0;n<i.length;n++)t=this.zobrist.update(t,"board",o,i[n]);return t},Model.Move.Init=function(t){for(var a in t)t.hasOwnProperty(a)&&(this[a]=JSON.parse(JSON.stringify(t[a])))},Model.Move.ToString=function(){var t=["?","W","B","R"][this.clr],a="";switch(this.act){case"+":a+="+"+this.pos+t;break;case">":a+=this.from+">"+this.to+t}return a},Model.Board.Init=function(t){},Model.Board.InitialPosition=function(t){this.spInitialPosition(t)},Model.Board.spInitialPosition=function(t){this.board=[];for(var a=0;a<t.g.Graph.length;a++)this.board[a]=0;this.maxLayer=0,this.ballCount=[0,0,0],this.playables={},this.height=[0,0,0],this.zSign=0;for(var a=0;a<t.mOptions.size*t.mOptions.size;a++)this.playables[a]=!0},Model.Board.MakeFreeMoves=function(t){var a=[];for(var r in this.playables)this.playables.hasOwnProperty(r)&&a.push({act:"+",pos:r,clr:this.mWho==JocGame.PLAYER_A?1:2});return a},Model.Board.GenerateMoves=function(t){var a=this.GenerateAllMoves(t),r=t.mOptions.moveCount;0==a.length?(this.mFinished=!0,this.ballCount[1]>this.ballCount[2]?this.mWinner=JocGame.PLAYER_A:this.ballCount[1]<this.ballCount[2]?this.mWinner=JocGame.PLAYER_B:this.mWinner=JocGame.DRAW):void 0!==r&&a.length>r&&(t.ArrayShuffle(a),a.sort(function(t,a){a.nextBoard.evaluation,t.nextBoard.evaluation}),a.splice(r,a.length-r)),this.mMoves=a},Model.Board.GenerateAllMoves=function(t){return this.MakeFreeMoves(t)},Model.Board.Evaluate=function(t,a,r){this.mEvaluation=0},Model.Board.ApplyMove=function(t,a){this.spApplyMove(t,a)},Model.Board.spApplyMove=function(t,a){function r(a){delete i.playables[a],t.g.EachDirectionFlat(a,function(r,o){if(i.board[r]){var e,n;switch(o){case 4:e=7,n=10;break;case 5:e=6,n=9;break;case 6:e=4,n=8;break;case 7:e=5,n=11}var s=t.g.Graph[a][e];null!==s&&i.board[s]>0&&i.board[t.g.Graph[r][e]]&&(i.playables[t.g.Graph[a][n]]=!0)}})}var i=this;switch(a.act){case"+":this.board[a.pos]=a.clr;var o=t.g.Coord[a.pos][2];o>this.maxLayer&&(this.maxLayer=o),this.height[a.clr]+=o,this.ballCount[a.clr]++,r(a.pos);break;case">":a.down.length>0?this.playables[a.down[a.down.length-1]]=!0:this.playables[a.from]=!0;for(var e=a.from,n=0;n<a.down.length;n++){var s=a.down[n];this.height[this.board[s]]--,this.board[e]=this.board[s],e=s}this.board[e]=0,this.board[a.to]=a.clr;var o=t.g.Coord[a.to][2];this.height[a.clr]+=o,o>this.maxLayer&&(this.maxLayer=o),r(a.to)}},Model.Board.IsValidMove=function(t,a){return!0},Model.Board.ExtendMove=function(t,a){return{}},Model.Board.GetSignature=function(){return this.zSign},Model.Game.InitGameExtra=function(){this.MapSameLevelDiagGraph(),this.BuildSplineLines(),this.g.factor={completion:[[4,2,1],[4,2],[4]],count:.1,sppHeight:1}},Model.Game.BuildSplineLines=function(){for(var t=this,a=[],r=[0,16,25,29],i=0;i<4;i++)for(var o=0;o<4-i;o++)for(var e=0;e<4-i;e++){var n=r[i]+o*(4-i)+e;!function(a,r){for(var i=[7,15,5,13],o=0;o<i.length;o++){var e=t.g.Graph[a][i[o]];null!=e&&r(e,i[o])}}(n,function(r,o){for(var e=[n];null!=r;)e.push(r),r=t.g.Graph[r][o];e.length==4-i&&a.push(e)})}this.g.SplineLines=a},Model.Board.splineEvaluate=function(t,a,r){for(var i=[[0,0,0],[0,0],[0]],o=[[0,0,0],[0,0],[0]],e=0;e<t.g.SplineLines.length;e++){var n=t.g.SplineLines[e],s=t.g.Coord[n[0]][2];if(s>this.maxLayer)break;for(var h=0,l=0,u=0,v=0;v<n.length;v++){var f=n[v];if(1==this.board[f])l++;else{if(2!=this.board[f]){h++;break}u++}}if(0==h){if(0==l?(this.mFinished=!0,this.mWinner=JocGame.PLAYER_B):0==u&&(this.mFinished=!0,this.mWinner=JocGame.PLAYER_A),this.mFinished)return void(r&&(this.mWinLine=n))}else 0==l&&u>0?o[s][s-u-1]++:0==u&&l>0&&i[s][s-l-1]++}this.mEvaluation=0;for(var e=0;e<3;e++)for(var v=0;v<3-e;v++)this.mEvaluation+=(i[e][v]-o[e][v])*t.g.factor.completion[e][v];this.mEvaluation+=(this.ballCount[1]-this.ballCount[2])*t.g.factor.count},Model.Board.Evaluate=function(){this.splineEvaluate.apply(this,arguments)};