diff --git a/server.py b/server.py index 9d3b516..4e434e8 100644 --- a/server.py +++ b/server.py @@ -4,6 +4,7 @@ from mesa.visualization.modules.TextVisualization import TextElement from mesa.visualization.ModularVisualization import ModularServer from src.decisiontree import create_model from src.direction import Direction +from collections import defaultdict def player_representation(agent): @@ -25,8 +26,14 @@ def player_representation(agent): portrayal["Shape"] = 'sprites/skeletonArcher.png' return portrayal -grid = CanvasGrid(player_representation, 10, 10, 500, 500) +def chest_content(agent): + if agent.isBox: + portrayal = {"Shape": "sprites/coin.jpg", + "Layer": 1} + return portrayal +grid = CanvasGrid(player_representation, 10, 10, 700, 700) +image=CanvasGrid(chest_content, 1, 1, 200, 200) class PlayerStats(TextElement): def render(self, model): hp = str(model.get_hp()) @@ -34,6 +41,14 @@ class PlayerStats(TextElement): gold = str(model.get_gold()) return "Player hp: {}
Current position: {}
Player's gold: {}".format( hp, position, gold) +# class ChestContent(CanvasGrid): +# def render(self,model): +# grid_state = defaultdict(list) +# portrayal = self.chest_content(agent) +# portrayal["x"] = 0 +# portrayal["y"] = 0 +# grid_state[portrayal["Layer"]].append(portrayal) +# return # class FightStats(TextElement): # def render(self, model): # if model.player.combat: @@ -41,9 +56,9 @@ class PlayerStats(TextElement): # else: # return "Not fighting" server = ModularServer(GameMap, - [grid, PlayerStats()], + [grid,PlayerStats()], "Map", {"x": 10, "y": 10}) -create_model() +#create_model() server.port = 8081 server.launch() diff --git a/src/agent/hero.py b/src/agent/hero.py index 828657b..b3d2721 100644 --- a/src/agent/hero.py +++ b/src/agent/hero.py @@ -59,14 +59,17 @@ class Player(Creature): 'e_armor_magic_protection':nominalize(opponent.get_armor_magic_protection(), 5), 'e_attack_type':opponent.get_attack_type().upper(), 'strategy':"PASS"}, index=[1]) - with localconverter(robjects.default_converter + pandas2ri.converter): - r_dataframe = robjects.conversion.py2rpy(testcase) - robjects.globalenv['r_dataframe']=r_dataframe - result=robjects.r('predict(fights.id3, r_dataframe)') - return result[0] + # with localconverter(robjects.default_converter + pandas2ri.converter): + # # r_dataframe = robjects.conversion.py2rpy(testcase) + # # robjects.globalenv['r_dataframe']=r_dataframe + # # print(r_dataframe) + # # result=robjects.r('predict(fights.id3, r_dataframe)') + # # print(result) + # # return result[0] + return 'MELEE' - def describe_situation(self, opponent, strategy): - situation = pd.DataFrame({# 'p_strength': self.get_strength(), + def describe_situation(self, opponent): + situation = {# 'p_strength': self.get_strength(), # 'p_agility': self.get_agility(), # 'p_wisdom': self.get_wisdom(), # 'p_health': self.get_health(), @@ -82,7 +85,7 @@ class Player(Creature): 'e_damage': opponent.get_damage(), 'e_armor_defence': opponent.get_armor_defence(), 'e_armor_magic_protection': opponent.get_armor_magic_protection(), - 'e_attack_type': opponent.get_attack_type().upper()}, index=[1]) + 'e_attack_type': opponent.get_attack_type().upper()} return situation def melee_attack(self, opponent): @@ -248,7 +251,7 @@ class Player(Creature): else: self.opponent = cellmates[0] self.strategy=self.predict_strategy(self.opponent) - print("Current enemy stats:\n", self.describe_situation(self.opponent, self.strategy)) + print("Current enemy stats:\n", self.describe_situation(self.opponent)) print("Strategy returned from the tree: ", self.strategy) self.fight_or_flight(self.opponent, self.strategy) else: diff --git a/src/agent/map/gameMap.py b/src/agent/map/gameMap.py index 68602b8..25c1269 100644 --- a/src/agent/map/gameMap.py +++ b/src/agent/map/gameMap.py @@ -18,8 +18,7 @@ x = 10 y = 10 step_counter = 0 boxes_number = 5 -creatures_number = 25 - +creatures_number = 35 class GameMap(Model): def __init__(self, x, y): @@ -46,7 +45,7 @@ class GameMap(Model): pass for i in range(self.boxes_number, - self.boxes_number + self.creatures_number-10): # taki range, żeby każdy agent miał poprawne unique_id + self.boxes_number + self.creatures_number-20): # taki range, żeby każdy agent miał poprawne unique_id # creature = Creature(i, self) creature = Creature(i, self, "Goblin", roll_the_dice(3), roll_the_dice(3), roll_the_dice(3), roll_the_dice(3), roll_the_dice(3), @@ -59,9 +58,9 @@ class GameMap(Model): self.schedule.add(creature) else: pass - for i in range(self.boxes_number + self.creatures_number-10, self.creatures_number): # taki range, żeby każdy agent miał poprawne unique_id + for i in range(self.boxes_number + self.creatures_number-20, self.creatures_number): # taki range, żeby każdy agent miał poprawne unique_id creature = Creature(i, self, "Skeleton", - roll_the_dice(5), roll_the_dice(5), roll_the_dice(5), roll_the_dice(5), roll_the_dice(5), + roll_the_dice(7), roll_the_dice(7), roll_the_dice(7), roll_the_dice(7), roll_the_dice(7), WR4, A8, roll_the_dice(10)) x = self.random.randrange(self.grid.width) diff --git a/src/agent/model/box.py b/src/agent/model/box.py index 6cdeed8..d6ee3a9 100644 --- a/src/agent/model/box.py +++ b/src/agent/model/box.py @@ -1,9 +1,9 @@ from mesa import Agent from .dice.dice import roll_the_dice - +chest_names=['c'+str(i)+'.jpg' for i in range(1,10)] class Box(Agent): - def __init__(self, unique_id, model): + def __init__(self, unique_id, model): super().__init__(unique_id, model) self.gold = 3 * roll_the_dice(6) self.isBox = True @@ -12,3 +12,4 @@ class Box(Agent): def step(self): pass + diff --git a/src/agent/model/creature.py b/src/agent/model/creature.py index 082b164..516fbb3 100644 --- a/src/agent/model/creature.py +++ b/src/agent/model/creature.py @@ -61,8 +61,8 @@ class Creature(Agent): attack_value = self.agility + roll_the_dice(6) defense_value = opponent.agility damage = attack_value - defense_value - if (damage > 0) and (damage + self.weapon1.damage - opponent.armor.defence > 0): - opponent.health = opponent.health - (damage + self.weapon1.damage - opponent.armor.defence) + if (damage > 0) and (damage + self.weapon1.get_damage() - opponent.armor.get_defence() > 0): + opponent.health = opponent.health - (damage + self.weapon1.get_damage() - opponent.armor.get_defence()) print("damage done by the monster: ", damage) def magic_attack(self, opponent): attack_value = self.wisdom + roll_the_dice(6) @@ -74,7 +74,7 @@ class Creature(Agent): def default_attack(self, opponent): if self.weapon1.get_type() == "Meele": self.melee_attack(opponent) - elif self.weapon1.get_type() == "Range": + elif self.weapon1.get_type() == "Ranged": self.range_attack(opponent) else: self.magic_attack(opponent) diff --git a/src/decisiontree.py b/src/decisiontree.py index 0c48aca..7b307da 100644 --- a/src/decisiontree.py +++ b/src/decisiontree.py @@ -7,10 +7,12 @@ def create_model(): robjects.r('WPM("refresh-cache")') robjects.r('WPM("install-package", "simpleEducationalLearningSchemes")') robjects.r('WPM("load-package", "simpleEducationalLearningSchemes")') - #print("dupa") robjects.r('ID3<-make_Weka_classifier("weka/classifiers/trees/Id3")') robjects.r('fights<-read.arff("C:/Users/X260/Downloads/currentdata.arff")') robjects.r('fights.id3 <- ID3(strategy ~ p_strength + p_agility + p_wisdom+ p_health + ' 'p_melee_damage + p_ranged_damage + p_magic_damage + p_armor_defence + p_armor_magic_protection + ' 'e_strength+ e_agility + e_wisdom + e_health + e_damage + e_armor_defence + e_armor_magic_protection + ' - 'e_attack_type, data = fights)') \ No newline at end of file + 'e_attack_type, data = fights)') + # robjects.r('.jcache(fights.id3)') + # robjects.r('save(fights.id3, file="dectre.rda)') + #todo: zapisać w rpythonie do pliku, raz zrobić i nie odpalać za każdym razem w serverze \ No newline at end of file diff --git a/src/items/armory.py b/src/items/armory.py index 9aaf6d2..7da919d 100644 --- a/src/items/armory.py +++ b/src/items/armory.py @@ -14,16 +14,16 @@ WM10 = Weapon("Axe", "Melee", 3) WM11 = Weapon("Axe", "Melee", 3) WM12 = Weapon("Battle axe", "Melee", 4) -WR1 = Weapon("Sling", "Range", 1) -WR2 = Weapon("Sling", "Range", 1) -WR3 = Weapon("Sling", "Range", 1) -WR4 = Weapon("Bow", "Range", 2) -WR5 = Weapon("Bow", "Range", 2) -WR6 = Weapon("Bow", "Range", 2) -WR7 = Weapon("Bow", "Range", 2) -WR8 = Weapon("Longbow", "Range", 3) -WR9 = Weapon("Longbow", "Range", 3) -WR10 = Weapon("Crossbow", "Range", 4) +WR1 = Weapon("Sling", "Ranged", 1) +WR2 = Weapon("Sling", "Ranged", 1) +WR3 = Weapon("Sling", "Ranged", 1) +WR4 = Weapon("Bow", "Ranged", 2) +WR5 = Weapon("Bow", "Ranged", 2) +WR6 = Weapon("Bow", "Ranged", 2) +WR7 = Weapon("Bow", "Ranged", 2) +WR8 = Weapon("Longbow", "Ranged", 3) +WR9 = Weapon("Longbow", "Ranged", 3) +WR10 = Weapon("Crossbow", "Ranged", 4) S1 = Weapon("Push", "Magic", 2) S2 = Weapon("Push", "Magic", 2) @@ -61,7 +61,7 @@ A16 = Armor("Magical Plate Armor", 3, 2) # C10 = Box(A8) # C11 = Box(A12) # C12 = Box(A14) - +# # Gracz = Player(1000, self, "Janusz",3,3,3,20,20,WM1,A1,0,WR1,S1) # def __init__(self, unique_id, model, n, s, a, w, max_hp, hp, weapon, arm, g): # M1 = Creature("Goblin",2,2,1,10,10,WM2,A2,dice(6))