From 7401ea3c17bfdca2d0a1c41e0d54a2ab93489e0b Mon Sep 17 00:00:00 2001 From: tomoron Date: Tue, 8 Oct 2024 10:51:22 +0200 Subject: [PATCH] bot can now calculate where the ball is going to hit it's side --- .../djangoserver/file/server/server/Ball.py | 62 +++++++++---------- .../djangoserver/file/server/server/Bot.py | 47 +++++++++++++- .../file/server/server/DummySocket.py | 23 +++++++ .../djangoserver/file/server/server/Game.py | 39 +++++------- .../djangoserver/file/server/server/Player.py | 2 +- 5 files changed, 115 insertions(+), 58 deletions(-) create mode 100644 docker-compose/requirements/djangoserver/file/server/server/DummySocket.py diff --git a/docker-compose/requirements/djangoserver/file/server/server/Ball.py b/docker-compose/requirements/djangoserver/file/server/server/Ball.py index 5cf83b9..3f26e29 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Ball.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Ball.py @@ -6,7 +6,7 @@ # By: tomoron +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/06 03:24:10 by tomoron #+# #+# # -# Updated: 2024/10/06 17:22:46 by tomoron ### ########.fr # +# Updated: 2024/10/08 10:00:22 by tomoron ### ########.fr # # # # **************************************************************************** # @@ -54,7 +54,7 @@ class Ball: offset = pos1[1] - (slope * pos1[0]) #salagadou la menchikabou la bibidi bobidi bou - a = 1 + (slope ** 2) + a = 1 + (slope ** 2) b = ((-jpos[0]) * 2) + (2 * (slope * (-jpos[1] + offset))) c = (((-jpos[0]) ** 2) + (((-jpos[1]) + offset) ** 2)) - (GameSettings.jumperRadius ** 2) return(self.solve_quadratic(a, b ,c)) @@ -65,28 +65,23 @@ class Ball: pos2 = self.pos[0] +self.vel[0], self.pos[1] + self.vel[1] slope = 0 if(abs(pos1[1]) <= (GameSettings.wallWidth / 2) + GameSettings.ballRadius): - print("inside") return(None) if(pos1[0] - pos2[0] == 0): slope=100 else: slope = (pos1[1] - pos2[1])/(pos1[0] - pos2[0]) offset = pos1[1] - (slope * pos1[0]) - + if(slope == 0): return(None) wallSide = (GameSettings.wallWidth / 2) + GameSettings.ballRadius if(pos1[1] < 0): - wallSide *= -1 + wallSide *= -1 hitPos = (wallSide - offset) / slope - print(f'{hitPos=}') relPos = wpos - hitPos - print("relative position : ", relPos) - print("max colision : ", (GameSettings.wallLength / 2) + GameSettings.ballRadius) if(abs(relPos) < (GameSettings.wallLength / 2) + GameSettings.ballRadius): return(hitPos) - print("not in wall 1") return(None) def check_collision_obstacles(self): @@ -117,7 +112,7 @@ class Ball: def getTimeUntilColision(self, limitNeg, limitPos, position, velocity): if(not velocity): return(-1) - limit = GameSettings.limits[limitNeg] if velocity < 0 else GameSettings.limits[limitPos] + limit = GameSettings.limits[limitNeg] if velocity < 0 else GameSettings.limits[limitPos] wallDistance = max(limit, position) - min(limit, position) colision_time = wallDistance / abs(velocity) return(colision_time) @@ -141,55 +136,60 @@ class Ball: def twoPointsDistance(self, pos1, pos2): return(math.sqrt(((pos2[0] - pos1[0]) ** 2) + ((pos2[1] - pos1[1]) ** 2))) - def checkJumpersDistance(self, ballPos, p1, p2): + def checkJumpersDistance(self, ballPos, p1, p2, noMsg): for i in range(0, len(self.obstacles)): if(self.obstacles[i]["type"] != 1): - continue; + continue if(self.obstacles[i]["isUp"] != self.up): - continue + continue if(self.twoPointsDistance((self.obstacles[i]["pos"]["x"], self.obstacles[i]["pos"]["z"]), ballPos) < GameSettings.jumperRadius): - p1.socket.sync_send({"type":"game", "content":{"action":8,"name":self.obstacles[i]["name"]}}) - p2.socket.sync_send({"type":"game", "content":{"action":8,"name":self.obstacles[i]["name"]}}) + if(p1.socket != None and not noMsg): + p1.socket.sync_send({"type":"game", "content":{"action":8,"name":self.obstacles[i]["name"]}}) + if(p2.socket != None and not noMsg): + p2.socket.sync_send({"type":"game", "content":{"action":8,"name":self.obstacles[i]["name"]}}) self.up = not self.up - + def checkWallsColision(self, ballPos): for i in range(0, len(self.obstacles)): if(self.obstacles[i]["type"] != 2): - continue; + continue if(self.obstacles[i]["isUp"] != self.up): - continue; - if(abs(ballPos[1]) <= (GameSettings.wallWidth / 2) + GameSettings.ballRadius): + continue + if(abs(ballPos[1]) <= (GameSettings.wallWidth / 2) + GameSettings.ballRadius + 0.001): if(abs(self.obstacles[i]["pos"]["x"] - ballPos[0]) < (GameSettings.wallLength / 2) + GameSettings.ballRadius): return(True) return(False) - + def increaseSpeed(self): self.vel[0] += (GameSettings.bounceSpeedIncrease * (self.vel[0] / self.speed)) self.vel[1] += (GameSettings.bounceSpeedIncrease * (self.vel[1] / self.speed)) - self.speed += GameSettings.bounceSpeedIncrease + self.speed += GameSettings.bounceSpeedIncrease - async def update(self, delta, p1, p2): - print("AAAAAAAAAAAAAAAAAAAAAAA update") + async def update(self, delta, p1, p2, p1Hit = False): self.pos[0] += (delta * self.vel[0]) self.pos[1] += (delta * self.vel[1]) - if(self.pos[1] <= GameSettings.limits["back"] or self.pos[1] >= GameSettings.limits["front"]): + if(self.pos[1] <= GameSettings.limits["back"] + 0.001 or self.pos[1] >= GameSettings.limits["front"] - 0.001): player = p2.pos if self.pos[1] < 0 else p1.pos + if(self.pos[1] > 0 and p1Hit): + return(1) playerDistance = self.getPlayerDistance(player, self.pos) if(playerDistance >= -(GameSettings.playerLength / 2) and playerDistance <= GameSettings.playerLength / 2 and player["up"] == self.up): self.vel[0] = -((self.speed * 0.80) * (playerDistance / (GameSettings.playerLength / 2))) self.vel[1] = self.speed - abs(self.vel[0]) if(self.pos[1] > 0): self.vel[1] = -self.vel[1] - p1.socket.sync_send({"type":"game","content":{"action":4, "is_opponent": self.pos[1] < 0}}) - p2.socket.sync_send({"type":"game","content":{"action":4, "is_opponent": self.pos[1] > 0}}) - else: + if(p1.socket != None and not p1Hit): + p1.socket.sync_send({"type":"game","content":{"action":4, "is_opponent": self.pos[1] < 0}}) + if(p2.socket != None and not p1Hit): + p2.socket.sync_send({"type":"game","content":{"action":4, "is_opponent": self.pos[1] > 0}}) + elif(not p1Hit): return(1 if self.pos[1] < 0 else 2) - elif(self.pos[0] <= GameSettings.limits["left"] or self.pos[0] >= GameSettings.limits["right"]): + else: + return(0) + elif(self.pos[0] <= GameSettings.limits["left"] + 0.001 or self.pos[0] >= GameSettings.limits["right"] - 0.001): self.vel[0] = -self.vel[0] elif(self.checkWallsColision(self.pos)): self.vel[1] = -self.vel[1] - self.checkJumpersDistance(self.pos, p1, p2) + self.checkJumpersDistance(self.pos, p1, p2, p1Hit) self.increaseSpeed() return(0) - -#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa diff --git a/docker-compose/requirements/djangoserver/file/server/server/Bot.py b/docker-compose/requirements/djangoserver/file/server/server/Bot.py index 2ec3d5c..ad06718 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/Bot.py +++ b/docker-compose/requirements/djangoserver/file/server/server/Bot.py @@ -6,10 +6,51 @@ # By: tomoron +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/05 03:54:20 by tomoron #+# #+# # -# Updated: 2024/10/05 03:55:31 by tomoron ### ########.fr # +# Updated: 2024/10/08 10:20:50 by tomoron ### ########.fr # # # # **************************************************************************** # +from .Ball import Ball +from .Player import Player +from .DummySocket import DummySocket +from .GameSettings import GameSettings +import asyncio + class Bot(Player): - def __init__(self): - print("I am a bot boop boop beep boop") + def __init__(self, game): + self.socket = DummySocket(game) + self.game = game + self.ready = True + self.pos = {"pos":0, "up": False} + self.skin = 0 + asyncio.create_task(self.updateLoop()) + print("I am a bot, boop boop beep boop") + + def createTempBall(self): + res = Ball() + res.setObstacles(self.game.obstacles) + res.vel = self.game.ball.vel.copy() + res.pos = self.game.ball.pos.copy() + res.up = self.game.ball.up + res.speed = self.game.ball.speed + return(res) + + async def getExpectedPos(self): + tempBall = self.createTempBall() + hit = 0 + i = 0 + while(not hit): + sleepTime = tempBall.getSleepTime() + hit = await tempBall.update(sleepTime, self, self.game.p2, True) + i += 1 + if(i == 50): + print("too many bounces") + return; + print("p1 hit at :", tempBall.pos[0]) + self.game.move(self.socket, tempBall.pos[0], tempBall.up) + + async def updateLoop(self): + while not self.game.end: + pos = await self.getExpectedPos() + await asyncio.sleep(1) + diff --git a/docker-compose/requirements/djangoserver/file/server/server/DummySocket.py b/docker-compose/requirements/djangoserver/file/server/server/DummySocket.py new file mode 100644 index 0000000..b3b81a7 --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/DummySocket.py @@ -0,0 +1,23 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# DummySocket.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: tomoron +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/08 07:33:29 by tomoron #+# #+# # +# Updated: 2024/10/08 08:25:06 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +class DummySocket: + def __init__(self, game): + self.id = 0 + self.username = "bot" + self.game = game + + def sync_send(*args): + pass + + def sendError(*args): + pass diff --git a/docker-compose/requirements/djangoserver/file/server/server/Game.py b/docker-compose/requirements/djangoserver/file/server/server/Game.py index 4257844..4d2bcbc 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/05 03:22:32 by tomoron #+# #+# # -# Updated: 2024/10/06 16:16:26 by tomoron ### ########.fr # +# Updated: 2024/10/08 07:47:31 by tomoron ### ########.fr # # # # **************************************************************************** #