jocly/dist/browser/games/checkers/alquerque-arabic-model.js
2017-05-18 00:16:28 +02:00

1 line
13 KiB
JavaScript

exports.model=Model={Game:{},Board:{},Move:{}},function(){function t(t){if(e){var o=t%s;return(t-o)/s*s+s-o}var r=s*i-t-1,n=r%s;return r-n+s-n}var s,i,e=!1;Model.Game.checkersPosToString=t,Model.Game.InitGameInfo=function(){},Model.Game.BuildGraphCoord=function(){var t=(this.mOptions.width,this.mOptions.height,[]),s=[];this.g.Graph=t,this.g.Coord=s},Model.Game.InitGame=function(){var t=this.mOptions.width,o=this.mOptions.height;if(s=t,i=o,e=this.mOptions.invertNotation||!1,this.g.compulsoryCatch=!0,this.g.canStepBack=!0,this.g.mustMoveForward=!1,this.g.mustMoveForwardStrict=!1,this.g.lastRowFreeze=!1,this.g.lastRowCrown=!1,this.g.captureLongestLine=!1,this.g.noMove="lose",this.g.kingCaptureShort=!1,this.g.kingValue=5,this.g.lastRowFactor=0,this.g.canCaptureBackward=!0,this.g.captureInstantRemove=!1,this.g.longRangeKing=!0,this.g.drawKvsK=!0,this.g.drawKvs2K=!0,this.g.whiteStarts=!0,this.g.king180deg=!1,this.g.suicide=!1,this.mOptions.variant)for(var r in this.mOptions.variant)this.mOptions.variant.hasOwnProperty(r)&&(this.g[r]=this.mOptions.variant[r]);this.BuildGraphCoord(),this.zobrist=new JocGame.Zobrist({board:{type:"array",size:this.g.Graph.length,values:["1/0","1/1","-1/0","-1/1"]}})},Model.Game.DestroyGame=function(){},Model.Game.CheckersDirections=4,Model.Game.Checkers2WaysDirections=[0,1,1,0],Model.Game.CheckersEachDirection=function(t,s){for(var i=0;i<this.CheckersDirections;i++){var e=this.g.Graph[t][i];if(null!=e&&0==s(e,i))return}},Model.Move.Init=function(t){this.pos=[];for(var s=t.pos?Object.keys(t.pos).sort():[],i=0;i<s.length;i++)this.pos.push(t.pos[i]);this.capt=[];for(var e=t.capt?Object.keys(t.capt).sort():[],i=0;i<e.length;i++)this.capt.push(t.capt[i])},Model.Move.ToString=function(s){s=s||"natural";var i=this;switch(s){case"natural":return function(){for(var s=[t(i.pos[0]),t(i.pos[i.pos.length-1])],e="-",o=1;o<i.capt.length;o++)null!=i.capt[o]&&(e="x",i.capt.length>3&&s.push(t(i.capt[o])));return s.join(e)}();case"hub":return function(){var s="-",e=[t(i.pos[0]),t(i.pos[i.pos.length-1])];if(i.capt[1]){s="x";var o=i.capt.slice(1).map(function(s){return t(s)});o.sort(),e=e.concat(o)}return e.join(s)}();case"dxp":return function(){var s=[t(i.pos[0]),t(i.pos[i.pos.length-1])];if(i.capt[1]){s.push(i.capt.length-1);for(var e=[],o=1;o<i.capt.length;o++)e.push(t(i.capt[o]));e.sort(),s=s.concat(e)}else s.push(0);return s.map(function(t){return t<10?"0"+t:t}).join("")}();default:return"??"}},Model.Board.Init=function(t){this.zSign=0},Model.Board.InitialPosition=function(t){var s=t.mOptions.width,i=t.mOptions.height,e=t.mOptions.initial;this.board=[];for(var o=0;o<i;o++)for(var r=0;r<s;r++)this.board[o*s+r]=-1;this.pieces=[];var n=0;if(t.mInitial){this.pCount=[0,0],this.spCount=[0,0],this.kpCount=[0,0];for(var a=0;a<t.mInitial.pieces.length;a++){var h=t.mInitial.pieces[a];this.board[h.p]=a,this.pieces.push({s:h.s,p:h.p,l:-1,t:h.t,plp:h.p}),this.zSign=t.zobrist.update(this.zSign,"board",h.s+"/"+h.t,h.p);var p=-(h.s-1)/2;this.pCount[p]++,0==h.t?this.spCount[p]++:this.kpCount[p]++}}else{for(var a in e.a)if(e.a.hasOwnProperty(a)){var u=e.a[a],c=u[0]*s+u[1],h={s:JocGame.PLAYER_A,p:c,l:-1,t:0,plp:c};this.pieces.push(h),this.board[c]=n++,this.zSign=t.zobrist.update(this.zSign,"board","1/0",c)}for(var a in e.b)if(e.b.hasOwnProperty(a)){var u=e.b[a],c=u[0]*s+u[1],h={s:JocGame.PLAYER_B,p:c,l:-1,t:0,plp:c};this.pieces.push(h),this.board[c]=n++,this.zSign=t.zobrist.update(this.zSign,"board","-1/0",c)}this.pCount=[e.a.length,e.b.length],this.spCount=[e.a.length,e.b.length],this.kpCount=[e.a.length,e.b.length]}},Model.Board.GenerateMoves=function(t){try{this._GenerateMoves(t)}catch(t){}},Model.Board._GenerateMoves=function(t){function s(t){for(var s=0;s<o.pieces.length;s++){var i=o.pieces[s];i&&i.s==o.mWho&&t(s,i.p)}}function i(s,e,r,n,a){for(;;){var h=[],p=[],u=[];if(t.CheckersEachDirection(s,function(i,c){var l;0==t.g.canCaptureBackward&&(l=t.g.Coord[s][0]);var g=t.Checkers2WaysDirections[c];if(a){if(t.g.longRangeKing)for(;o.board[i]==-1||t.g.king180deg&&null!=i&&r.indexOf(i)>=0;)i=t.g.Graph[i][c];if(null!=i&&o.board[i]>=0&&o.pieces[o.board[i]].s==-o.mWho){var v=i;if(i=t.g.Graph[i][c],t.g.kingCaptureShort){if(o.board[i]==-1||i==e[0]){for(var d=!0,f=0;f<n.length;f++)if(t.g.king180deg){if(r[f]==v){d=!1;break}}else if(t.g.captureInstantRemove&&r[f]==v||0==t.g.captureInstantRemove&&r[f]==v&&n[f]==g){d=!1;break}d&&(h.push(i),p.push(v),u.push(g)),i=t.g.Graph[i][c]}}else for(;o.board[i]==-1||i==e[0]||null!==i&&t.g.captureInstantRemove&&r.indexOf(i)>=0;){for(var d=!0,f=0;f<n.length;f++)if(t.g.captureInstantRemove&&r[f]==v||0==t.g.captureInstantRemove&&r[f]==v&&n[f]==g){d=!1;break}d&&(h.push(i),p.push(v),u.push(g)),i=t.g.Graph[i][c]}}}else if(o.board[i]>=0&&o.pieces[o.board[i]].s==-o.mWho){var m,C;if(0==t.g.canCaptureBackward&&(m=t.g.Coord[i][0],C=!1,(o.mWho==JocGame.PLAYER_A&&m>=l||o.mWho==JocGame.PLAYER_B&&m<=l)&&(C=!0)),t.g.canCaptureBackward||1==C){var b=t.g.Graph[i][c];if(null!=b&&(o.board[b]==-1||b==e[0]||null!==b&&t.g.captureInstantRemove&&r.indexOf(b)>=0)){for(var d=!0,f=0;f<n.length;f++)if(t.g.captureInstantRemove&&r[f]==i||0==t.g.captureInstantRemove&&r[f]==i&&n[f]==g){d=!1;break}d&&(h.push(b),p.push(i),u.push(g))}}}return!0}),0==h.length){e.length>1&&o.mMoves.push({pos:e,capt:r});break}if(!t.g.compulsoryCatch&&e.length>1){for(var c=[],l=0;l<e.length;l++)c.push(e[l]);for(var g=[],l=0;l<r.length;l++)g.push(r[l]);o.mMoves.push({pos:c,capt:g})}if(1!=h.length){for(var l=0;l<h.length;l++){for(var c=[],v=0;v<e.length;v++)c.push(e[v]);c.push(h[l]);for(var g=[],v=0;v<r.length;v++)g.push(r[v]);g.push(p[l]);for(var d=[],v=0;v<n.length;v++)d.push(n[v]);d.push(u[l]),i(h[l],c,g,d,a)}break}s=h[0],e.push(s),r.push(p[0]),n.push(u[0])}}var e=t.mOptions.height,o=this;if(this.mMoves=[],s(function(t,s){0==o.pieces[t].t?i(s,[s],[null],[null],!1):1==o.pieces[t].t&&i(s,[s],[null],[null],!0)}),0!=t.g.compulsoryCatch&&0!=this.mMoves.length||s(function(s,i){var r;0==o.pieces[s].t?((t.g.mustMoveForward||t.g.mustMoveForwardStrict||t.lastRowFreeze)&&(r=t.g.Coord[i][0]),t.CheckersEachDirection(i,function(n,a){var h,p,u;return t.g.mustMoveForwardStrict?(h=t.g.Coord[n][0],p=!1,(o.mWho==JocGame.PLAYER_A&&h>r||o.mWho==JocGame.PLAYER_B&&h<r)&&(p=!0)):t.g.mustMoveForward&&(h=t.g.Coord[n][0],p=!0,(o.mWho==JocGame.PLAYER_A&&h<r||o.mWho==JocGame.PLAYER_B&&h>r)&&(p=!1)),t.g.lastRowFreeze&&(u=!1,(o.mWho==JocGame.PLAYER_A&&r==e-1||o.mWho==JocGame.PLAYER_B&&0==r)&&(u=!0)),o.board[n]!=-1||!t.g.canStepBack&&n==o.pieces[s].l||(0!=t.g.mustMoveForward||0!=t.g.mustMoveForwardStrict)&&1!=p||0!=t.g.lastRowFreeze&&0!=u||o.mMoves.push({pos:[i,n],capt:[null,null]}),!0})):1==o.pieces[s].t&&t.CheckersEachDirection(i,function(s,e){if(t.g.longRangeKing)for(;o.board[s]==-1;)o.mMoves.push({pos:[i,s],capt:[null,null]}),s=t.g.Graph[s][e];else o.board[s]==-1&&(o.mMoves.push({pos:[i,s],capt:[null,null]}),s=t.g.Graph[s][e]);return!0})}),0==this.mMoves.length)switch(t.g.noMove){case"count":this.mFinished=!0,this.pCount[0]<this.pCount[1]?this.mWinner=JocGame.PLAYER_B:this.pCount[1]<this.pCount[0]?this.mWinner=JocGame.PLAYER_A:this.mWinner=JocGame.DRAW;break;case"lose":this.mFinished=!0,this.mWinner=-this.mWho;break;case"win":this.mFinished=!0,this.mWinner=this.mWho;break;default:this.mFinished=!0,this.mWinner=JocGame.DRAW}if(t.g.captureLongestLine){for(var r=this.mMoves,n=[],a=0,h=0;h<r.length;h++){var p=r[h];p.pos.length==a?n.push(p):p.pos.length>a&&(n=[p],a=p.pos.length)}this.mMoves=n}},Model.Board.Evaluate=function(t,s,i){if(t.mOptions.preventRepeat&&t.GetRepeatOccurence(this)>2)return this.mFinished=!0,void(this.mWinner=JocGame.DRAW);if(t.g.drawKvsK&&0==this.spCount[0]&&0==this.spCount[1]&&1==this.kpCount[0]&&1==this.kpCount[1])return this.mFinished=!0,void(this.mWinner=JocGame.DRAW);if(t.g.drawKvs2K&&0==this.spCount[0]&&0==this.spCount[1]&&this.kpCount[0]+this.kpCount[1]==3&&(1==this.kpCount[0]||2==this.kpCount[0]))return this.mFinished=!0,void(this.mWinner=JocGame.DRAW);if(0==this.pCount[1])return this.mFinished=!0,void(this.mWinner=t.g.suicide?JocGame.PLAYER_B:JocGame.PLAYER_A);if(0==this.pCount[0])return this.mFinished=!0,void(this.mWinner=t.g.suicide?JocGame.PLAYER_A:JocGame.PLAYER_B);if(this.mEvaluation=10*(this.spCount[0]-this.spCount[1])+10*(this.kpCount[0]-this.kpCount[1])*t.g.kingValue+this.pCount[0]/this.pCount[1]-this.pCount[1]/this.pCount[0],0!=t.g.lastRowFactor){for(var e=t.mOptions.height,o=0,r=0,n=0;n<this.pieces.length;n++){var a=this.pieces[n];a&&0==a.t&&(this.mWho==JocGame.PLAYER_A?o+=t.g.Coord[a.p][0]:r+=e-1-t.g.Coord[a.p][0])}this.mEvaluation+=(o-r)*t.g.lastRowFactor,t.g.suicide&&(this.mEvaluation=-this.mEvaluation)}},Model.Board.CopyFrom=function(t){this.board=[];for(var s=0;s<t.board.length;s++)this.board[s]=t.board[s];this.pieces=[];for(var s=0;s<t.pieces.length;s++){var i=t.pieces[s];this.pieces[s]=null==i?null:{s:i.s,p:i.p,l:i.l,t:i.t,plp:i.plp}}this.pCount=[t.pCount[0],t.pCount[1]],this.spCount=[t.spCount[0],t.spCount[1]],this.kpCount=[t.kpCount[0],t.kpCount[1]],this.mWho=t.mWho,this.zSign=t.zSign},Model.Board.ApplyMove=function(t,s){var i=(t.mOptions.width,t.mOptions.height),e=s.pos[0],o=this.board[e],r=this.pieces[o],n=r.s;r.l=e;var a={};this.zSign=t.zobrist.update(this.zSign,"board",r.s+"/"+r.t,r.p);for(var h=1;h<s.pos.length;h++){var p=s.pos[h];this.board[r.p]=-1,r.p=p,this.board[p]=o;var u=s.capt[h];null!=u&&(this.board[u]>=0&&(a[this.board[u]]=!0),this.board[u]=-1),e=p}this.zSign=t.zobrist.update(this.zSign,"board",r.s+"/"+r.t,p);var c=s.capt[s.capt.length-1];r.plp=c||s.pos[s.pos.length-2];for(var l in a)if(a.hasOwnProperty(l)){var g=this.pieces[l],v=(1-g.s)/2;switch(this.pCount[v]--,g.t){case 0:this.spCount[v]--;break;case 1:this.kpCount[v]--}this.zSign=t.zobrist.update(this.zSign,"board",g.s+"/"+g.t,g.p),this.pieces[l]=null}if(t.g.lastRowCrown&&0==this.pieces[o].t){var d=t.g.Coord[s.pos[s.pos.length-1]][0];if(n==JocGame.PLAYER_A&&d==i-1||n==JocGame.PLAYER_B&&0==d){var g=this.pieces[o];g.t=1;var f=(1-n)/2;this.spCount[f]--,this.kpCount[f]++,this.zSign=t.zobrist.update(this.zSign,"board",g.s+"/0",g.p),this.zSign=t.zobrist.update(this.zSign,"board",g.s+"/1",g.p)}}},Model.Board.IsValidMove=function(t,s){return!0},Model.Board.GetSignature=function(){return this.zSign},Model.Game.Import=function(t,s){function i(t,s,i){i=r-i;var e=i%n;i=i-e+n-e-1,o.push({s:t,p:i,l:-1,t:s,plp:i})}var e=1,o=[],r=this.mOptions.width*this.mOptions.height,n=this.mOptions.width;if("pjn"==t){var a=s.split(":");e="W"==a[0]?1:-1;for(var h=1;h<a.length;h++)if(0!=a[h].length)for(var p="W"==a[h].substr(0,1)?1:-1,u=a[h].substr(1).split(","),c=0;c<u.length;c++){var l=u[c],g=0;"K"==l.substr(0,1)&&(g=1,l=l.substr(1));var v=/^([0-9]+)-([0-9]+)$/.exec(l);if(v)for(var d=parseInt(v[1]);d<=parseInt(v[2]);d++)i(p,g,d);else i(p,g,parseInt(l))}return o.sort(function(t,s){return s.s-t.s}),{status:!0,initial:{pieces:o,turn:e}}}return{status:!1,error:"unsupported"}};var o=JocGame.prototype.GetBestMatchingMove;Model.Game.GetBestMatchingMove=function(t,s){var i=[],e=this;s.forEach(function(t){"function"==typeof t.ToString?i.push(t.ToString()):i.push(e.CreateMove(t).ToString())}),t=t.replace(/0([1-9])/g,"$1");var r=/^([0-9]+)[\-x]([0-9]+)([\-x][0-9]+)*$/.exec(t);if(r){var n=new RegExp("^"+r[1]+"[-x]"+r[2]+"([-x][0-9]+)*$"),a={};s.forEach(function(t,s){if(n.test(i[s])){var e=i[s],o=/^([0-9]+)x([0-9]+)x([0-9]+(x[0-9]+)*)/.exec(e);if(o){var r=o[3].split("x");r.sort(function(t,s){return parseInt(t)-parseInt(s)}),e=o[1]+"x"+o[2]+"x"+r.join("x")}a[e]=t}});var h=[];for(var p in a)a.hasOwnProperty(p)&&h.push(a[p]);h.length>0&&(s=h)}return o.call(this,t,s)},Model.Board.ExportBoardState=function(e,o){function r(t){for(var e=[],o=0;o<n.board.length;o++){var r=o%s,a=(o-r)/s,h=(i-a-1)*s+r,p=n.board[o];if(p<0)e[h]="e";else{var u=n.pieces[p],c=1==u.s?"w":t;1==u.t&&(c=c.toUpperCase()),e[h]=c}}return e.join("")}o=o||"natural";var n=this;switch(o){case"natural":case"fen":return function(){var s={},i=[];n.pieces.forEach(function(i){if(i&&null!=i.p){var e=1==i.s?"W":"B";void 0===s[e]&&(s[e]={});var o=1==i.t?"K":"";void 0===s[e][o]&&(s[e][o]={group:0==i.t,pos:[]}),s[e][o].pos.push(parseInt(t(i.p)))}});for(var e in s)if(s.hasOwnProperty(e)){var o=[];for(var r in s[e])if(s[e].hasOwnProperty(r)){var a=s[e][r];if(a.group){a.pos.sort(function(t,s){return parseInt(t)-parseInt(s)});var h=-2,p=-1,u=-1;a.pos.forEach(function(t){parseInt(t)==h+1?p=t:(p>=0?(o.push(r+u+"-"+p),p=-1):u>=0&&o.push(r+u),u=t),h=parseInt(t)}),p>=0?o.push(r+u+"-"+p):u>=0&&o.push(r+u)}else a.pos.forEach(function(t){o.push(r+t)})}i.push(e+o.join(","))}return i.join(":")}();case"dxp":return function(){return r("z")}();case"hub":return function(){return r("z")}();default:return JSON.stringify(this)}}}(),Model.Game.CheckersDirections=8,Model.Game.Checkers2WaysDirections=[0,0,1,1,2,3,3,2],Model.Game.BuildGraphCoord=function(){for(var t=this.mOptions.width,s=this.mOptions.height,i=[],e=[],o=0;o<s;o++)for(var r=0;r<t;r++){var n=o*t+r;if(e[n]=[o,r],i[n]=[],o>0?i[n].push((o-1)*t+r):i[n].push(null),o<s-1?i[n].push((o+1)*t+r):i[n].push(null),r>0?i[n].push(o*t+r-1):i[n].push(null),r<t-1?i[n].push(o*t+r+1):i[n].push(null),o%2==r%2)for(var a=-1;a<2;a+=2)for(var h=-1;h<2;h+=2)o+a<s&&o+a>=0&&r+h<t&&r+h>=0?i[n].push((o+a)*t+r+h):i[n].push(null);else i[n].push(null),i[n].push(null),i[n].push(null),i[n].push(null)}this.g.Graph=i,this.g.Coord=e};