UNPKG

jocly

Version:

Board games 3D/2D UI and AI web library

1 lines 7.43 kB
exports.model=Model={Game:{},Board:{},Move:{}},Model.Game.InitGame=function(){for(var t=this,r=this.mOptions.size,a=[],i=[],o=0,e=0,n=[],s=0;s<r;s++)n.push(e),e+=(r-s)*(r-s);for(var s=0;s<r;s++)for(var h=0;h<r-s;h++)for(var l=0;l<r-s;l++){var u=o++;a[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<r&&c>=0&&c<r-p&&d>=0&&d<r-p?i[u].push(n[p]+c*(r-p)+d):i[u].push(null)}for(var g=[[0,-1],[0,1],[-1,0],[1,0]],m=0;m<g.length;m++){var M=g[m],p=s,c=h+M[0],d=l+M[1];p>=0&&p<r&&c>=0&&c<r-p&&d>=0&&d<r-p?i[u].push(n[p]+c*(r-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<r&&c>=0&&c<r-p&&d>=0&&d<r-p?i[u].push(n[p]+c*(r-p)+d):i[u].push(null)}}this.g.Graph=i,this.g.Coord=a,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 a=this.g.Coord[u],G=u+1;G<this.g.Graph.length;G++){var b=this.g.Coord[G];if(b[2]==a[2]+2&&b[0]==a[0]-1&&b[1]==a[1]-1){this.g.Over[u]=G,this.g.Beneath[G]=u;break}}this.g.EachDirection=function(r,a){for(var i=0;i<12;i++){var o=t.g.Graph[r][i];if(null!=o&&0==a(o,i))return}},this.g.EachDirectionDown=function(r,a){for(var i=[0,1,2,3],o=0;o<i.length;o++){var e=t.g.Graph[r][i[o]];if(null!=e&&0==a(e,i[o]))return}},this.g.EachDirectionUp=function(r,a){for(var i=[8,9,10,11],o=0;o<i.length;o++){var e=t.g.Graph[r][i[o]];if(null!=e&&0==a(e,i[o]))return}},this.g.EachDirectionFlat=function(r,a){for(var i=[4,5,6,7],o=0;o<i.length;o++){var e=t.g.Graph[r][i[o]];if(null!=e&&0==a(e,i[o]))return}},this.g.EachDirectionFlatDown=function(r,a){for(var i=[0,1,2,3,4,5,6,7],o=0;o<i.length;o++){var e=t.g.Graph[r][i[o]];if(null!=e&&0==a(e,i[o]))return}},this.g.EachDirectionFlatUp=function(r,a){for(var i=[4,5,6,7,8,9,10,11],o=0;o<i.length;o++){var e=t.g.Graph[r][i[o]];if(null!=e&&0==a(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],r=0;r<4;r++)for(var a=0;a<4-r;a++)for(var i=0;i<4-r;i++)for(var o=t[r]+a*(4-r)+i,e=-1;e<2;e+=2)for(var n=-1;n<2;n+=2){var s=r,h=a+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,r,a,i,o,e){for(var n=0;n<r.length;n++)t=this.zobrist.update(t,"board",a,r[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 r in t)t.hasOwnProperty(r)&&(this[r]=JSON.parse(JSON.stringify(t[r])))},Model.Move.ToString=function(){var t=["?","W","B","R"][this.clr],r="";switch(this.act){case"+":r+="+"+this.pos+t;break;case">":r+=this.from+">"+this.to+t}return r},Model.Board.Init=function(t){},Model.Board.InitialPosition=function(t){this.spInitialPosition(t)},Model.Board.spInitialPosition=function(t){this.board=[];for(var r=0;r<t.g.Graph.length;r++)this.board[r]=0;this.maxLayer=0,this.ballCount=[0,0,0],this.playables={},this.height=[0,0,0],this.zSign=0;for(var r=0;r<t.mOptions.size*t.mOptions.size;r++)this.playables[r]=!0},Model.Board.MakeFreeMoves=function(t){var r=[];for(var a in this.playables)this.playables.hasOwnProperty(a)&&r.push({act:"+",pos:a,clr:this.mWho==JocGame.PLAYER_A?1:2});return r},Model.Board.GenerateMoves=function(t){var r=this.GenerateAllMoves(t),a=t.mOptions.moveCount;0==r.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!==a&&r.length>a&&(t.ArrayShuffle(r),r.sort(function(t,r){r.nextBoard.evaluation,t.nextBoard.evaluation}),r.splice(a,r.length-a)),this.mMoves=r},Model.Board.GenerateAllMoves=function(t){return this.MakeFreeMoves(t)},Model.Board.Evaluate=function(t,r,a){this.mEvaluation=0},Model.Board.ApplyMove=function(t,r){this.spApplyMove(t,r)},Model.Board.spApplyMove=function(t,r){function a(r){delete i.playables[r],t.g.EachDirectionFlat(r,function(a,o){if(i.board[a]){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[r][e];null!==s&&i.board[s]>0&&i.board[t.g.Graph[a][e]]&&(i.playables[t.g.Graph[r][n]]=!0)}})}var i=this;switch(r.act){case"+":this.board[r.pos]=r.clr;var o=t.g.Coord[r.pos][2];o>this.maxLayer&&(this.maxLayer=o),this.height[r.clr]+=o,this.ballCount[r.clr]++,a(r.pos);break;case">":r.down.length>0?this.playables[r.down[r.down.length-1]]=!0:this.playables[r.from]=!0;for(var e=r.from,n=0;n<r.down.length;n++){var s=r.down[n];this.height[this.board[s]]--,this.board[e]=this.board[s],e=s}this.board[e]=0,this.board[r.to]=r.clr;var o=t.g.Coord[r.to][2];this.height[r.clr]+=o,o>this.maxLayer&&(this.maxLayer=o),a(r.to)}},Model.Board.IsValidMove=function(t,r){return!0},Model.Board.ExtendMove=function(t,r){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,r=[],a=[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=a[i]+o*(4-i)+e;!function(r,a){for(var i=[7,15,5,13],o=0;o<i.length;o++){var e=t.g.Graph[r][i[o]];null!=e&&a(e,i[o])}}(n,function(a,o){for(var e=[n];null!=a;)e.push(a),a=t.g.Graph[a][o];e.length==4-i&&r.push(e)})}this.g.SplineLines=r},Model.Board.splineEvaluate=function(t,r,a){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(a&&(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)},Model.Board.GenerateAllMoves=function(t){var r=this.MakeFreeMoves(t),a=this.MakeSelfSinglePinMoves(t);return a.length>0&&(r=r.concat(a)),r},Model.Board.GetSingleUpBalls=function(t,r,a){var i=this,o=[],e=[];if(t.g.EachDirectionUp(r,function(t,r){return 0!=i.board[t]?(o.push(t),e.push(r)):a&&(a[t]=!0),!0}),0==o.length)return[];if(o.length>1)return null;for(var n=o[0],s=[n];null!=(n=t.g.Graph[n][e[0]]);){if(0==this.board[n])return a&&(a[n]=!0),s;s.push(n)}return s},Model.Board.MakeSelfSinglePinMoves=function(t){for(var r=[],a=this.mWho==JocGame.PLAYER_A?1:2,i=0;i<t.g.Coord.length&&!(t.g.Coord[i][2]>this.maxLayer);i++)if(this.board[i]==a){var o={},e=this.GetSingleUpBalls(t,i,o);if(null!=e)for(var n=0;n<this.mMoves.length;n++){var s=this.mMoves[n];"+"==s.act&&void 0===o[s.pos]&&r.push({act:">",from:i,to:s.pos,down:e,clr:a})}}return r},Model.Board.Evaluate=function(t){this.splineEvaluate.apply(this,arguments),this.mEvaluation+=(this.height[1]-this.height[2])*t.g.factor.sppHeight};