Skip to content

Commit 2560400

Browse files
committed
working
1 parent d50470a commit 2560400

File tree

11 files changed

+121
-29
lines changed

11 files changed

+121
-29
lines changed

spring-boot-websockets/tictactoe/src/main/java/com/rakeshv/tictactoe/controllers/GameController.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,11 @@ public void playGame(@Payload GamePlay request) throws InvalidGameException, Gam
5353
String player1 = game.getPlayer1().getLogin();
5454
String player2 = game.getPlayer2().getLogin();
5555
this.messagingTemplate.convertAndSend("/topic/game-over/" + player1,
56-
Response.builder().message("Winner is " + game.getWinner()).build());
56+
Response.builder().message("Winner is " + game.getWinner()).game(game).build());
5757
this.messagingTemplate.convertAndSend("/topic/game-over/" + player2,
58-
Response.builder().message("Winner is " + game.getWinner()).build());
58+
Response.builder().message("Winner is " + game.getWinner()).game(game).build());
59+
game.setWinner(null);
60+
GameStorage.getInstance().addGame(game);
5961
} else {
6062
this.messagingTemplate.convertAndSend("/topic/game-progress/" + game.getPlayer1().getLogin(), game);
6163
this.messagingTemplate.convertAndSend("/topic/game-progress/" + game.getPlayer2().getLogin(), game);
@@ -102,6 +104,22 @@ public void connectToGameId(@Payload Player player, Message<?> message) {
102104
}
103105
}
104106

107+
@MessageMapping("/reset")
108+
public void resetGame(@Payload Player player, Message<?> message) {
109+
MessageHeaders headers = message.getHeaders();
110+
Object sessionId = headers.get("simpSessionId");
111+
Game game = gameService.resetGame(sessionId.toString(), player);
112+
Response response = Response.builder().message("Game has been reset by " + player.getLogin()).build();
113+
this.messagingTemplate.convertAndSend("/topic/terminate-game/" + game.getPlayer1().getLogin(), response);
114+
this.messagingTemplate.convertAndSend("/topic/terminate-game/" + game.getPlayer2().getLogin(), response);
115+
}
116+
117+
@MessageMapping("/draw-game")
118+
public void drawGame(@Payload Player player, Message<?> message) {
119+
MessageHeaders headers = message.getHeaders();
120+
Object sessionId = headers.get("simpSessionId");
121+
gameService.resetGame(sessionId.toString(), player);
122+
}
105123
@MessageMapping("/disconnect")
106124
public void disconnectPlayer(@Payload Player player) {
107125
log.error("Player {} disconnected", player);

spring-boot-websockets/tictactoe/src/main/java/com/rakeshv/tictactoe/models/Game.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,6 @@ public class Game {
1818
private String winner;
1919
boolean isFirstPlayer;
2020
String currentTick;
21+
String currentPlayer;
22+
int count;
2123
}

spring-boot-websockets/tictactoe/src/main/java/com/rakeshv/tictactoe/models/GamePlay.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ public class GamePlay {
99
private int y;
1010
private String gameId;
1111
int turn;
12+
String player;
1213
}

spring-boot-websockets/tictactoe/src/main/java/com/rakeshv/tictactoe/models/Response.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@
1212
public class Response {
1313
private String message;
1414
private Object sessionid;
15+
private Game game;
1516
}

spring-boot-websockets/tictactoe/src/main/java/com/rakeshv/tictactoe/services/GameEngine.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ public Game checkWinner(Game game) {
3535

3636
if (winner != null) {
3737
game.setWinner(winner == Tick.X ? game.getPlayer1().getLogin() : game.getPlayer2().getLogin());
38+
game.setBoard(new int[3][3]);
39+
game.setRow(new int[3]);
40+
game.setColumn(new int[3]);
3841
}
3942
return game;
4043
}

spring-boot-websockets/tictactoe/src/main/java/com/rakeshv/tictactoe/services/GameService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ public interface GameService {
1616
Optional<Game> connectToRandomGame(Player player, Object sessionId) throws GameNotFoundException;
1717

1818
Game playGame(GamePlay gamePlay) throws GameNotFoundException, InvalidGameException;
19+
20+
Game resetGame(String id, Player player);
1921
}

spring-boot-websockets/tictactoe/src/main/java/com/rakeshv/tictactoe/services/GameServiceImpl.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public Game createGame(Player player, Object sessionId) {
3131
.player1SessionId(sessionId)
3232
.isFirstPlayer(true)
3333
.currentTick("X")
34+
.currentPlayer(player.getLogin())
3435
.gameStatus(GameStatus.NEW).build();
3536
GameStorage.getInstance().addGame(game);
3637
return game;
@@ -96,13 +97,34 @@ public Game playGame(GamePlay gamePlay) throws GameNotFoundException, InvalidGam
9697
game.setBoard(board);
9798
game.setRow(row);
9899
game.setColumn(column);
99-
log.error("isfirst player ? " + game.isFirstPlayer());
100100
game.setFirstPlayer(!game.isFirstPlayer());
101-
log.error("isfirst player ? " + game.isFirstPlayer());
102101
game = gameEngine.checkWinner(game);
102+
game.setCurrentPlayer(gamePlay.getPlayer());
103103

104104
game.setCurrentTick(game.isFirstPlayer() ? "X" : "O");
105105
GameStorage.getInstance().addGame(game);
106106
return game;
107107
}
108+
109+
public Game resetGame(String id, Player player) {
110+
Optional<Game> optionalGame = GameStorage.getInstance().getGameById(id);
111+
if (optionalGame.isPresent()) {
112+
Game game = optionalGame.get();
113+
game.setBoard(new int[3][3]);
114+
game.setRow(new int[3]);
115+
game.setColumn(new int[3]);
116+
game.setFirstPlayer(true);
117+
game.setWinner(null);
118+
game.setGameStatus(GameStatus.TERMINATED);
119+
game.setCount(0);
120+
121+
String currentPlayer = player.getLogin().equalsIgnoreCase(game.getPlayer1().getLogin()) ?
122+
game.getPlayer2().getLogin() : game.getPlayer1().getLogin();
123+
game.setCurrentPlayer(currentPlayer);
124+
GameStorage.getInstance().addGame(game);
125+
return game;
126+
}
127+
128+
return null;
129+
}
108130
}

