1+ ( function ( $ ) {
2+
3+ $ ( document ) . ready ( function ( ) {
4+ Board = { } ;
5+
6+ var console = window . console || {
7+ warn : function ( ) { } ,
8+ info : function ( ) { }
9+ } ;
10+
11+ var container = $ ( '#board' ) ;
12+ var resetingBoard = false ;
13+ Board . dimension = parseInt ( container . attr ( 'data-dimension' ) ) ;
14+ Board . menCount = ( Board . dimension / 2 ) * ( ( Board . dimension - 2 ) / 2 ) ;
15+ Board . options = {
16+ canCaptureBackwards : true ,
17+ kingCanCaptureBackwards : true
18+ } ;
19+ Board . men = [ ] ;
20+ Board . boxes = [ ] ;
21+ Board . state = new state . State ( ) ;
22+
23+ function capture ( captureI , captureJ ) {
24+ var targetMan = Board . manAt ( captureI , captureJ ) ;
25+ Board . men [ captureI * Board . dimension + captureJ ] = null ;
26+ targetMan . element . detach ( ) ;
27+ }
28+
29+ Board . move = function ( i , j , man ) {
30+
31+ if ( ! resetingBoard ) {
32+ var i0 = man . position . i ;
33+ var j0 = man . position . j ;
34+
35+ var moveObj = Board . state . getMoveObject ( i0 , j0 , i , j ) ;
36+ if ( typeof moveObj == "string" ) {
37+ var message = state . moveError [ moveObj ] ;
38+ console . warn ( message ) ;
39+ if ( typeof Board . onInvalidMove == 'function' ) {
40+ Board . onInvalidMove ( message ) ;
41+ }
42+ return false ;
43+ }
44+ if ( moveObj . isCapture ) { //If the game has capture moves
45+ var captureI = i0 + ( ( i - i0 ) / Math . abs ( i - i0 ) ) ;
46+ var captureJ = j0 + ( ( j - j0 ) / Math . abs ( j - j0 ) ) ;
47+ capture ( captureI , captureJ ) ;
48+ }
49+
50+ this . men [ i0 * this . dimension + j0 ] = null ;
51+ }
52+
53+
54+ this . men [ i * this . dimension + j ] = man ;
55+ Board . boxAt ( i , j ) . append ( man . element ) ;
56+ man . position . i = i ;
57+ man . position . j = j ;
58+
59+
60+ if ( ! resetingBoard ) {
61+ if ( Board . state . turn == state . WHITE && i == 0 && ! man . isKing ) man . setKing ( true ) ;
62+ if ( Board . state . turn == state . BLACK && i == ( Board . dimension - 1 ) && ! man . isKing ) man . setKing ( true ) ;
63+
64+ Board . state . setMove ( { i0 :i0 , j0 :j0 , i :i , j :j } , moveObj . isCapture ) ;
65+
66+ if ( typeof Board . onMove == 'function' ) Board . onMove ( ) ;
67+ }
68+ return true ;
69+ } ;
70+ Board . manAt = function ( i , j ) {
71+ return this . men [ i * this . dimension + j ] ;
72+ } ;
73+ Board . boxAt = function ( i , j ) {
74+ return this . boxes [ i * this . dimension + j ] ;
75+ } ;
76+ Board . reset = function ( ) {
77+ resetingBoard = true ;
78+
79+ Board . state = new state . State ( ) ;
80+
81+ var d = Board . dimension * Board . dimension ;
82+ var i ;
83+ for ( i = 0 ; i < d ; i ++ ) {
84+ this . men [ i ] = null ;
85+ }
86+
87+ Board . state [ state . WHITE ] = [ ] ;
88+ Board . state [ state . BLACK ] = [ ] ;
89+
90+ d = Board . dimension / 2 ;
91+ for ( i = 0 ; i < Board . menCount ; i ++ ) {
92+ var mi = Math . floor ( i / d ) ;
93+ var mjw = 2 * ( i % d ) ;
94+ var mj = mjw + 1 ;
95+ if ( mi % 2 == 1 ) {
96+ mjw ++ ;
97+ mj -- ;
98+ }
99+
100+
101+ recycler . allMen . black [ i ] . setKing ( false ) ;
102+ recycler . allMen . white [ i ] . setKing ( false ) ;
103+
104+ recycler . allMen . black [ i ] . moveTo ( mi , mj ) ;
105+ recycler . allMen . white [ i ] . moveTo ( Board . dimension - 1 - mi , mjw ) ;
106+
107+ var man = new state . Man ( ) ;
108+ man . i = recycler . allMen . black [ i ] . position . i ;
109+ man . j = recycler . allMen . black [ i ] . position . j ;
110+ Board . state [ state . BLACK ] . push ( man ) ;
111+
112+ man = new state . Man ( ) ;
113+ man . i = recycler . allMen . white [ i ] . position . i ;
114+ man . j = recycler . allMen . white [ i ] . position . j ;
115+ Board . state [ state . WHITE ] . push ( man ) ;
116+
117+ }
118+
119+ Board . state . turn = state . WHITE ;
120+ d = Board . dimension * Board . dimension ;
121+ for ( i = 0 ; i < d ; i ++ ) {
122+
123+ if ( this . men [ i ] ) {
124+ this . state . colorMatrix [ i ] = this . men [ i ] . color ;
125+ } else {
126+ this . state . colorMatrix [ i ] = state . NONE ;
127+ }
128+ this . state . kingMatrix [ i ] = false ;
129+ }
130+ resetingBoard = false ;
131+ } ;
132+ Board . playerType = { } ;
133+ Board . playerType [ state . WHITE ] = 'human' ;
134+ Board . playerType [ state . BLACK ] = 'computer' ;
135+
136+ Board . playerDifficulty = { } ;
137+ Board . playerDifficulty [ state . WHITE ] = 1 ;
138+ Board . playerDifficulty [ state . BLACK ] = 1 ;
139+
140+
141+ function boxClick ( evt ) {
142+ if ( Board . playerType [ Board . state . turn ] == 'computer' ) return ;
143+ var i = evt . data . i , j = evt . data . j ;
144+ var man = Board . manAt ( i , j ) ;
145+ if ( ! man ) {
146+ if ( boxClick . currentMan ) {
147+ if ( boxClick . currentMan . moveTo ( i , j ) ) {
148+ boxClick . currentMan = null ;
149+ boxClick . currenBox . removeAttr ( 'data-selected' ) ;
150+ boxClick . currenBox = null ;
151+ }
152+ }
153+ } else {
154+ if ( man . color == Board . state . turn ) {
155+ if ( boxClick . currenBox ) {
156+ boxClick . currenBox . removeAttr ( 'data-selected' ) ;
157+ }
158+ boxClick . currentMan = man ;
159+ boxClick . currenBox = $ ( this ) ;
160+ boxClick . currenBox . attr ( 'data-selected' , Board . state . turn == state . WHITE ? 'white' : 'black' ) ;
161+ }
162+ }
163+ }
164+ boxClick . currentMan = null ;
165+ boxClick . currenBox = null ;
166+
167+ var recycler = {
168+ allMen : {
169+ white : [ ] ,
170+ black : [ ]
171+ }
172+ } ;
173+
174+ function Man ( color ) {
175+ this . element = $ ( '<div class="Checkers-Man"><div class="Checkers-KingTag"></div></div>' ) ;
176+ this . color = color ;
177+ this . element . attr ( 'data-color' , color == state . WHITE ? 'white' : 'black' ) ;
178+ this . position = {
179+ i : 0 ,
180+ j : 0
181+ } ;
182+ this . king = false ;
183+ }
184+ Man . prototype . moveTo = function ( i , j ) {
185+ return Board . move ( i , j , this ) ;
186+ } ;
187+ Man . prototype . setKing = function ( isKing ) {
188+ this . king == ! ! isKing ;
189+ if ( isKing ) this . element . attr ( 'data-king' , 1 ) ;
190+ else this . element . removeAttr ( 'data-king' ) ;
191+ } ;
192+
193+ //Creating all the men necessary
194+ ( function ( ) {
195+ for ( var i = 0 ; i < Board . menCount ; i ++ ) {
196+ var w = new Man ( state . WHITE ) ;
197+ var b = new Man ( state . BLACK ) ;
198+ recycler . allMen . white . push ( w ) ;
199+ recycler . allMen . black . push ( b ) ;
200+ }
201+ } ) ( ) ;
202+
203+ //Creating board boxes
204+ ( function ( ) {
205+ var d = Board . dimension ;
206+ for ( var i = 0 ; i < d ; i ++ ) {
207+ var $row = $ ( '<div class="Checkers-Row"></div>' ) ;
208+ container . append ( $row ) ;
209+ for ( var j = 0 ; j < d ; j ++ ) {
210+ var $box = $ ( '<div class="Checkers-Box" data-color="' + ( ( i + j ) % 2 == 1 ? 'black' : 'white' ) + '"></div>' ) ;
211+ $row . append ( $box ) ;
212+ $box . bind ( 'click' , { i :i , j :j } , boxClick ) ;
213+ Board . boxes [ i * d + j ] = $box ;
214+ Board . men [ i * d + j ] = null ;
215+ }
216+ }
217+ } ) ( ) ;
218+
219+ Board . reset ( ) ;
220+
221+ function computerMove ( ) {
222+ var newState = Board . state . search ( Board . playerDifficulty [ Board . state . turn ] ) ;
223+ console . info ( newState ) ;
224+ console . info ( newState . toString ( ) ) ;
225+ Board . move ( newState . move . i , newState . move . j , Board . manAt ( newState . move . i0 , newState . move . j0 ) ) ;
226+ }
227+
228+ Board . onMove = function ( ) {
229+ clearTimeout ( Board . onMove . moveTimeoutId ) ;
230+
231+ if ( typeof Board . onTurnEnd == 'function' ) {
232+ Board . onTurnEnd ( state . opositeColor ( Board . state . turn ) ) ;
233+ }
234+
235+
236+ if ( Board . state . getPossibleMoves ( ) . length == 0 && Board . state . captureMoves . length == 0 ) {
237+ if ( typeof Board . onFinish == 'function' ) {
238+ Board . onFinish ( state . opositeColor ( Board . state . turn ) ) ;
239+ }
240+ return ;
241+ }
242+
243+ if ( typeof Board . onTurnStart == 'function' ) {
244+ Board . onTurnStart ( Board . state . turn ) ;
245+ }
246+
247+ if ( Board . playerType [ Board . state . turn ] == 'computer' ) {
248+ Board . onMove . moveTimeoutId = setTimeout ( computerMove , 500 ) ;
249+ }
250+ } ;
251+ Board . onMove . moveTimeoutId = null ;
252+
253+ Board . onFinish = null ;
254+
255+ Board . onTurnStart = null ;
256+
257+ Board . onTurnEnd = null ;
258+
259+ Board . onInvalidMove = null ;
260+ } ) ;
261+
262+ } ) ( jQuery ) ;
0 commit comments