agent walking correctly among boxes

This commit is contained in:
Joanna Radoła 2021-03-16 23:02:16 +01:00
parent ef8dd038a6
commit 020b1aa6a1
2 changed files with 59 additions and 60 deletions

View File

@ -1,47 +1,57 @@
from mesa import Agent, Model from mesa import Agent
import random import random
def dice(number):
return random.randint(1,number)
class Chest(Agent): def dice(number):
return random.randint(1, number)
class Box(Agent):
def __init__(self, unique_id, model): def __init__(self, unique_id, model):
super().__init__(unique_id, model) super().__init__(unique_id, model)
self.gold = 3*dice(6) self.gold=3*dice(6)
self.isBox=True
def step(self):
pass
class Creature(Agent): class Creature(Agent):
def __init__(self, unique_id, model): def __init__(self, unique_id, model):
super().__init__(unique_id, model) super().__init__(unique_id, model)
self.strength = 3 self.strength = 3
self.agility = 3 self.agility = 3
self.wisdom = 2 self.wisdom = 2
self.maxHealth = 10 self.maxHealth = 10
self.health = 10 self.health = 10
self.gold = dice(6) self.gold = dice(6)
self.attack_method = 1 self.attack_method = 1
def meleeAttack(self,opponent): def meleeAttack(self, opponent):
attackValue = self.strength + dice(6) attackValue = self.strength + dice(6)
defenseValue = max(opponent.strength,opponent.agility) defenseValue = max(opponent.strength, opponent.agility)
damage = attackValue - defenseValue damage = attackValue - defenseValue
if damage > 0: if damage > 0:
opponent.health = opponent.health - damage opponent.health = opponent.health - damage
def rangeAttack(self,opponent):
def rangeAttack(self, opponent):
attackValue = self.agility + dice(6) attackValue = self.agility + dice(6)
defenseValue = opponent.agility defenseValue = opponent.agility
damage = attackValue - defenseValue damage = attackValue - defenseValue
if damage > 0: if damage > 0:
opponent.health = opponent.health - damage opponent.health = opponent.health - damage
def magicAttack(self,opponent):
def magicAttack(self, opponent):
attackValue = self.wisdom + dice(6) attackValue = self.wisdom + dice(6)
defenseValue = opponent.wisdom defenseValue = opponent.wisdom
damage = attackValue - defenseValue damage = attackValue - defenseValue
if damage > 0: if damage > 0:
opponent.health = opponent.health - damage opponent.health = opponent.health - damage
def defaultAttack(self,opponent):
def defaultAttack(self, opponent):
if self.attack_method == 1: if self.attack_method == 1:
self.meleeAttack(opponent) self.meleeAttack(opponent)
elif self.attack_method == 2: elif self.attack_method == 2:
@ -49,16 +59,19 @@ class Creature(Agent):
else: else:
self.magicAttack(opponent) self.magicAttack(opponent)
class Player(Agent): class Player(Agent):
def __init__(self, unique_id, model): def __init__(self, unique_id, model):
super().__init__(unique_id, model) super().__init__(unique_id, model)
self.strength = 3 self.strength = 3
self.agility = 3 self.agility = 3
self.wisdom = 3 self.wisdom = 3
self.maxHealth = 20 self.maxHealth = 20
self.health = 20 self.health = 20
self.gold = 0 self.gold = 0
self.isBox=False
def move(self): def move(self):
possible_steps = self.model.grid.get_neighborhood( possible_steps = self.model.grid.get_neighborhood(
self.pos, self.pos,
@ -66,28 +79,31 @@ class Player(Agent):
include_center=False) include_center=False)
new_position = self.random.choice(possible_steps) new_position = self.random.choice(possible_steps)
self.model.grid.move_agent(self, new_position) self.model.grid.move_agent(self, new_position)
def meleeAttack(self,opponent): def meleeAttack(self, opponent):
attackValue = self.strength + dice(6) attackValue = self.strength + dice(6)
defenseValue = max(opponent.strength,opponent.agility) defenseValue = max(opponent.strength, opponent.agility)
damage = attackValue - defenseValue damage = attackValue - defenseValue
if damage > 0: if damage > 0:
opponent.health = opponent.health - damage opponent.health = opponent.health - damage
def rangeAttack(self,opponent):
def rangeAttack(self, opponent):
attackValue = self.agility + dice(6) attackValue = self.agility + dice(6)
defenseValue = opponent.agility defenseValue = opponent.agility
damage = attackValue - defenseValue damage = attackValue - defenseValue
if damage > 0: if damage > 0:
opponent.health = opponent.health - damage opponent.health = opponent.health - damage
def magicAttack(self,opponent):
def magicAttack(self, opponent):
attackValue = self.wisdom + dice(6) attackValue = self.wisdom + dice(6)
defenseValue = opponent.wisdom defenseValue = opponent.wisdom
damage = attackValue - defenseValue damage = attackValue - defenseValue
if damage > 0: if damage > 0:
opponent.health = opponent.health - damage opponent.health = opponent.health - damage
def fightOrFlight(self, opponent): def fightOrFlight(self, opponent):
combat = True combat = True
while combat: while combat:
@ -135,17 +151,18 @@ class Player(Agent):
self.gold = self.gold + opponent.gold self.gold = self.gold + opponent.gold
opponent.gold = 0 opponent.gold = 0
opponent.model.grid.remove_agent(opponent) opponent.model.grid.remove_agent(opponent)
def step(self): def step(self):
if self.health > 0: if self.health > 0:
self.move() self.move()
cellmates = self.model.grid.get_cell_list_contents([self.pos]) cellmates = self.model.grid.get_cell_list_contents([self.pos])
if len(cellmates) > 1: if len(cellmates) > 1:
if isinstance(cellmates[1],Chest): if isinstance(cellmates[0], Box):
self.gold = self.gold + cellmates[1].gold self.gold = self.gold + cellmates[0].gold
cellmates[1].gold = 0 cellmates[1].gold = 0
else: else:
opponent = cellmates[1] opponent = cellmates[1]
fightOrFlight(self,opponent) self.fightOrFlight(opponent)

View File

@ -1,5 +1,5 @@
from mesa import Model, Agent from mesa import Model, Agent
from agent import Player from agent import Player, Box
from mesa.time import RandomActivation from mesa.time import RandomActivation
from mesa.space import MultiGrid from mesa.space import MultiGrid
#from mesa.datacollection import DataCollector #from mesa.datacollection import DataCollector
@ -39,22 +39,4 @@ class GameMap(Model):
def step(self): def step(self):
self.schedule.step() self.schedule.step()
# self.datacollector.collect(self) #na razie niepotrzebne # self.datacollector.collect(self) #na razie niepotrzebne
class Box(Agent):
def __init__(self, unique_id, model):
super().__init__(unique_id, model)
# self.x_coor = random.randrange(1, x + 1) # pola 1-10, zmienić na 0-9?
# self.y_coor = random.randrange(1, y + 1)
self.closed = True
self.content = 'unknown'
self.isBox=True
def open(self):
self.closed = False
self.content = random.choice(
possible_contents) # lepiej od razu przypisać content zamiast w ogóle dawać unknown?
def step(self):
pass