From 5f7cd0dce7486a244321f9968fff4209f7cc5565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Czeka=C5=84ski?= Date: Sun, 24 May 2020 13:48:05 +0200 Subject: [PATCH] Add decision tree run game mode --- src/game/Game.py | 86 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/src/game/Game.py b/src/game/Game.py index c2510de..222cb5d 100644 --- a/src/game/Game.py +++ b/src/game/Game.py @@ -5,12 +5,19 @@ from pathlib import Path import pygame from src.AI.Affinities import Affinities +from src.AI.DecisionTrees.DecisionTree import DecisionTree +from src.AI.DecisionTrees.projectSpecificClasses.SurvivalClassification import SurvivalClassification from src.AI.GA import geneticAlgorithm from src.entities.Player import Player from src.game.EventManager import EventManager from src.game.Map import Map -from src.game.Screen import Screen, Locations +from src.game.Screen import Screen from src.game.Timer import Timer +import src.AI.DecisionTrees.InductiveDecisionTreeLearning as DT +import src.AI.DecisionTrees.projectSpecificClasses.Examples as Examples +from src.AI.DecisionTrees.projectSpecificClasses.SurvivalAttributesDefinitions import \ + SurvivalAttributesDefinitions as AttrDefs +from src.AI.SurvivalDT import SurvivalDT # Main Game class @@ -52,6 +59,8 @@ class Game: exit(1) elif argv[1] == "test": self.testRun(filesPath) + elif argv[1] == "dt": + self.dtRun(filesPath) elif argv[1] == "ga" and len(argv) >= 3: if len(argv) >= 4 and argv[3] == "-t": print("Running Genetic Algorithm in multithreaded mode, iter = ", argv[2]) @@ -193,3 +202,78 @@ class Game: # Flip the display pygame.display.flip() + + def dtRun(self, filesPath): + """ + Runs game in decision tree mode. + + In this mode user can only watch how player performs decisions with usage of decision tree. + + :param filesPath: + """ + self.running = True + print("Initializing screen, params: " + str(self.config["window"]) + "...", end=" ") + + # Vertical rotation is unsupported due to UI layout + if self.config["window"]["height"] > self.config["window"]["width"]: + print("The screen cannot be in a vertical orientation. Exiting...") + exit(1) + + # Create decision tree + survivalDecisionTree = SurvivalDT(DT.inductiveDecisionTreeLearning(Examples.examples, + AttrDefs.allAttributesDefinitions, + SurvivalClassification.FOOD, + SurvivalClassification)) + + print("\nDecision tree: \n") + DecisionTree.printTree(survivalDecisionTree.entityPickingDecisionTree, 0) + print() + + # Initialize timers + # Virtual timer to track in-game time + self.ingameTimer = Timer() + self.ingameTimer.startClock() + + # Initialize screen + self.screen = Screen(self, self.config["window"]) + print("OK") + + self.initializeMap(filesPath) + + # Initialize the player + self.player = Player((6, 2), self.map.tileSize, Affinities(0.3, 0.6, 0.1, 0.5)) + self.map.addEntity(self.player, DONTADD=True) + + # main loop without user input + while self.running: + # Tick the timers + self.ingameTimer.updateTime(self.pgTimer.tick()) + self.screen.ui.updateTime() + + # If player is dead write information to console and break main loop + if not self.player.alive: + self.screen.ui.updateOnDeath(self.player) + self.spritesList.update() + self.spritesList.draw(self.screen.pygameScreen) + pygame.display.flip() + break + + # Choose target for player using decision tree + if self.player.movementTarget is None: + self.player.gotoToTarget(survivalDecisionTree.pickEntity(self.player, self.map), self.map) + + self.screen.ui.updateBarsBasedOnPlayerStats(self.player.statistics) + + # Call update() method for each entity + self.spritesList.update() + + # Draw all sprites + self.spritesList.draw(self.screen.pygameScreen) + + # Flip the display + pygame.display.flip() + + while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + exit(0)