1+ // **************************************************************** //
2+ //
3+ // Copyright (c) RimuruDev. All rights reserved.
4+ // Contact me:
5+ // - Gmail: rimuru.dev@gmail.com
6+ // - GitHub: https://github.com/RimuruDev
7+ // - LinkedIn: https://www.linkedin.com/in/rimuru/
8+ // - GitHub Organizations: https://github.com/Rimuru-Dev
9+ //
10+ // **************************************************************** //
11+
12+ #if UNITY_EDITOR
13+ using UnityEditor ;
14+ using UnityEngine ;
15+
16+ namespace RimuruDev . Internal . Codebase . Editor
17+ {
18+ public sealed class TicTacToeEditorWindow : EditorWindow
19+ {
20+ private const string WindowName = "Tic Tac Toe" ;
21+ private const string GameOverTitle = "Game Over :(" ;
22+ private const string WinMessage = " Wins!" ;
23+ private const string OK = "OK" ;
24+ private const int BoardWidth = 100 ;
25+ private const int BoardHeight = 100 ;
26+
27+ private readonly string [ , ] Board = new string [ 3 , 3 ] ;
28+ private bool isXTurn = true ;
29+
30+ [ MenuItem ( "RimuruDev Games/" + nameof ( WindowName ) ) ]
31+ public static void ShowWindow ( ) =>
32+ GetWindow < TicTacToeEditorWindow > ( WindowName ) ;
33+
34+ private void OnEnable ( ) =>
35+ ResetBoard ( ) ;
36+
37+ private void OnGUI ( )
38+ {
39+ DrawBoards ( ) ;
40+
41+ if ( GUILayout . Button ( "Reset Board" ) )
42+ ResetBoard ( ) ;
43+ }
44+
45+ private void DrawBoards ( )
46+ {
47+ for ( var i = 0 ; i < 3 ; i ++ )
48+ {
49+ EditorGUILayout . BeginHorizontal ( ) ;
50+ {
51+ for ( var j = 0 ; j < 3 ; j ++ )
52+ {
53+ if ( GUILayout . Button ( Board [ i , j ] , GUILayout . Width ( BoardWidth ) , GUILayout . Height ( BoardHeight ) ) )
54+ {
55+ if ( Board [ i , j ] == "" )
56+ {
57+ Board [ i , j ] = isXTurn ? "X" : "O" ;
58+ isXTurn = ! isXTurn ;
59+
60+ CheckForWinner ( ) ;
61+ }
62+ }
63+ }
64+ }
65+ EditorGUILayout . EndHorizontal ( ) ;
66+ }
67+ }
68+
69+ private void ResetBoard ( )
70+ {
71+ for ( var i = 0 ; i < 3 ; i ++ )
72+ {
73+ for ( var j = 0 ; j < 3 ; j ++ )
74+ {
75+ Board [ i , j ] = "" ;
76+ }
77+ }
78+
79+ isXTurn = true ;
80+ }
81+
82+ private void CheckForWinner ( )
83+ {
84+ if ( Board == null )
85+ return ;
86+
87+ CheckingLines ( ) ;
88+
89+ CheckingColumns ( ) ;
90+
91+ CheckingDiagonals ( ) ;
92+
93+ CheckingTheDraw ( ) ;
94+ }
95+
96+ private void CheckingLines ( )
97+ {
98+ for ( var i = 0 ; i < 3 ; i ++ )
99+ {
100+ if ( Board [ i , 0 ] == Board [ i , 1 ] && Board [ i , 1 ] == Board [ i , 2 ] && Board [ i , 0 ] != "" )
101+ {
102+ EditorUtility . DisplayDialog ( GameOverTitle , Board [ i , 0 ] + WinMessage , OK ) ;
103+ ResetBoard ( ) ;
104+ return ;
105+ }
106+ }
107+ }
108+
109+ private void CheckingColumns ( )
110+ {
111+ for ( var i = 0 ; i < 3 ; i ++ )
112+ {
113+ if ( Board [ 0 , i ] == Board [ 1 , i ] && Board [ 1 , i ] == Board [ 2 , i ] && Board [ 0 , i ] != "" )
114+ {
115+ EditorUtility . DisplayDialog ( GameOverTitle , Board [ 0 , i ] + WinMessage , OK ) ;
116+ ResetBoard ( ) ;
117+ return ;
118+ }
119+ }
120+ }
121+
122+ private void CheckingDiagonals ( )
123+ {
124+ if ( Board [ 0 , 0 ] == Board [ 1 , 1 ] && Board [ 1 , 1 ] == Board [ 2 , 2 ] && Board [ 0 , 0 ] != "" )
125+ {
126+ EditorUtility . DisplayDialog ( GameOverTitle , Board [ 0 , 0 ] + WinMessage , OK ) ;
127+ ResetBoard ( ) ;
128+ return ;
129+ }
130+
131+ if ( Board [ 0 , 2 ] == Board [ 1 , 1 ] && Board [ 1 , 1 ] == Board [ 2 , 0 ] && Board [ 0 , 2 ] != "" )
132+ {
133+ EditorUtility . DisplayDialog ( GameOverTitle , Board [ 0 , 2 ] + WinMessage , OK ) ;
134+ ResetBoard ( ) ;
135+ }
136+ }
137+
138+ private void CheckingTheDraw ( )
139+ {
140+ var isDraw = true ;
141+
142+ for ( var i = 0 ; i < 3 ; i ++ )
143+ {
144+ for ( var j = 0 ; j < 3 ; j ++ )
145+ {
146+ if ( Board [ i , j ] == "" )
147+ {
148+ isDraw = false ;
149+ break ;
150+ }
151+ }
152+ }
153+
154+ if ( isDraw )
155+ {
156+ EditorUtility . DisplayDialog ( GameOverTitle , "It's a Draw!" , OK ) ;
157+
158+ ResetBoard ( ) ;
159+ }
160+ }
161+ }
162+ }
163+ #endif
0 commit comments