@@ -26,6 +26,14 @@ import { rotateBoard } from "@/util/checkersCalculator";
26
26
27
27
const inter = Inter ( { subsets : [ "latin" ] } ) ;
28
28
29
+ export enum ConsoleMessageType {
30
+ Error = "error" ,
31
+ Info = "info" ,
32
+ Warning = "warning" ,
33
+ Success = "success" ,
34
+ }
35
+ export type ConsoleMessage = { msg : string ; msgType : ConsoleMessageType } ;
36
+
29
37
export default function Home ( { username } : { username : string } ) {
30
38
const [ selectedLang , setLang ] = useState ( SubmissionLanguage . Java ) ;
31
39
const [ file , setFile ] = useState ( "" ) ;
@@ -34,19 +42,16 @@ export default function Home({ username }: { username: string }) {
34
42
const [ currentTurn , setCurrentTurn ] = useState < Player | null > ( null ) ;
35
43
const [ board , setBoard ] = useState ( initialBoards [ player ] ) ;
36
44
37
- enum ConsoleMessageType {
38
- Error = "error" ,
39
- Info = "info" ,
40
- Warning = "warning" ,
41
- Success = "success" ,
42
- }
43
- type ConsoleMessage = { msg : string ; msgType : ConsoleMessageType } ;
44
45
const [ consoleOutput , setConsoleOutput ] = useState < ConsoleMessage [ ] > ( [ ] ) ;
45
46
46
47
useEffect ( ( ) => {
47
48
getInitialCode ( SubmissionLanguage . Java ) . then ( ( code ) => setFile ( code ) ) ;
48
49
} , [ ] ) ;
49
50
51
+ useEffect ( ( ) => {
52
+ setBoard ( initialBoards [ player ] ) ;
53
+ } , [ player ] ) ; // player can only change when the game is not ongoing
54
+
50
55
async function changeLang ( lang : SubmissionLanguage ) {
51
56
const currentInitialCode = await getInitialCode ( selectedLang ) ;
52
57
const wantedInitialCode = await getInitialCode ( lang ) ;
@@ -68,58 +73,57 @@ export default function Home({ username }: { username: string }) {
68
73
}
69
74
}
70
75
71
- function updateGame ( turnStatus : TurnStatus | AIError ) {
76
+ function updateGame (
77
+ turnStatus : TurnStatus | AIError ,
78
+ initialConsoleOutput ?: ConsoleMessage [ ]
79
+ ) {
80
+ let newConsoleOutput = initialConsoleOutput ?? consoleOutput ;
81
+
72
82
if ( "error" in turnStatus ) {
73
83
switch ( turnStatus . error ) {
74
84
case AIErrorType . NoSubmission :
75
- setConsoleOutput (
76
- consoleOutput . concat ( {
77
- msg : "No submission found" ,
78
- msgType : ConsoleMessageType . Error ,
79
- } )
80
- ) ;
85
+ newConsoleOutput = newConsoleOutput . concat ( {
86
+ msg : "No submission found" ,
87
+ msgType : ConsoleMessageType . Error ,
88
+ } ) ;
81
89
break ;
82
90
case AIErrorType . InvalidMove :
83
- setConsoleOutput (
84
- consoleOutput
85
- . concat ( {
86
- msg : "AI played invalid move" ,
87
- msgType : ConsoleMessageType . Error ,
88
- } )
89
- . concat ( {
90
- msg : turnStatus . move
91
- ? turnStatus . move . length == 1
92
- ? `Move from ${ turnStatus . move [ 0 ] . from } to ${ turnStatus . move [ 0 ] . to } is invalid`
93
- : "Sequence of moves is invalid : \n" +
94
- turnStatus . move
95
- . map ( ( m ) => `-> Move from ${ m . from } to ${ m . to } ` )
96
- . join ( "\n" )
97
- : "No move provided" ,
98
- msgType : ConsoleMessageType . Warning ,
99
- } )
100
- ) ;
101
- break ;
102
- case AIErrorType . InvalidOutput :
103
- setConsoleOutput (
104
- consoleOutput . concat ( {
105
- msg : "AI sent invalid output" ,
91
+ newConsoleOutput = newConsoleOutput
92
+ . concat ( {
93
+ msg : "AI played invalid move" ,
106
94
msgType : ConsoleMessageType . Error ,
107
95
} )
108
- ) ;
96
+ . concat ( {
97
+ msg : turnStatus . move
98
+ ? turnStatus . move . length == 1
99
+ ? `Move from ${ turnStatus . move [ 0 ] . from } to ${ turnStatus . move [ 0 ] . to } is invalid`
100
+ : "Sequence of moves is invalid : \n" +
101
+ turnStatus . move
102
+ . map ( ( m ) => `-> Move from ${ m . from } to ${ m . to } ` )
103
+ . join ( "\n" )
104
+ : "No move provided" ,
105
+ msgType : ConsoleMessageType . Warning ,
106
+ } ) ;
107
+ break ;
108
+ case AIErrorType . InvalidOutput :
109
+ newConsoleOutput = newConsoleOutput . concat ( {
110
+ msg : "AI sent invalid output" ,
111
+ msgType : ConsoleMessageType . Error ,
112
+ } ) ;
109
113
break ;
110
114
}
111
115
112
116
if ( turnStatus . ai_output && turnStatus . ai_output . length > 0 ) {
113
- setConsoleOutput (
114
- consoleOutput
115
- . concat ( { msg : "AI error" , msgType : ConsoleMessageType . Error } )
116
- . concat ( {
117
- msg : turnStatus . ai_output ,
118
- msgType : ConsoleMessageType . Warning ,
119
- } )
120
- ) ;
117
+ newConsoleOutput = newConsoleOutput
118
+ . concat ( { msg : "AI error" , msgType : ConsoleMessageType . Error } )
119
+ . concat ( {
120
+ msg : turnStatus . ai_output ,
121
+ msgType : ConsoleMessageType . Warning ,
122
+ } ) ;
121
123
}
122
124
125
+ setConsoleOutput ( newConsoleOutput ) ;
126
+
123
127
setGameOngoing ( false ) ;
124
128
} else {
125
129
setBoard ( rotateBoard ( turnStatus . game . board , player ) ) ; // update board with server response
@@ -155,12 +159,12 @@ export default function Home({ username }: { username: string }) {
155
159
stopGame ( username ) ;
156
160
setGameOngoing ( false ) ;
157
161
} else {
162
+ setBoard ( initialBoards [ player ] ) ;
163
+ setConsoleOutput ( [ ] ) ;
158
164
createGame ( username , player == Player . White ) . then (
159
165
( turnStatus ) => {
160
- setConsoleOutput ( [ ] ) ;
161
166
setGameOngoing ( true ) ;
162
- setPlayer ( player ) // trigger re-render
163
- updateGame ( turnStatus ) ;
167
+ updateGame ( turnStatus , [ ] ) ;
164
168
} ,
165
169
( err ) => alert ( err . message )
166
170
) ;
@@ -251,7 +255,10 @@ export default function Home({ username }: { username: string }) {
251
255
calculer tout les coups (voire séquences de coups si il y a des
252
256
raffles) pour déterminer lesquels sont valides.
253
257
</ p >
254
- < p > Note : les coups a retourner sont au format row, column à chaque fois.</ p >
258
+ < p >
259
+ Note : les coups a retourner sont au format row, column à chaque
260
+ fois.
261
+ </ p >
255
262
</ div >
256
263
< div className = "game" >
257
264
< div className = "simulation" >
0 commit comments