-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathGameController.java
More file actions
177 lines (113 loc) · 4.58 KB
/
GameController.java
File metadata and controls
177 lines (113 loc) · 4.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
package co.ppg2.controllers;
import co.ppg2.services.GameTimer;
import co.ppg2.model.Player;
import co.ppg2.views.CellBase;
import co.ppg2.views.GameView;
import co.ppg2.views.LeaderboardPopup;
import java.util.ArrayList;
public class GameController {
public GameController(String usernameX, String usernameO) {
if (usernameX == null || usernameX.trim().isEmpty() || usernameO == null || usernameO.trim().isEmpty()) {
throw new IllegalArgumentException("Both players must enter a valid username.");
} //makes sure the player must enter a username to proceed
this.playerX = new Player(usernameX);
this.playerO = new Player(usernameO);
}
private char whoseTurn = 'X';
private final CellBase[][] cells = new CellBase[3][3];
private final Player playerX;
private final Player playerO;
private GameTimer gameTimer;
private GameView gameView;
private ArrayList<Player> players = null;
public GameController(Player playerX, Player playerO) {
this.playerX = playerX;
this.playerO = playerO;
this.players = PlayerDataController.loadPlayers(); // Load existing players
}
public char getWhoseTurn() {
return whoseTurn;
}
public Player getCurrentPlayer() {
return (whoseTurn == 'X') ? playerX : playerO;
}
/**
* Switches the turn to the other player and starts their timer
*/ //javadoc comment example
public void switchTurn() {
if (gameTimer != null) {
gameTimer.cancelTimer(); // Stop the timer for the current player
whoseTurn = (whoseTurn == 'X') ? 'O' : 'X';
gameTimer.startTimer(getCurrentPlayer().getUsername()); // Start the timer for the next player
}
}
public boolean isFull() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (cells[i][j] == null || cells[i][j].getToken() == ' ') {
return false;
}
}
}
return true;
}
public boolean isWon(char token) {
for (int i = 0; i < 3; i++) {
if (cells[i][0].getToken() == token && cells[i][1].getToken() == token && cells[i][2].getToken() == token) {
return true;
}
}
for (int j = 0; j < 3; j++) {
if (cells[0][j].getToken() == token && cells[1][j].getToken() == token && cells[2][j].getToken() == token) {
return true;
}
}
if (cells[0][0].getToken() == token && cells[1][1].getToken() == token && cells[2][2].getToken() == token) {
return true;
}
return cells[0][2].getToken() == token && cells[1][1].getToken() == token && cells[2][0].getToken() == token;
}
public void setCell(int row, int col, CellBase cell) {
cells[row][col] = cell;
}
public void setGameTimer(GameTimer gameTimer) {
this.gameTimer = gameTimer;
}
public CellBase getCell(int row, int col) {
return cells[row][col];
}
public void setGameView(GameView gameView) {
this.gameView = gameView;
}
public GameView getGameView() {
return gameView;
}
public Player getWinner(char token) {
return (token == 'X') ? playerX : playerO;
}
public void updateLeaderboard(char token) {
Player winner = getWinner(token);
Player loser = (token == 'X') ? playerO : playerX;
for (Player player : players) {
if (player.getUsername().equals(winner.getUsername())) {
player.incrementWins();
} else if (player.getUsername().equals(loser.getUsername())) {
player.incrementLosses();
}
}
PlayerDataController.savePlayers(players);
// Show leaderboard with average time per move
StringBuilder leaderboardDetails = new StringBuilder();
for (Player player : players) {
double avgTime = gameTimer.getAverageTimePerMove(player.getUsername());
leaderboardDetails.append(String.format("%s - Wins: %d, Losses: %d, Avg Time: %.2f seconds\n",
player.getUsername(), player.getWins(), player.getLosses(), avgTime));
}
LeaderboardPopup.showLeaderboard(players);
}
//TODO: could make a basic utility method to check if a cell in the 2D array is empty
public boolean isCellEmpty(int row, int col) {
return cells[row][col] == null || cells[row][col].getToken() == ' ';
}
//TODO: suggestion: remove unnecessary blank lines to improve readability
}