Add decision tree run game mode
This commit is contained in:
parent
7d12c9f59e
commit
5f7cd0dce7
@ -5,12 +5,19 @@ from pathlib import Path
|
|||||||
import pygame
|
import pygame
|
||||||
|
|
||||||
from src.AI.Affinities import Affinities
|
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.AI.GA import geneticAlgorithm
|
||||||
from src.entities.Player import Player
|
from src.entities.Player import Player
|
||||||
from src.game.EventManager import EventManager
|
from src.game.EventManager import EventManager
|
||||||
from src.game.Map import Map
|
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
|
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
|
# Main Game class
|
||||||
@ -52,6 +59,8 @@ class Game:
|
|||||||
exit(1)
|
exit(1)
|
||||||
elif argv[1] == "test":
|
elif argv[1] == "test":
|
||||||
self.testRun(filesPath)
|
self.testRun(filesPath)
|
||||||
|
elif argv[1] == "dt":
|
||||||
|
self.dtRun(filesPath)
|
||||||
elif argv[1] == "ga" and len(argv) >= 3:
|
elif argv[1] == "ga" and len(argv) >= 3:
|
||||||
if len(argv) >= 4 and argv[3] == "-t":
|
if len(argv) >= 4 and argv[3] == "-t":
|
||||||
print("Running Genetic Algorithm in multithreaded mode, iter = ", argv[2])
|
print("Running Genetic Algorithm in multithreaded mode, iter = ", argv[2])
|
||||||
@ -193,3 +202,78 @@ class Game:
|
|||||||
|
|
||||||
# Flip the display
|
# Flip the display
|
||||||
pygame.display.flip()
|
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user