From 8f993caefb688f5dac27cb9098d0d5e8e6fc0660 Mon Sep 17 00:00:00 2001 From: tomoron Date: Sun, 13 Oct 2024 22:03:06 +0200 Subject: [PATCH] add Tournament creation and tournament game start --- .../djangoserver/file/server/server/Bot.py | 32 ++++++--- .../djangoserver/file/server/server/Game.py | 69 +++++++++++++------ .../file/server/server/GameSettings.py | 15 +--- .../djangoserver/file/server/server/Player.py | 9 ++- .../file/server/server/Tournament.py | 67 +++++++++++++----- .../file/server/server/TournamentGame.py | 58 ++++++++++++++++ .../server/typeRequests/gameActions/start.py | 4 +- .../typeRequests/tournamentActions/start.py | 8 ++- .../file/server/server/websocket.py | 13 ++-- listError.txt | 1 + 10 files changed, 205 insertions(+), 71 deletions(-) create mode 100644 docker-compose/requirements/djangoserver/file/server/server/TournamentGame.py diff --git a/docker-compose/requirements/djangoserver/file/server/server/Bot.py b/docker-compose/requirements/djangoserver/file/server/server/Bot.py index 221e19a..98fa0c7 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Bot.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Bot.py @@ -6,7 +6,7 @@ # By: tomoron +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/05 03:54:20 by tomoron #+# #+# # -# Updated: 2024/10/10 19:25:56 by tomoron ### ########.fr # +# Updated: 2024/10/13 21:24:19 by tomoron ### ########.fr # # # # **************************************************************************** # @@ -19,9 +19,10 @@ import asyncio import time class Bot(Player): - def __init__(self, game): + def __init__(self, game=None, tournament=None): self.socket = DummySocket(game) self.game = game + self.tournament = tournament self.ready = True self.pos = {"pos":0, "up": False} self.lastCalculated = {"pos":0, "up":False} @@ -46,7 +47,7 @@ class Bot(Player): return(self.objective) self.lastCalculated = {"pos":pos, "up" : up} if(not center): - offset = random.randint(-100, 100) / 100 + offset = random.randint(-99, 99) / 100 if(offset == 0): offset = 0.1 pos += offset * (GameSettings.playerLength / 2) @@ -65,24 +66,37 @@ class Bot(Player): self.objective = self.genRandomBallDirection(0, 0, True) return self.objective = self.genRandomBallDirection(tempBall.pos[0], tempBall.up, False) + + def isEnd(self): + if(self.tournament != None): + return(self.tournament.end) + else: + return(self.game.end) async def updateLoop(self): - while not self.game.end: - await self.getExpectedPos() + while not self.isEnd(): + if(self.game): + await self.getExpectedPos() await asyncio.sleep(1) async def goToObjectiveLoop(self): lastUpdate = time.time() - while not self.game.end: + while not self.isEnd(): if(self.pos["pos"] != self.objective["pos"] or self.pos["up"] != self.objective["up"]): self.pos["up"] = self.objective["up"] maxDistance = GameSettings.maxPlayerSpeed * (time.time() - lastUpdate) - lastUpdate = time.time() + print("maxDistance :", maxDistance) travel = self.objective["pos"] - self.pos["pos"] if(travel >= 0): - travel = min(self.objective["pos"] - self.pos["pos"], GameSettings.maxPlayerSpeed) + travel = min(self.objective["pos"] - self.pos["pos"], maxDistance) else: - travel = max(self.objective["pos"] - self.pos["pos"], -GameSettings.maxPlayerSpeed) + travel = max(self.objective["pos"] - self.pos["pos"], -maxDistance) + print("travel :", travel) self.game.move(self.socket, self.pos["pos"] + travel, self.pos["up"]) + lastUpdate = time.time() await asyncio.sleep(1 / 20) + + def setGame(self, game): + self.game = game + self.socket.game = game diff --git a/docker-compose/requirements/djangoserver/file/server/server/Game.py b/docker-compose/requirements/djangoserver/file/server/server/Game.py index 7fcb59f..399121d 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Game.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Game.py @@ -6,7 +6,7 @@ # By: edbernar +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/06 16:33:56 by tomoron #+# #+# # -# Updated: 2024/10/10 03:48:00 by tomoron ### ########.fr # +# Updated: 2024/10/12 23:31:00 by tomoron ### ########.fr # # # # **************************************************************************** # @@ -38,20 +38,11 @@ class GameSettings: { "type":1, "name":"J6", "pos":{"x": 1.5, "y": 0.2, "z": -mapLength / 4}, "isUp": False }, { "type":1, "name":"J7", "pos":{"x": 1.5, "y": 3.2, "z": -mapLength / 4}, "isUp": True } ] - skins = [ - {id: 0, 'color': 0xff53aa, 'texture': None}, - {id: 1, 'color': 0xaa24ea, 'texture': None}, - {id: 2, 'color': 0x2c9c49, 'texture': None}, - {id: 3, 'color': 0x101099, 'texture': None}, - {id: 4, 'color': None, 'texture': '/static/img/skin/1.jpg'}, - {id: 5, 'color': None, 'texture': '/static/img/skin/2.jpg'}, - {id: 6, 'color': None, 'texture': '/static/img/skin/3.jpg'}, - {id: 7, 'color': None, 'texture': '/static/img/skin/4.jpg'}, - ] + nbSkins = 8 nbGoals = 4 wallLength = 1 wallWidth = 0.05 bounceSpeedIncrease = 0.2 maxScore = 5 - maxPlayerSpeed = 0.4 + maxPlayerSpeed = 6 diff --git a/docker-compose/requirements/djangoserver/file/server/server/Player.py b/docker-compose/requirements/djangoserver/file/server/server/Player.py index b0141f1..9565ffd 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Player.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Player.py @@ -6,14 +6,13 @@ # By: tomoron +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/05 03:22:32 by tomoron #+# #+# # -# Updated: 2024/10/10 03:52:40 by tomoron ### ########.fr # +# Updated: 2024/10/13 21:24:16 by tomoron ### ########.fr # # # # **************************************************************************** # class Player(): - def __init__(self, socket, game): + def __init__(self, socket): self.socket = socket - socket.game = game self.ready = False self.pos = {"pos":0, "up": False} self.skin = 0 @@ -21,3 +20,7 @@ class Player(): def __del__(self): print("player destroy") + + def setGame(self, game): + self.game = game + self.socket.game = game diff --git a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py index da98351..d906dd4 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Tournament.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Tournament.py @@ -6,28 +6,29 @@ # By: edbernar +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/12 22:49:00 by tomoron #+# #+# # +# Updated: 2024/10/13 22:01:59 by tomoron ### ########.fr # +# # +# **************************************************************************** # +import asyncio +from .Game import Game + +class TournamentGame: + def __init__(self, left, right): + self.game = None + self.winner = None + self.right = right + self.left = left + asyncio.create_task(self.loop()) + + def startGame(self): + l = None + r = None + if(isinstance(self.left,TournamentGame)): + self.game = Game(self.left.winner, self.right.winner, True) + l = self.left.winner.socket + r = self.right.winner.socket + else: + self.game = Game(self.left, self.right, True) + l = self.left.socket + r = self.right.socket + l.sync_send("tournament", { + "action":4, + "id": r.id, + "username":r.username + }) + r.sync_send("tournament", { + "action":4, + "id": l.id, + "username": l.username + }) + + async def loop(self): + while self.winner == None: + if(self.game == None): + if(isinstance(self.left, TournamentGame)): + if(self.left.winner != None and self.right.winner != None): + await asyncio.sleep(3) + self.startGame() + else: + await asyncio.sleep(3) + self.startGame() + else: + if(self.game.winner != None): + self.winner = self.game.pWinner + await asyncio.sleep(1) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/gameActions/start.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/gameActions/start.py index c84222a..6131bfe 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/gameActions/start.py +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/gameActions/start.py @@ -6,7 +6,7 @@ # By: edbernar = len(GameSettings.skins)): + if(skinId < 0 or skinId >= GameSettings.nbSkins): socket.sendError("Skin id out of range", 9033) return; goalId = content.get("goalId",0) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/start.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/start.py index bbdaaa8..6ceb17f 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/start.py +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequests/tournamentActions/start.py @@ -6,7 +6,7 @@ # By: tomoron +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/04 17:16:02 by tomoron #+# #+# # -# Updated: 2024/10/05 02:28:50 by tomoron ### ########.fr # +# Updated: 2024/10/11 21:14:54 by tomoron ### ########.fr # # # # **************************************************************************** # @@ -19,4 +19,8 @@ async def tournamentStart(socket, content): else: socket.sync_send("tournament",{"action":0, "exist":False}) else: - Tournament(socket) + nbBot = content.get("nbBot", 0) + if(nbBot < 0 or nbBot > 7): + socket.sendError("invalid number of bots", 9040) + return; + Tournament(socket, nbBot) diff --git a/docker-compose/requirements/djangoserver/file/server/server/websocket.py b/docker-compose/requirements/djangoserver/file/server/server/websocket.py index b7dede3..4fddd91 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/websocket.py +++ b/docker-compose/requirements/djangoserver/file/server/server/websocket.py @@ -6,7 +6,7 @@ # By: edbernar