UNPKG

jocly

Version:

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

1 lines 5.74 kB
exports.model=Model={Game:{},Board:{},Move:{}},Model.Game.InitGameInfo=function(){},Model.Game.BuildGraphCoord=function(){var i=[],t=[];this.g.Graph=i,this.g.Coord=t},Model.Game.InitGame=function(){this.BuildGraphCoord(),this.g.TripletsByPos=[];for(var i=0;i<this.g.Coord.length;i++)this.g.TripletsByPos[i]=[];for(var i in this.g.Triplets)if(this.g.Triplets.hasOwnProperty(i)){var t=this.g.Triplets[i];for(var e in t)if(t.hasOwnProperty(e)){var s=t[e];this.g.TripletsByPos[s].push(t)}}this.InitGameExtra()},Model.Game.DestroyGame=function(){},Model.Game.MillsDirections=4,Model.Game.MillsEachDirection=function(i,t){for(var e=0;e<this.MillsDirections;e++){var s=this.g.Graph[i][e];null!=s&&t(s)}},Model.Move.Init=function(i){this.f=i.f,this.t=i.t,this.c=i.c},Model.Move.CopyFrom=function(i){this.f=i.f,this.t=i.t,this.c=i.c},Model.Move.Equals=function(i){return this.t==i.t&&this.c==i.c&&this.f==i.f},Model.Move.ToString=function(){var i="";return this.f>-1&&(i+=this.f+">"),i+=this.t,this.c>-1&&(i+="x"+this.c),i},Model.Board.Init=function(i){},Model.Board.InitialPosition=function(i){var t=i.g.Coord.length,e=i.mOptions.mencount;this.board=[];for(var s=0;s<t;s++)this.board[s]=-1;this.pieces=[],this.dock={1:[],"-1":[]},this.menCount={1:0,"-1":0};for(var o=0,r=0;r<2;r++)for(var n=0==r?1:-1,h=0;h<e;h++)this.dock[n].unshift(o),this.pieces.push({s:n,a:!0,d:h,p:-1,i:o++});this.placing=!0},Model.Board.StaticGenerateMoves=function(i){if(0==i.mFullPlayedMoves.length){for(var t=[],e=0;e<i.g.Coord.length;e++)t.push({f:-1,t:e,c:-1});return t}return null},Model.Board.GenerateMoves=function(i){this.mMoves=[],this.placing?this.GeneratePlacingMoves(i):i.mOptions.canFly?this.GenerateFlyingMoves(i):this.GenerateMovingMoves(i),0==this.mMoves.length&&(this.mFinished=!0,this.menCount[JocGame.PLAYER_A]+this.menCount[JocGame.PLAYER_B]==i.g.Coord.length?this.mWinner=JocGame.DRAW:this.mWinner=-this.mWho)},Model.Board.GeneratePlacingMoves=function(i){for(var t=0;t<i.g.Coord.length;t++)if(-1==this.board[t]){var e=!0;if(void 0!==i.mLevelInfo&&i.mCurrentLevel>=0){var s=i.mLevelInfo.maxDepth-i.mCurrentLevel;if(s>=i.mLevelInfo.placingRace){e=!1;for(var o in i.g.TripletsByPos[t])if(i.g.TripletsByPos[t].hasOwnProperty(o)){for(var r=i.g.TripletsByPos[t][o],n=0,h=0,a=0,l=0;l<3;l++)-1==this.board[r[l]]?a++:this.pieces[this.board[r[l]]].s==this.mWho?n++:h++;if(2==n||1==n&&0==h||2==h){e=!0;break}}}}e&&this.GenerateCapturingMoves(i,{f:-1,t:t,c:-1})}},Model.Board.GenerateMovingMoves=function(i){$this=this;for(var t=0;t<this.pieces.length;t++){var e=this.pieces[t];e.a&&e.s==this.mWho&&i.MillsEachDirection(e.p,function(t){-1==$this.board[t]&&$this.GenerateCapturingMoves(i,{f:e.p,t:t,c:-1})})}},Model.Board.GenerateFlyingMoves=function(i){if(3!=this.menCount[this.mWho])this.GenerateMovingMoves(i);else for(var t=0;t<this.pieces.length;t++){var e=this.pieces[t];if(e.a&&e.s==this.mWho)for(var s=0;s<this.board.length;s++)-1==this.board[s]&&this.GenerateCapturingMoves(i,{f:e.p,t:s,c:-1})}},Model.Board.GenerateCapturingMoves=function(i,t){for(var e in i.g.TripletsByPos[t.t])if(i.g.TripletsByPos[t.t].hasOwnProperty(e)){for(var s=i.g.TripletsByPos[t.t][e],o=!0,r=0;r<3;r++){var n=s[r];if(n!=t.t){if(-1==this.board[n]||t.f==n){o=!1;break}var h=this.pieces[this.board[n]];if(0==h.a||h.d>-1||h.s!=this.mWho){o=!1;break}}}if(o){if(3==this.menCount[-this.mWho]&&0==this.placing)return void this.mMoves.push({f:t.f,t:t.t,c:-2});for(var a=[],r=0;r<this.pieces.length;r++){var h=this.pieces[r];if(1==h.a&&-1==h.d&&h.s==-this.mWho){var l={f:t.f,t:t.t,c:h.p};a.push(l)}}if(0==i.mOptions.poundInMill){var c={};for(var f in i.g.Triplets)if(i.g.Triplets.hasOwnProperty(f)){var d=i.g.Triplets[f];-1!=this.board[d[0]]&&this.pieces[this.board[d[0]]].s==-this.mWho&&-1!=this.board[d[1]]&&this.pieces[this.board[d[1]]].s==-this.mWho&&-1!=this.board[d[2]]&&this.pieces[this.board[d[2]]].s==-this.mWho&&(c[d[0]]=!0,c[d[1]]=!0,c[d[2]]=!0)}for(var v=[],f=0;f<a.length;f++)c[a[f].c]||v.push(a[f]);v.length>0&&(a=v)}return void(this.mMoves=this.mMoves.concat(a))}}this.mMoves.push({f:t.f,t:t.t,c:-1})},Model.Board.Evaluate=function(i,t,e){if(i.GetRepeatOccurence(this)>2)return this.mFinished=!0,void(this.mWinner=JocGame.DRAW);if(0==this.placing){if(this.menCount[JocGame.PLAYER_A]<3)return this.mFinished=!0,void(this.mWinner=JocGame.PLAYER_B);if(this.menCount[JocGame.PLAYER_B]<3)return this.mFinished=!0,void(this.mWinner=JocGame.PLAYER_A)}var s=this.menCount[JocGame.PLAYER_A]-this.menCount[JocGame.PLAYER_B],o=0,r=0;for(var n in i.g.Triplets)if(i.g.Triplets.hasOwnProperty(n)){for(var h={"-1":0,0:0,1:0},a=i.g.Triplets[n],l=0;l<3;l++){var c=a[l],f=this.board[c];if(f>-1){var d=this.pieces[f];h[d.s]++}}1==h[1]&&0==h[-1]?o++:2==h[1]&&0==h[-1]&&r++,1==h[-1]&&0==h[1]?o--:2==h[-1]&&0==h[1]&&r--}this.mEvaluation=10*s,this.mEvaluation+=1*o,this.mEvaluation+=3*r},Model.Board.ApplyMove=function(i,t){if(this.placing){var e=this.dock[this.mWho].shift(),s=this.pieces[e];s.d=-1,s.p=t.t,this.board[t.t]=e,this.lastMoveIndex=e,this.menCount[this.mWho]++,0==this.dock[JocGame.PLAYER_B].length&&(this.placing=!1)}else{var s=this.pieces[this.board[t.f]];this.board[s.p]=-1,this.board[t.t]=s.i,s.p=t.t,this.lastMoveIndex=s.i}if(t.c>-1){var e=this.board[t.c];this.board[t.c]=-1;var s=this.pieces[e];s.a=!1,this.menCount[-this.mWho]--}else-2==t.c&&this.menCount[-this.mWho]--},Model.Board.IsValidMove=function(i,t){return!0},Model.Game.InitGameExtra=function(){},Model.Game.BuildGraphCoord=function(){this.g.Graph=[[1,3,null,null],[2,4,0,null],[null,5,1,null],[4,6,null,0],[5,7,3,1],[null,8,4,2],[7,null,null,3],[8,null,6,4],[null,null,7,5]],this.g.Coord=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]],this.g.Triplets=[[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8]]};