spring-boot-websockets/tictactoe/src/main/resources/static/css/style.css

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,12 @@ footer{
5656
text-align: center;
5757
padding-top: 20px;
5858
}
59+
#gameinfo {
60+
background: #333;
61+
color: #fff;
62+
}
63+
64+
#playerturn {
65+
background: #333;
66+
color: #fff;
67+
}

spring-boot-websockets/tictactoe/src/main/resources/static/index.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,13 @@ <h1>Play Tic Tac Toe</h1>
3737
</ul>
3838
<div class="clearfix"></div>
3939
<footer>
40-
<span>You are playing with <span id="opponentLogin"></span> </span>
40+
<br>
41+
<div id="playerturn"></div>
42+
<br>
4143
<button id="reset">Reset</button>
44+
<div id="h1"></div>
45+
<br>
46+
<div id="gameinfo"></div>
4247
</footer>
4348
</div>
4449
<script src="js/script.js"></script>

spring-boot-websockets/tictactoe/src/main/resources/static/js/script.js

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
var turns = [ ["#","#","#"] , ["#","#","#"] , [ "#","#", "#"] ];
22
let player = true;
33
let canPlay = false;
4-
let playerTick = ''
4+
let playerTick = '';
5+
let winner = null;
56

67
function playerTurn (id) {
78
let xy = id.split("_")
89
let x = xy[0]
910
let y = xy[1]
10-
stompClient.send('/app/play', {}, JSON.stringify({"type": playerTick, "x": x, "y": y, gameId: sessionId}))
11+
stompClient.send('/app/play', {},
12+
JSON.stringify({"type": playerTick, "x": x, "y": y, gameId: sessionId, "player": opponent }))
1113
}
1214

1315
function displayBoardData(data) {
@@ -31,26 +33,40 @@ function displayBoardData(data) {
3133

3234
if (data.winner !== null) {
3335
alert("Winner is " + data.winner)
34-
reset()
36+
winner = data.winner
37+
resetBoard()
3538
}
36-
console.log('count is ' + count)
3739
if (count === 9) {
3840
alert('Match draw')
39-
reset()
41+
resetBoard()
42+
stompClient.send('/app/draw-game', {}, JSON.stringify( { "login": login }))
43+
}
44+
}
45+
46+
function resetBoard() {
47+
for (let i = 0; i < 3; i++) {
48+
for (let j = 0; j < 3; j++) {
49+
turns[i][j] = ''
50+
let id = i + "_" + j
51+
$('#' + id).text(turns[i][j])
52+
}
4053
}
4154
}
4255

4356
$(".tic").click(function(){
4457
const slot = $(this).attr('id');
45-
if (player === true && canPlay === true) {
46-
playerTurn(slot);
58+
if (currentPlayer === login && canPlay === true) {
59+
playerTurn(slot)
4760
}
4861
});
4962

5063
function reset(){
64+
stompClient.send('/app/reset', {}, JSON.stringify( {"login": login }))
65+
resetBoard()
5166
canPlay = true
5267
isFirstPlayer = !isFirstPlayer
53-
turns = [["#","#","#"], ["#","#","#"] , ["#","#", "#"]];
68+
player = !player
69+
turns = [["","",""], ["","",""] , ["","", ""]];
5470
$(".tic").text("");
5571
}
5672

0 commit comments

Comments
 (0)