From d368885e9493b503bc60d5eb0c6b53588284eef9 Mon Sep 17 00:00:00 2001 From: PAlexanderFranklin Date: Wed, 17 May 2023 20:39:12 -0700 Subject: [PATCH] Add ai --- arctic-masher.py | 3 +++ enemies.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++- player.py | 9 +++++--- 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/arctic-masher.py b/arctic-masher.py index d5adf84..4755964 100644 --- a/arctic-masher.py +++ b/arctic-masher.py @@ -93,6 +93,9 @@ while True: for id, player in players.items(): player.useKeys(keys) + + for id, enemy in enemies.items(): + enemy.runAI() # Rendering screen.fill(bg_color) diff --git a/enemies.py b/enemies.py index 5d280c3..9b3008b 100644 --- a/enemies.py +++ b/enemies.py @@ -1,15 +1,27 @@ import pygame import uuid +import random from globals import * from player import * from blocks import * +def findClosestPlayer(x, y): + closestPlayerPosition = {"difference": (1,1), "distance": 9999} + for id, player in players.items(): + difference = (player.x - x, player.y - y) + distance = max(abs(difference[0]), abs(difference[1])) + if distance > closestPlayerPosition["distance"]: + continue + closestPlayerPosition = {"difference": difference, "distance": distance} + return closestPlayerPosition + class Enemy: def __init__(self, id, x, y): self.id = id self.x = x self.y = y + self.AITime = random.randint(150, 200) def die(self): @@ -24,4 +36,45 @@ class Enemy: raise Exception("Not crushing enemy!") def move(self, x, y): - pass \ No newline at end of file + try: + if self.x + x > tileCountx - 1 or self.y + y > tileCounty - 1 or self.x + x < 0 or self.y + y < 0: + raise Exception("Cannot move off edge!") + if gameMap[self.x + x][self.y + y]: + if isinstance(gameMap[self.x + x][self.y + y], Player): + gameMap[self.x + x][self.y + y].die() + else: + raise Exception("Path is blocked.") + gameMap[self.x][self.y] = 0 + self.x += x + self.y += y + gameMap[self.x][self.y] = self + except Exception as error: + raise error + + def runAI(self): + self.AITime -= 1 + if self.AITime < 1: + try: + closestPlayer = findClosestPlayer(self.x, self.y) + weightsx = [-closestPlayer["difference"][0], abs(closestPlayer["difference"][1]), closestPlayer["difference"][0]] + if weightsx[0] < 0: + weightsx[0] = weightsx[2]/6 + elif weightsx[2] < 0: + weightsx[2] = weightsx[0]/6 + else: + weightsx[0] = weightsx[1]/8 + weightsx[2] = weightsx[1]/8 + weightsy = [-closestPlayer["difference"][1], abs(closestPlayer["difference"][0]), closestPlayer["difference"][1]] + if weightsy[0] < 0: + weightsy[0] = weightsy[2]/6 + elif weightsy[2] < 0: + weightsy[2] = weightsy[0]/6 + else: + weightsy[0] = weightsy[1]/8 + weightsy[2] = weightsy[1]/8 + movementx = random.choices([-1, 0, 1], weightsx)[0] + movementy = random.choices([-1, 0, 1], weightsy)[0] + self.move(movementx, movementy) + self.AITime = random.randint(150, 200) + except Exception as error: + pass \ No newline at end of file diff --git a/player.py b/player.py index 54ed833..fe7e7f7 100644 --- a/player.py +++ b/player.py @@ -18,7 +18,7 @@ class Player: "sw": lambda: self.move(-1,1), "w": lambda: self.move(-1,0), "nw": lambda: self.move(-1,-1), - "p": lambda: print(enemies), + "p": lambda: print("pull"), } self.commands = [] for key in keys: @@ -42,7 +42,7 @@ class Player: def move(self, x, y): try: if self.x + x > tileCountx - 1 or self.y + y > tileCounty - 1 or self.x + x < 0 or self.y + y < 0: - raise Exception("Cannot push off edge!") + raise Exception("Cannot move off edge!") if gameMap[self.x + x][self.y + y]: gameMap[self.x + x][self.y + y].pushed(x, y, self, self) gameMap[self.x][self.y] = 0 @@ -53,4 +53,7 @@ class Player: raise error def pushed(self, x, y, caller, pusher): - raise Exception("Cannot push other players.") \ No newline at end of file + raise Exception("Cannot push other players.") + + def die(self): + del players[self.id] \ No newline at end of file