game: add: support multiplayer

This commit is contained in:
starnakin 2024-02-28 17:49:12 +01:00 committed by AdrienLSH
parent 8a4141351b
commit f9bb10f962
5 changed files with 26 additions and 19 deletions

View File

@ -18,7 +18,7 @@ This project is part of the 42 School Common Core curriculum. Its purpose is to
| Module | Nb point | state| | Module | Nb point | state|
| ------ | -------- | ---- | | ------ | -------- | ---- |
| Multiplayer | 2 | 🚧 | Multiplayer | 2 | 🏁 |
| Remote | 2 | 🚧 | Remote | 2 | 🚧
| Bootstrap | 1 | 🏁 | | Bootstrap | 1 | 🏁 |
| Django | 2 | 🏁 | | Django | 2 | 🏁 |

View File

@ -290,8 +290,11 @@ class Game
leave() leave()
{ {
this._socket.close(); if (this._socket)
this._socket = undefined; {
this._socket.close();
this._socket = undefined;
}
} }
} }

View File

@ -91,7 +91,7 @@ export default class extends AbstractAuthenticatedView {
}); });
let update = () => { let update = () => {
if (input.value < 2) if (input.value < 2 || input.value > 4)
button.disabled = true; button.disabled = true;
else else
button.disabled = false; button.disabled = false;
@ -106,7 +106,7 @@ export default class extends AbstractAuthenticatedView {
async getHtml() { async getHtml() {
return ` return `
<h1>Select mode</h1> <h1>Select mode</h1>
<input type="number" value="2" min="1" id="nb_players-input"> <input type="number" value="2" min="1" max="4" id="nb_players-input">
<input type="button" value="Find a game" id="button"> <input type="button" value="Find a game" id="button">
<input type="button" value="2D" id="game-mode"> <input type="button" value="2D" id="game-mode">
<span id="detail"></span> <span id="detail"></span>

View File

@ -43,7 +43,7 @@ class Game(AbstractRoom):
players_id: list[int] = self.model.get_players_id() players_id: list[int] = self.model.get_players_id()
nb_sides = len(players_id) * 2 nb_sides = 4
polygon: list[Point] = [] polygon: list[Point] = []
@ -60,18 +60,24 @@ class Game(AbstractRoom):
for i in range(nb_sides): for i in range(nb_sides):
segments.append(Segment(polygon[i], polygon[(i + 1) % nb_sides])) segments.append(Segment(polygon[i], polygon[(i + 1) % nb_sides]))
self.players: list[Player] = [] self.walls: list[Wall]
for i, player_id in enumerate(players_id): self.players: list[Player]
player = Player(self, player_id, None, segments[i * 2])
self.players.append(player) nb_players: int = len(players_id)
if (nb_players == 2):
self.players = [Player(self, players_id[0], None, segments[0]), Player(self, players_id[1], None, segments[2])]
self.walls = [Wall(segments[1]), Wall(segments[3])]
else:
self.players = []
self.walls = []
for i, side in enumerate(range(4)):
if (i < nb_players):
self.players.append(Player(self, players_id[i], None, segments[i]))
else:
self.walls.append(Wall(segments[i]))
self.spectators: list[Spectator] = [] self.spectators: list[Spectator] = []
self.walls: list[Wall] = []
for i in range(1, nb_sides, 2):
self.walls.append(Wall(segments[i]))
self._updated_players: list[Player] = [] self._updated_players: list[Player] = []
self.game_id: int = game_id self.game_id: int = game_id
@ -103,14 +109,12 @@ class Game(AbstractRoom):
self.broadcast("goal", {"player_id": goal_taker.user_id, self.broadcast("goal", {"player_id": goal_taker.user_id,
"timestamp": timestamp}) "timestamp": timestamp})
if (len(goal_taker.score) >= config.GAME_MAX_SCORE): if (len(goal_taker.score) >= config.GAME_MAX_SCORE):
connected_players: list[Player] = self.get_players_connected() connected_players: list[Player] = self.get_players_connected()
if (len(connected_players) == 2): if (len(connected_players) == 2):
self.finish(connected_players[not connected_players.index(goal_taker)]) self.finish(connected_players[not connected_players.index(goal_taker)])
else: else:
goal_taker.eliminate() goal_taker.eliminate()
def get_player_by_user_id(self, user_id: int) -> Player: def get_player_by_user_id(self, user_id: int) -> Player:
for player in self.players: for player in self.players:

View File

@ -29,9 +29,9 @@ class MatchMaking(WebsocketConsumer):
waiting_room: WaitingRoom = normal.get(self.mode) waiting_room: WaitingRoom = normal.get(self.mode)
waiting_room.append(Waiter(user.pk, self)) waiting_room.append(Waiter(user.pk, self))
if (self.mode < 2): if (self.mode < 2 or self.mode > 4):
data: dict = { data: dict = {
"detail": "The mode must be > 1.", "detail": "The mode must be > 1 and < 4.",
} }
self.send(json.dumps(data)) self.send(json.dumps(data))
self.disconnect(1000) self.disconnect(1000)