UNPKG

jocly

Version:

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

1 lines 6.77 kB
exports.model=Model={Game:{},Board:{},Move:{}},function(){function i(i){return[Math.floor(i/8),i%8]}function t(i,t){if(i==t)return 0;if(t>i){var s=t;t=i,i=s}return h[i][t]}for(var s=[],a=0;a<64;a++){var r=i(a),o=r[0],n=r[1];s.push(Math.max(o,n))}for(var h=[],l=0;l<64;l++){var d=[];h.push(d);for(var e=i(l),p=e[0],u=e[1],b=0;b<l;b++){var g=i(b),z=g[0],v=g[1];d.push(Math.max(Math.abs(p-z),Math.abs(u-v)))}}for(var f=[[1,1],[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[-1,1],[0,1]],S=[],a=0;a<64;a++){for(var c=[],r=i(a),m=0;m<8;m++){var o=r[0]+f[m][0],n=r[1]+f[m][1];o<0||o>=8||n<0||n>=8?c.push(null):c.push(8*o+n)}S.push(c)}for(var M=[],a=0;a<64;a++){var G={},B={"-1":G};M.push(B);for(var m=0;m<8;m++){var F={};B[m]=F;for(var b=S[a][m],P=1;P<4&&null!=b;P++)F[b]=P,G[b]=P,b=S[b][m]}}Model.Game.InitGame=function(){this.g.Graph=S,this.zobrist=new JocGame.Zobrist({board:{type:"array",size:65,values:["-1","0","1","2","3","4","5","6"]},dirs:{type:"array",size:9,values:["0","1","2","3","4","5","6"]}})},Model.Move.Init=function(i){this.i=parseInt(i.i),this.p=parseInt(i.p),this.d=parseInt(i.d),this.md=parseInt(i.md)},Model.Move.CopyFrom=function(i){this.Init(i)},Model.Move.ToString=function(){var i="";return i+=this.p,i+=["M","P","B","M","P","B"][this.i],i+=this.d},Model.Move.Equals=function(i){return this.p==i.p&&this.i==i.i&&this.d==i.d&&this.md==i.md},Model.Board.Init=function(i){this.zSign=0},Model.Board.InitialPosition=function(i){this.board=[];for(var t=0;t<64;t++)this.board.push(null);this.penguins=[];for(var s=1;s>-2;s-=2)for(var a=0;a<3;a++){var r=this.penguins.length,o={p:-1,i:r,s:s,t:a,d:-1};this.penguins.push(o),this.zSign=i.zobrist.update(this.zSign,"board",r,0),this.zSign=i.zobrist.update(this.zSign,"dirs",r,0)}this.ball=-1,this.zSign=i.zobrist.update(this.zSign,"board",-1,0)},Model.Board.CopyFrom=function(i){this.board=[];for(var t=0;t<i.board.length;t++)this.board.push(null);this.penguins=[];for(var t in i.penguins){var s=i.penguins[t],a={p:s.p,s:s.s,i:s.i,t:s.t,d:s.d};this.penguins.push(a),a.p>-1&&(this.board[a.p]=a)}this.ball=i.ball,this.mWho=i.mWho,this.zSign=i.zSign},Model.Board.GenerateMoves=function(i){this.mMoves=this.PenSocGetAllMoves(i)},Model.Board.PenSocGetAllMoves=function(i){for(var t=[],s=0;s<this.penguins.length;s++){var a=this.penguins[s];a.s==this.mWho&&(t=t.concat(this.PenSocGetBoardMoves(i,a)))}return t},Model.Board.PenSocGetRotatingMoves=function(i,t,s,a,r){for(var o=[],n=a-r;n<=a+r;n++)o.push({i:t,p:s,d:(n+8)%8,md:(a+8)%8});return o},Model.Board.PenSocGetBoardMoves=function(i,t){var s,a=[],r=this.mWho==JocGame.PLAYER_A?63:0;s=-1==t.d?[0,1,2,3,4,5,6,7]:[parseInt(t.d)];var o=t.p,n=t.t+1,h=t.t+1;if(-1==o&&(o=this.mWho==JocGame.PLAYER_A?0:63,s=this.mWho==JocGame.PLAYER_A?[0,1,7]:[4,3,5],n=t.t,null!=this.board[o]))return a;if(t.p>-1&&t.d>-1&&a.push({i:t.i,p:t.p,d:-1,md:-1}),-1!=this.ball&&this.ball==t.p){n=3-t.t;for(var l=0;l<8;l++){for(var d=o,e=o,p=!1,u=0;u<n;u++){if(null==(d=i.g.Graph[d][l])){u>0&&a.push({i:t.i,p:e,d:-1,md:l}),p=!0;break}if(null!=d&&null!=this.board[d]){a.push({i:t.i,p:d,d:-1,md:l}),p=!0;break}e=d}p||a.push({i:t.i,p:e,d:-1,md:l})}}else for(var b=0;b<s.length;b++){for(var l=s[b],d=o,e=o,g=!0,u=0;u<n;u++){if(null==(d=i.g.Graph[d][l])||null!=this.board[d]){if(null!=d&&-1!=this.ball&&d==this.ball){var z=this.board[d];if(z&&z.s==t.s){g=!1;break}for(var v=!0,f=d;f;){if(f==r){v=!1;break}if(null==this.board[f])break;f=i.g.Graph[f][l]}v&&a.push({i:t.i,p:d,d:t.d,md:l})}else u>0&&null==d&&a.push({i:t.i,p:e,d:-1,md:l});g=!1;break}if(-1==this.ball&&(27==d||28==d||35==d||36==d)){a.push({i:t.i,p:d,d:-1,md:l}),g=!1;break}if(null!=d&&-1!=this.ball&&this.ball==d){a.push({i:t.i,p:d,d:-1,md:l}),g=!1;break}e=d}if(g&&e!=r&&(a=a.concat(this.PenSocGetRotatingMoves(i,t.i,e,l,h))),-1==t.p&&0==t.t&&0==b)break}return a},Model.Board.IsValidMove=function(i,t){return!0},Model.Board.Evaluate=function(i,a,r){var o="debug"==arguments[3];if(this.mEvaluation=0,0==this.ball?(this.mFinished=!0,this.mWinner=JocGame.PLAYER_B):63==this.ball&&(this.mFinished=!0,this.mWinner=JocGame.PLAYER_A),!this.mFinished){for(var n=0,h=0,l=0,d=0;d<6;d++){var e,p=this.penguins[d];if(p.p>=0){e=this.ball<0?Math.min(t(p.p,27),t(p.p,28),t(p.p,35),t(p.p,36)):t(p.p,this.ball);var u=M[p.p][p.d];for(var b in u){u[b]<=p.t+1&&(l+=p.s,this.ball>=0&&b==this.ball?h+=p.s:this.ball<0&&(27==b||28==b||35==b||36==b)&&(h+=p.s))}}else e=8;n+=e*p.s}var g=0,z=0;if(this.ball>=0){g=s[this.ball]-s[63-this.ball];var v=this.board[this.ball];null!=v&&(z=v.s)}var f=i.mOptions.levelOptions;o&&(console.log("distBall",n,"*",f.distBallFactor),console.log("distGoal",g,"*",f.distGoalFactor),console.log("haveBall",z,"*",f.haveBallFactor),console.log("reachable",l,"*",f.reachableFactor),console.log("ballReachable",h,"*",f.ballReachableFactor),console.log("distBall details",this.ball,s[this.ball],s[63-this.ball])),this.mEvaluation=n*f.distBallFactor+g*f.distGoalFactor+z*f.haveBallFactor+l*f.reachableFactor}},Model.Board.ApplyMove=function(i,t){var s=this.penguins[t.i];if(t.d=parseInt(t.d),-1!=this.ball&&this.ball==s.p){this.zSign=i.zobrist.update(this.zSign,"board",-1,this.ball+1),this.ball=t.p,this.zSign=i.zobrist.update(this.zSign,"board",-1,this.ball+1),this.zSign=i.zobrist.update(this.zSign,"dirs",s.i,s.d+1),s.d=t.md,this.zSign=i.zobrist.update(this.zSign,"dirs",s.i,s.d+1);var a=this.board[t.p];null!=a&&(this.zSign=i.zobrist.update(this.zSign,"dirs",a.i,a.d+1),a.d=-1,this.zSign=i.zobrist.update(this.zSign,"dirs",a.i,a.d+1))}else{if(s.p>-1&&(this.board[s.p]=null),t.p>-1){for(var r=t.p,o=s;null!=r;){var a=this.board[r];if(this.board[r]=o,this.zSign=i.zobrist.update(this.zSign,"board",o.i,o.p+1),o.p=r,this.zSign=i.zobrist.update(this.zSign,"board",o.i,o.p+1),null==a)break;this.zSign=i.zobrist.update(this.zSign,"dirs",a.i,a.d+1),a.d=t.md,this.zSign=i.zobrist.update(this.zSign,"dirs",a.i,a.d+1),o=a,r=i.g.Graph[r][t.md]}null==r&&(this.zSign=i.zobrist.update(this.zSign,"board",o.i,o.p+1),o.p=-1,this.zSign=i.zobrist.update(this.zSign,"board",o.i,o.p+1),this.zSign=i.zobrist.update(this.zSign,"dirs",o.i,o.d+1),o.d=-1,this.zSign=i.zobrist.update(this.zSign,"dirs",o.i,o.d+1))}this.zSign=i.zobrist.update(this.zSign,"board",s.i,s.p+1),s.p=t.p,this.zSign=i.zobrist.update(this.zSign,"board",s.i,s.p+1),this.zSign=i.zobrist.update(this.zSign,"dirs",s.i,s.d+1),s.d=t.d,this.zSign=i.zobrist.update(this.zSign,"dirs",s.i,s.d+1),-1!=this.ball||27!=t.p&&28!=t.p&&35!=t.p&&36!=t.p||(this.zSign=i.zobrist.update(this.zSign,"board",-1,this.ball+1),this.ball=t.p,this.zSign=i.zobrist.update(this.zSign,"board",-1,this.ball+1)),-1!=this.ball&&this.ball==s.p&&(this.zSign=i.zobrist.update(this.zSign,"dirs",s.i,s.d+1),s.d=-1,this.zSign=i.zobrist.update(this.zSign,"dirs",s.i,s.d+1))}},Model.Board.GetSignature=function(){return this.zSign}}();