Projekt_AI-Automatyczny_saper/Engine/Game.py
2021-04-26 20:24:52 +02:00

122 lines
3.7 KiB
Python

import random
import pygame
from Constants import SQUARE_SIZE, GREEN, RIGHT, LEFT, UP, DOWN, COLS, ROWS, DECOY, ATOMIC_BOMB, CHEMICAL_BOMB, \
CLAYMORE, LAND_MINE
from Engine.Board import Board
from Engine.Agent import Agent
from Engine.BombFactory import BombFactory
from Engine.Point import Point
from Engine.Stone import Stone
from Engine.PathFinder import PathFinder
from Engine.BfsPathFinder import BfsPathFinder
from Engine.State import State
class Game:
def __init__(self, win):
self._init(win)
self.win = win
self.randomizeObject()
pygame.display.update()
def _init(self, win):
self.board = Board(win)
self.agent = Agent(Point(0, 0))
self.turn = GREEN
self.goingDown = True
self.path = []
def update(self):
self.defuseBomb()
self.board.drawSquares(self.win)
self.board.drawBombs()
self.board.drawStones()
self.board.drawAgent(self.win, self.agent)
pygame.display.update()
# def move(self):
# point = self.agent.getPoint()
# tmpPoint = Point(point.getX(), point.getY())
# if self.goingDown:
# if point.getY() + 1 < ROWS:
# tmpPoint.y += 1
# elif point.getX() + 1 < COLS:
# tmpPoint.x += 1
# self.goingDown = not self.goingDown
# else:
# if point.getY() - 1 >= 0:
# tmpPoint.y -= 1
# elif point.getX() + 1 < COLS:
# tmpPoint.x += 1
# self.goingDown = not self.goingDown
# self.agent.rotateImage(tmpPoint)
# self.agent.point = tmpPoint
# #self.moveSequence()
#
# def moveSequence(self):
# pathfinder = PathFinder(self.board)
# for point in pathfinder.findPath(Point(0,0), Point(5,5)):
# self.agent.point = point
# self.update()
def randomizeObject(self):
i = 0
while i < 10:
point = Point(random.randint(0, 9), random.randint(0, 9))
if(point.getX() == 0 and point.getY() == 0):
continue;
if point not in self.board.bombMap:
object = self.pickObject(random.randint(0, 4))
self.board.bombMap[point] = object
i += 1
r = 5
j = 0
while j < r:
point = Point(random.randint(0, 9), random.randint(0, 9))
if (point.getX() == 0 and point.getY() == 0):
continue;
if point not in self.board.bombMap and point not in self.board.stoneMap:
object = Stone()
self.board.stoneMap[point] = object
j += 1
def pickObject(self, rand):
if rand == 0:
return BombFactory.create(DECOY)
elif rand == 1:
return BombFactory.create(CHEMICAL_BOMB)
elif rand == 2:
return BombFactory.create(ATOMIC_BOMB)
elif rand == 3:
return BombFactory.create(CLAYMORE)
elif rand == 4:
return BombFactory.create(LAND_MINE)
def findBomb(self):
return BfsPathFinder(self.board).findBomb(State('REST'))
def finalState(self):
if len(self.board.bombMap) == 0:
return True
return False
def moveToNext(self):
point = self.path.pop(0)
self.agent.rotateImage(point)
self.agent.point = point
def savePath(self,path):
self.path = path
def getPath(self):
return self.path
def defuseBomb(self):
point = self.agent.getPoint()
self.agent.defuse(self.board.getBomb(point))
if point in self.board.bombMap:
self.board.bombMap.pop(point)