1
1
using System ;
2
2
using System . Collections . Generic ;
3
- using System . Linq ;
4
3
using Board ;
5
4
using Interaction ;
6
5
using UnityEngine ;
@@ -18,15 +17,11 @@ private struct MiniMaxValue
18
17
{
19
18
public int Value ;
20
19
public int Column ;
21
- public int Alpha ;
22
- public int Beta ;
23
20
24
- public MiniMaxValue ( int value , int column , int alpha , int beta )
21
+ public MiniMaxValue ( int value , int column )
25
22
{
26
23
Value = value ;
27
24
Column = column ;
28
- Alpha = alpha ;
29
- Beta = beta ;
30
25
}
31
26
}
32
27
@@ -44,34 +39,34 @@ public Column ExecuteAlgorithm(BoardInfo boardInfo)
44
39
45
40
int alpha = int . MinValue , beta = int . MaxValue ;
46
41
MiniMaxValue result = MiniMaxAlgorithm ( startNode , depth - 1 , alpha , beta , Player . Max ) ;
47
- Debug . Log ( $ "Final:\n value: { result . Value } , column: { result . Column } ") ;
42
+ // Debug.Log($"Final:\n value: {result.Value}, column: {result.Column}");
48
43
return boardInfo . Columns [ result . Column ] ;
49
44
}
50
45
51
46
private MiniMaxValue MiniMaxAlgorithm ( Node currentNode , int actualDepth , int alpha , int beta , Player player )
52
47
{
53
- Debug . Log ( $ "Depth: { actualDepth } ") ;
48
+ int column = 0 ;
49
+ // Debug.Log($"Depth: {actualDepth}");
54
50
55
51
// Suspend
56
52
if ( currentNode . Draw ( ) || actualDepth == 0 )
57
53
{
58
54
int value = currentNode . Evaluate ( ) ;
59
- int column = currentNode . ColumnSelected ;
55
+ column = currentNode . ColumnSelected ;
60
56
61
- Debug . Log ( $ "Value: { value } ") ;
62
- return new MiniMaxValue ( value , column , alpha , beta ) ;
57
+ // Debug.Log($"Value: {value}");
58
+ return new MiniMaxValue ( value , column ) ;
63
59
}
64
60
65
61
List < Node > nodes = currentNode . CreateNodes ( ) ;
66
- Debug . Log ( $ "nodes: { nodes . Count } ") ;
62
+ // Debug.Log($"nodes: {nodes.Count}");
67
63
68
64
if ( player == Player . Min )
69
65
{
70
66
int minEval = int . MaxValue ;
71
- int column = 0 ;
72
67
for ( int i = 0 ; i < nodes . Count ; ++ i )
73
68
{
74
- Debug . Log ( $ "node: { nodes [ i ] } ") ;
69
+ // Debug.Log($"node: {nodes[i]}");
75
70
if ( nodes [ i ] == null ) continue ;
76
71
MiniMaxValue eval = MiniMaxAlgorithm ( nodes [ i ] , actualDepth - 1 , alpha , beta , Player . Max ) ;
77
72
if ( minEval > eval . Value )
@@ -81,19 +76,18 @@ private MiniMaxValue MiniMaxAlgorithm(Node currentNode, int actualDepth, int alp
81
76
}
82
77
beta = Math . Min ( beta , eval . Value ) ;
83
78
84
- Debug . Log ( $ "Depth: { actualDepth } , alpha: { alpha } , beta: { beta } , i: { i } ") ;
79
+ // Debug.Log($"Depth: {actualDepth}, alpha: {alpha}, beta: {beta}, i: {i}");
85
80
if ( alpha >= beta )
86
- return new MiniMaxValue ( minEval , column , beta , alpha ) ;
81
+ return new MiniMaxValue ( minEval , column ) ;
87
82
}
88
- return new MiniMaxValue ( minEval , column , beta , alpha ) ;
83
+ return new MiniMaxValue ( minEval , column ) ;
89
84
}
90
85
else
91
86
{
92
87
int maxEval = int . MinValue ;
93
- int column = 0 ;
94
88
for ( int i = 0 ; i < nodes . Count ; ++ i )
95
89
{
96
- Debug . Log ( $ "node: { nodes [ i ] } ") ;
90
+ // Debug.Log($"node: {nodes[i]}");
97
91
if ( nodes [ i ] == null ) continue ;
98
92
MiniMaxValue eval = MiniMaxAlgorithm ( nodes [ i ] , actualDepth - 1 , alpha , beta , Player . Min ) ;
99
93
if ( maxEval < eval . Value )
@@ -103,75 +97,14 @@ private MiniMaxValue MiniMaxAlgorithm(Node currentNode, int actualDepth, int alp
103
97
}
104
98
alpha = Math . Max ( alpha , eval . Value ) ;
105
99
106
- Debug . Log ( $ "Depth: { actualDepth } , alpha: { alpha } , beta: { beta } , " +
107
- $ "column: { column } , maxEval: { maxEval } i: { i } ") ;
100
+ // Debug.Log($"Depth: {actualDepth}, alpha: {alpha}, beta: {beta}, " +
101
+ // $"column: {column}, maxEval: {maxEval} i: {i}");
108
102
if ( alpha >= beta )
109
- return new MiniMaxValue ( maxEval , column , beta , alpha ) ;
103
+ return new MiniMaxValue ( maxEval , column ) ;
110
104
}
111
- return new MiniMaxValue ( maxEval , column , beta , alpha ) ;
105
+ return new MiniMaxValue ( maxEval , column ) ;
112
106
}
113
107
}
114
-
115
- private ( int , int ) MiniValue ( Node currentNode , int actualDepth , int alpha , int beta )
116
- {
117
- Debug . Log ( $ "Depth: { actualDepth } ") ;
118
-
119
- // Suspend
120
- if ( currentNode . Draw ( ) || actualDepth == 0 )
121
- {
122
- int value = currentNode . Evaluate ( ) ;
123
- Debug . Log ( $ "Value: { value } ") ;
124
- return ( value , beta ) ;
125
- }
126
-
127
- List < Node > nodes = currentNode . CreateNodes ( ) ;
128
-
129
- int nodeAlpha = alpha ;
130
- int nodeBeta = beta ;
131
-
132
- for ( int i = 0 ; i < nodes . Count ; ++ i )
133
- {
134
- if ( nodes [ i ] == null ) continue ;
135
- var ( newBeta , newAlpha ) = MaxValue ( nodes [ i ] , actualDepth - 1 , nodeAlpha , nodeBeta ) ;
136
- beta = Math . Min ( beta , newBeta ) ;
137
- alpha = newAlpha ;
138
- Debug . Log ( $ "Depth: { actualDepth } , alpha: { alpha } , beta: { beta } ") ;
139
- if ( alpha >= beta )
140
- return ( beta , alpha ) ;
141
- }
142
- return ( beta , alpha ) ;
143
- }
144
-
145
- private ( int , int ) MaxValue ( Node currentNode , int actualDepth , int alpha , int beta )
146
- {
147
- Debug . Log ( $ "Depth: { actualDepth } ") ;
148
-
149
- // Suspend
150
- if ( currentNode . Draw ( ) || actualDepth == 0 )
151
- {
152
- int value = currentNode . Evaluate ( ) ;
153
- Debug . Log ( $ "Value: { value } ") ;
154
- return ( alpha , value ) ;
155
- }
156
-
157
- List < Node > nodes = currentNode . CreateNodes ( ) ;
158
-
159
- int nodeAlpha = alpha ;
160
- int nodeBeta = beta ;
161
-
162
- for ( int i = 0 ; i < nodes . Count ; ++ i )
163
- {
164
- if ( nodes [ i ] == null ) continue ;
165
-
166
- var ( newBeta , newAlpha ) = MiniValue ( nodes [ i ] , actualDepth - 1 , nodeAlpha , nodeBeta ) ;
167
- alpha = Math . Max ( alpha , newAlpha ) ;
168
- beta = newBeta ;
169
- Debug . Log ( $ "Depth: { actualDepth } , alpha: { alpha } , beta: { beta } ") ;
170
- if ( alpha >= beta )
171
- return ( beta , alpha ) ;
172
- }
173
- return ( beta , alpha ) ;
174
- }
175
108
}
176
109
177
110
public class Node
@@ -185,23 +118,23 @@ public Node(BoardInfo boardInfo, int turn)
185
118
_boardState = new BoardState ( boardInfo ) ;
186
119
_turn = turn ;
187
120
}
188
-
189
- public Node ( BoardState boardState , int turn )
121
+
122
+ private Node ( BoardState boardState , int turn )
190
123
{
191
124
_boardState = new BoardState ( boardState ) ;
192
125
_turn = turn ;
193
126
}
194
127
195
- public bool Draw ( ) => _boardState . Draw ( ) ;
128
+ public bool Draw ( ) => false ;
196
129
197
130
public int Evaluate ( )
198
131
{
199
132
bool player = _boardState . Winner ( ( int ) Player . Min ) ;
200
133
bool ai = _boardState . Winner ( ( int ) Player . Max ) ;
201
134
202
- Debug . Log ( $ "{ player } , { ai } ") ;
203
- if ( player ) return - 1000 ;
135
+ // Debug.Log($"{player}, {ai}");
204
136
if ( ai ) return 1000 ;
137
+ if ( player ) return - 1000 ;
205
138
return UnityEngine . Random . Range ( - 100 , 100 ) ;
206
139
}
207
140
@@ -225,7 +158,7 @@ public List<Node> CreateNodes()
225
158
Node node = new Node ( _boardState , nextTurn ) ;
226
159
int disc = node . _boardState . FirstDiscInColumn ( i ) ;
227
160
228
- Debug . Log ( $ "Disc: { disc } , Column: { _columnSelected } ") ;
161
+ // Debug.Log($"Disc: {disc}, Column: {_columnSelected}");
229
162
node . _boardState . AddDisc ( disc , nextTurn ) ;
230
163
node . _columnSelected = i ;
231
164
list . Add ( node ) ;
0 commit comments