Skip to content

Commit 5ba7c54

Browse files
committed
feat(be/c4): timeout move
1 parent a934778 commit 5ba7c54

File tree

2 files changed

+100
-71
lines changed

2 files changed

+100
-71
lines changed

packages/backend/microservices/connect-four/connect-four.routes.ts

Lines changed: 77 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,6 @@ export const ConnectFourRoutes = async (socket: Socket, io: Namespace) => {
270270
return;
271271
}
272272

273-
// validate invalid move
274-
if (move.column < -1 || move.column >= ConnectFour.columnCount)
275-
return;
276-
277273
if (gameState.winner_id) {
278274
return;
279275
}
@@ -311,82 +307,93 @@ export const ConnectFourRoutes = async (socket: Socket, io: Namespace) => {
311307
throw Error(`no active player for player ${player_id}`);
312308
}
313309

314-
for (let row = ConnectFour.rowCount - 1; row >= 0; row--) {
315-
if (
316-
gameState.board[row][
317-
activePlayer.currentMove.column
318-
] === null
319-
) {
320-
gameState.board[row][activePlayer.currentMove.column] =
321-
activePlayer.player_id;
322-
break;
310+
if (activePlayer.currentMove.column !== -1) {
311+
for (let row = ConnectFour.rowCount - 1; row >= 0; row--) {
312+
if (
313+
gameState.board[row][
314+
activePlayer.currentMove.column
315+
] === null
316+
) {
317+
gameState.board[row][
318+
activePlayer.currentMove.column
319+
] = activePlayer.player_id;
320+
break;
321+
}
323322
}
324-
}
325323

326-
const win = ConnectFour.getWinner(gameState.board, player_id);
324+
const win = ConnectFour.getWinner(
325+
gameState.board,
326+
player_id,
327+
);
327328

328-
if (!win) {
329-
const tie = ConnectFour.checkTie(gameState.board);
329+
if (!win) {
330+
const tie = ConnectFour.checkTie(gameState.board);
331+
332+
if (!tie) {
333+
const moveEndEvent: ConnectFour.MoveEndEvent = {
334+
type: "move-end",
335+
payload: gameState,
336+
};
337+
io.to(room_id).emit(
338+
moveEndEvent.type,
339+
moveEndEvent.payload,
340+
);
341+
} else {
342+
gameState.board = ConnectFour.emptyBoard;
343+
const tieEvent: ConnectFour.TieEvent = {
344+
type: "tie",
345+
payload: gameState,
346+
};
347+
io.to(room_id).emit(
348+
tieEvent.type,
349+
tieEvent.payload,
350+
);
351+
}
352+
353+
gameState.player1.currentMove = null;
354+
gameState.player2.currentMove = null;
330355

331-
if (!tie) {
332-
const moveEndEvent: ConnectFour.MoveEndEvent = {
333-
type: "move-end",
334-
payload: gameState,
335-
};
336-
io.to(room_id).emit(
337-
moveEndEvent.type,
338-
moveEndEvent.payload,
356+
await RedisClient.hset(
357+
room_id,
358+
stringifyObjectValues<ConnectFour.ServerGameState>(
359+
gameState,
360+
),
339361
);
362+
return;
340363
} else {
341-
gameState.board = ConnectFour.emptyBoard;
342-
const tieEvent: ConnectFour.TieEvent = {
343-
type: "tie",
344-
payload: gameState,
345-
};
346-
io.to(room_id).emit(tieEvent.type, tieEvent.payload);
364+
gameState.winner_id = activePlayer.player_id;
347365
}
348-
349-
gameState.player1.currentMove = null;
350-
gameState.player2.currentMove = null;
351-
352-
await RedisClient.hset(
353-
room_id,
354-
stringifyObjectValues<ConnectFour.ServerGameState>(
355-
gameState,
356-
),
357-
);
358366
} else {
359-
gameState.winner_id = activePlayer.player_id;
360-
361-
const gameEndEvent: ConnectFour.GameEndEvent = {
362-
type: "game-end",
363-
payload:
364-
gameState as ConnectFour.GameEndEvent["payload"],
365-
};
366-
io.to(room_id).emit(
367-
gameEndEvent.type,
368-
gameEndEvent.payload,
369-
);
370-
371-
const [{ player_1, player_2 }] = await Promise.all([
372-
fetchPlayersDetailsForPlayedGame(room_id),
373-
setWinnerToGame(room_id, gameState.winner_id),
374-
]);
367+
gameState.winner_id =
368+
activePlayer.player_id === gameState.player1.player_id
369+
? gameState.player2.player_id
370+
: gameState.player1.player_id;
371+
}
375372

376-
await EthersService.endGame(
377-
room_id,
378-
gameState.winner_id === player_1.player_id
379-
? player_1.wallet_address
380-
: player_2.wallet_address,
381-
gameState.winner_id === player_1.player_id
382-
? player_2.wallet_address
383-
: player_1.wallet_address,
384-
chain_id,
385-
);
373+
const gameEndEvent: ConnectFour.GameEndEvent = {
374+
type: "game-end",
375+
payload: gameState as ConnectFour.GameEndEvent["payload"],
376+
};
377+
io.to(room_id).emit(gameEndEvent.type, gameEndEvent.payload);
378+
379+
const [{ player_1, player_2 }] = await Promise.all([
380+
fetchPlayersDetailsForPlayedGame(room_id),
381+
setWinnerToGame(room_id, gameState.winner_id),
382+
]);
383+
384+
await EthersService.endGame(
385+
room_id,
386+
gameState.winner_id === player_1.player_id
387+
? player_1.wallet_address
388+
: player_2.wallet_address,
389+
gameState.winner_id === player_1.player_id
390+
? player_2.wallet_address
391+
: player_1.wallet_address,
392+
chain_id,
393+
);
386394

387-
await RedisClient.del(room_id);
388-
io.socketsLeave(room_id);
389-
}
395+
await RedisClient.del(room_id);
396+
io.socketsLeave(room_id);
390397
} catch (error) {
391398
WSError(socket, error);
392399
}

packages/common/connect-four/index.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,29 @@ const checkDirection = (
146146
return a === user_id && a == b && a == c && a == d;
147147
};
148148

149-
export const getWinner = (board: Board, user_id: string) => {
149+
export const getWinner = (
150+
board: Board,
151+
user_id: string
152+
):
153+
| [
154+
{
155+
i: number;
156+
j: number;
157+
},
158+
{
159+
i: number;
160+
j: number;
161+
},
162+
{
163+
i: number;
164+
j: number;
165+
},
166+
{
167+
i: number;
168+
j: number;
169+
},
170+
]
171+
| null => {
150172
// * INFO: check down
151173
for (let r = 0; r <= rowCount - winCount; r++)
152174
for (let c = 0; c < columnCount; c++)

0 commit comments

Comments
 (0)