1+ var isX = true ;
2+ var isValid = false ;
3+ var cells = [ ] ;
4+ var player = 1 ;
5+ var computer = 0 ;
6+ var currentPlayer = 1 ;
7+ var result = "" ;
8+ var intervalId ;
9+
10+ $ ( document ) . ready ( function ( ) {
11+ $ ( "#dialog" ) . dialog ( {
12+ resizable : false ,
13+ height : 160 ,
14+ modal : true ,
15+ buttons : {
16+ "X" : function ( ) {
17+ isX = true ;
18+ $ ( this ) . dialog ( "close" ) ;
19+ startGame ( ) ;
20+ } ,
21+ "O" : function ( ) {
22+ isX = false ;
23+ $ ( this ) . dialog ( "close" ) ;
24+ startGame ( ) ;
25+ }
26+ }
27+ } ) ;
28+ } ) ;
29+
30+ function startGame ( ) {
31+ emptyCells ( ) ;
32+ if ( isX ) {
33+ player = 1 ;
34+ computer = 0 ;
35+ } else {
36+ player = 0 ;
37+ computer = 1 ;
38+ }
39+
40+ var rnd = Math . round ( Math . random ( ) ) ;
41+ if ( rnd === 1 ) {
42+ currentPlayer = player ;
43+ } else {
44+ currentPlayer = computer ;
45+ }
46+ intervalId = setInterval ( loop , 100 ) ;
47+ }
48+
49+ function loop ( ) {
50+ if ( currentPlayer === player ) {
51+ isValid = true ;
52+ } else {
53+ computerMove ( ) ;
54+ currentPlayer = player ;
55+ }
56+
57+ $ ( ".cell" ) . on ( "click" , function ( ) {
58+ if ( isValid ) {
59+ var sign = player === 0 ? "O" : "X" ;
60+
61+ var i = $ ( this ) . attr ( "id" ) [ 1 ] - 1 ;
62+ var j = $ ( this ) . attr ( "id" ) [ 2 ] - 1 ;
63+ if ( cells [ i ] [ j ] === - 1 ) {
64+ cells [ i ] [ j ] = player ;
65+ $ ( this ) . html ( sign ) ;
66+ isValid = false ;
67+ if ( ! whoWon ( cells ) ) {
68+ currentPlayer = computer ;
69+ }
70+ }
71+ }
72+ } ) ;
73+
74+ var winner = whoWon ( cells ) ;
75+ if ( winner ) {
76+ if ( winner === "computer" ) {
77+ alert ( "You Lost, Better Luck Next Time." ) ;
78+ } else {
79+ alert ( "Congratulations! You Won." ) ;
80+ }
81+ result = winner ;
82+ }
83+ else if ( isTableFull ( cells ) ) {
84+ result = "Tie" ;
85+ alert ( "Its a tie" ) ;
86+ }
87+ if ( result !== "" ) {
88+ clearInterval ( intervalId ) ;
89+ result = "" ;
90+ cells = [ ] ;
91+ clearTable ( ) ;
92+ startGame ( ) ;
93+ }
94+ }
95+
96+
97+ function isTableFull ( cells ) {
98+ for ( var i in cells ) {
99+ for ( var j in cells [ i ] ) {
100+ if ( cells [ i ] [ j ] === - 1 ) {
101+ return false ;
102+ }
103+ }
104+ }
105+ return true ;
106+ }
107+
108+ function whoWon ( cells ) {
109+ //horizontal match
110+ for ( var i in cells ) {
111+ if ( cells [ i ] [ 0 ] !== - 1 &&
112+ cells [ i ] [ 1 ] !== - 1 &&
113+ cells [ i ] [ 2 ] !== - 1 &&
114+ cells [ i ] [ 0 ] === cells [ i ] [ 1 ] && cells [ i ] [ 0 ] === cells [ i ] [ 2 ] ) {
115+ if ( cells [ i ] [ 0 ] === player ) {
116+ return "player" ;
117+ }
118+ else {
119+ return "computer" ;
120+ }
121+ }
122+ }
123+ //vertical match
124+ for ( var i in cells ) {
125+ if ( cells [ 0 ] [ i ] !== - 1 &&
126+ cells [ 1 ] [ i ] !== - 1 &&
127+ cells [ 2 ] [ i ] !== - 1 &&
128+ cells [ 0 ] [ i ] === cells [ 1 ] [ i ] && cells [ 0 ] [ i ] === cells [ 2 ] [ i ] ) {
129+ if ( cells [ 0 ] [ i ] === player ) {
130+ return "player" ;
131+ }
132+ else {
133+ return "computer" ;
134+ }
135+ }
136+ }
137+
138+ //diagonal match
139+ if ( ( cells [ 0 ] [ 0 ] !== - 1 &&
140+ cells [ 1 ] [ 1 ] !== - 1 &&
141+ cells [ 2 ] [ 2 ] !== - 1 &&
142+ cells [ 0 ] [ 0 ] === cells [ 1 ] [ 1 ] && cells [ 0 ] [ 0 ] === cells [ 2 ] [ 2 ] ) ||
143+ ( cells [ 0 ] [ 2 ] !== - 1 &&
144+ cells [ 1 ] [ 1 ] !== - 1 &&
145+ cells [ 2 ] [ 0 ] !== - 1 &&
146+ cells [ 0 ] [ 2 ] === cells [ 1 ] [ 1 ] && cells [ 0 ] [ 2 ] === cells [ 2 ] [ 0 ] ) ) {
147+ if ( cells [ 1 ] [ 1 ] === player ) {
148+ return "player" ;
149+ }
150+ else {
151+ return "computer" ;
152+ }
153+ }
154+
155+ return false ;
156+ }
157+
158+ function computerMove ( ) {
159+ var arr = freeCells ( ) ;
160+ var arr2 = bestMove ( ) ;
161+ var sign = computer === 0 ? "O" : "X" ;
162+ var x = Math . round ( Math . random ( ) * arr . length ) ;
163+
164+ if ( arr2 . length >= 1 ) {
165+ var i = arr2 [ 0 ] ;
166+ var j = arr2 [ 1 ] ;
167+ } else if ( arr . length >= 1 ) {
168+ var i = arr [ x ] [ 0 ] ;
169+ var j = arr [ x ] [ 1 ] ;
170+ }
171+ if ( ( arr . length >= 1 || arr2 . length >= 1 ) && cells [ i ] [ j ] === - 1 ) {
172+ var a = parseInt ( i ) + 1 ;
173+ var b = parseInt ( j ) + 1 ;
174+ new Promise ( function ( resolve , reject ) {
175+ $ ( "#c" + a + b ) . html ( sign ) ;
176+ resolve ( ) ;
177+ } ) . then ( function ( ) {
178+ cells [ i ++ ] [ j ++ ] = computer ;
179+ } )
180+ return 0 ;
181+ }
182+ }
183+
184+ function freeCells ( ) {
185+ var arr = [ ] ;
186+ for ( var i in cells ) {
187+ for ( var j in cells [ i ] ) {
188+ if ( cells [ i ] [ j ] === - 1 ) {
189+ arr . push ( [ i , j ] ) ;
190+ }
191+ }
192+ }
193+ return arr ;
194+ }
195+
196+ function bestMove ( ) {
197+ var computerInLine = 0 ;
198+ var playerInLine = 0 ;
199+ var a = 0 ;
200+ var maybe = null ;
201+ //check rows
202+ for ( var i in cells ) {
203+ for ( var j in cells [ i ] ) {
204+ if ( cells [ i ] [ j ] !== - 1 ) {
205+ if ( cells [ i ] [ j ] === computer ) {
206+ computerInLine ++ ;
207+ } else {
208+ playerInLine ++ ;
209+ }
210+ } else {
211+ a = j ;
212+ }
213+ }
214+ if ( computerInLine === 2 && a !== 0 ) {
215+ return [ i , a ] ;
216+ } else if ( playerInLine === 2 && a !== 0 ) {
217+ maybe = [ i , a ] ;
218+ }
219+ a = 0 ;
220+ computerInLine = 0 ;
221+ playerInLine = 0 ;
222+ }
223+
224+ //check columns
225+ for ( var j in cells ) {
226+ for ( var i in cells [ i ] ) {
227+ if ( cells [ i ] [ j ] !== - 1 ) {
228+ if ( cells [ i ] [ j ] === computer ) {
229+ computerInLine ++ ;
230+ } else {
231+ playerInLine ++ ;
232+ }
233+ } else {
234+ a = i ;
235+ }
236+ }
237+ if ( computerInLine === 2 && a !== 0 ) {
238+ return [ a , j ] ;
239+ } else if ( playerInLine === 2 && a !== 0 ) {
240+ maybe = [ a , j ] ;
241+ }
242+ a = 0 ;
243+ computerInLine = 0 ;
244+ playerInLine = 0 ;
245+ }
246+
247+ //check diagonals
248+ var h = 0 ;
249+ a = - 1 ;
250+ var b = - 1 ;
251+ playerInLine = 0 ;
252+ computerInLine = 0 ;
253+ for ( var k = 0 ; k < 3 ; k ++ ) {
254+ if ( cells [ k ] [ h ] !== - 1 ) {
255+ if ( cells [ k ] [ h ] === computer ) {
256+ computerInLine ++ ;
257+ } else {
258+ playerInLine ++ ;
259+ }
260+ } else {
261+ a = k ;
262+ b = h ;
263+ }
264+
265+ if ( computerInLine === 2 && a !== - 1 && b !== - 1 ) {
266+ return [ a , b ] ;
267+ } else if ( playerInLine === 2 && a !== - 1 && b != - 1 ) {
268+ maybe = [ a , b ] ;
269+ }
270+
271+ h ++ ;
272+ }
273+
274+ h = 0 ;
275+ a = - 1 ;
276+ b = - 1 ;
277+ playerInLine = 0 ;
278+ computerInLine = 0 ;
279+
280+ for ( var k = 2 ; k >= 0 ; k -- ) {
281+ if ( cells [ k ] [ h ] !== - 1 ) {
282+ if ( cells [ k ] [ h ] === computer ) {
283+ computerInLine ++ ;
284+ } else {
285+ playerInLine ++ ;
286+ }
287+ } else {
288+ a = k ;
289+ b = h ;
290+ }
291+
292+ if ( computerInLine === 2 && a !== - 1 && b !== - 1 ) {
293+ return [ a , b ] ;
294+ } else if ( playerInLine === 2 && a !== - 1 && b != - 1 ) {
295+ maybe = [ a , b ] ;
296+ }
297+
298+ h ++ ;
299+ }
300+
301+ if ( maybe !== null ) return maybe ;
302+ return [ ] ;
303+ }
304+
305+ function clearTable ( ) {
306+ for ( var a = 1 ; a <= 3 ; a ++ ) {
307+ for ( var b = 1 ; b <= 3 ; b ++ ) {
308+ $ ( "#c" + a + b ) . html ( "" ) ;
309+ }
310+ }
311+ }
312+
313+ function emptyCells ( ) {
314+ for ( var a = 0 ; a < 3 ; a ++ ) {
315+ cells . push ( [ - 1 , - 1 , - 1 ] ) ;
316+ }
317+ }
0 commit comments