Projekt_AI-Automatyczny_saper/Engine/Game.py

134 lines
3.9 KiB
Python
Raw Normal View History

2021-03-27 22:07:55 +01:00
import random
2021-03-13 21:16:35 +01:00
import pygame
2021-03-30 21:01:54 +02:00
from Constants import SQUARE_SIZE, GREEN, RIGHT, LEFT, UP, DOWN, COLS, ROWS, DECOY, ATOMIC_BOMB, CHEMICAL_BOMB, \
CLAYMORE, LAND_MINE
2021-03-16 18:53:26 +01:00
from Engine.Board import Board
from Engine.Agent import Agent
2021-03-27 22:07:55 +01:00
from Engine.BombFactory import BombFactory
from Engine.Point import Point
2021-03-27 22:16:28 +01:00
from Engine.Stone import Stone
2021-04-13 21:27:51 +02:00
from Engine.BfsPathFinder import BfsPathFinder
2021-04-26 20:24:52 +02:00
from Engine.State import State
2021-04-26 21:51:08 +02:00
from Engine.Action import Action
2021-03-27 22:07:55 +01:00
2021-03-13 21:16:35 +01:00
class Game:
def __init__(self, win):
2021-03-27 22:07:55 +01:00
self._init(win)
2021-03-13 21:16:35 +01:00
self.win = win
2021-03-27 22:07:55 +01:00
self.randomizeObject()
pygame.display.update()
2021-03-13 21:16:35 +01:00
2021-03-30 21:01:54 +02:00
def _init(self, win):
2021-03-27 22:07:55 +01:00
self.board = Board(win)
2021-03-30 21:01:54 +02:00
self.agent = Agent(Point(0, 0))
2021-03-13 21:16:35 +01:00
self.turn = GREEN
2021-03-16 18:53:26 +01:00
self.goingDown = True
2021-04-13 21:27:51 +02:00
self.path = []
2021-03-16 18:53:26 +01:00
2021-03-13 21:16:35 +01:00
def update(self):
2021-04-13 21:27:51 +02:00
self.defuseBomb()
2021-03-15 19:58:20 +01:00
self.board.drawSquares(self.win)
2021-03-27 22:07:55 +01:00
self.board.drawBombs()
2021-04-12 22:54:33 +02:00
self.board.drawStones()
2021-03-30 21:01:54 +02:00
self.board.drawAgent(self.win, self.agent)
2021-03-13 21:16:35 +01:00
pygame.display.update()
2021-04-13 21:27:51 +02:00
# 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()
2021-04-12 22:54:33 +02:00
2021-03-27 22:07:55 +01:00
def randomizeObject(self):
2021-03-30 23:10:20 +02:00
i = 0
2021-04-13 21:27:51 +02:00
while i < 10:
2021-04-12 22:54:33 +02:00
point = Point(random.randint(0, 9), random.randint(0, 9))
2021-03-30 23:10:20 +02:00
if(point.getX() == 0 and point.getY() == 0):
continue;
2021-03-27 22:07:55 +01:00
if point not in self.board.bombMap:
2021-03-27 22:16:28 +01:00
object = self.pickObject(random.randint(0, 4))
self.board.bombMap[point] = object
2021-03-30 23:10:20 +02:00
i += 1
2021-04-13 19:32:08 +02:00
r = 5
2021-04-12 22:54:33 +02:00
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
2021-03-27 22:07:55 +01:00
2021-03-27 22:16:28 +01:00
def pickObject(self, rand):
2021-03-30 21:01:54 +02:00
if rand == 0:
2021-03-27 22:07:55 +01:00
return BombFactory.create(DECOY)
2021-03-30 21:01:54 +02:00
elif rand == 1:
2021-03-27 22:07:55 +01:00
return BombFactory.create(CHEMICAL_BOMB)
2021-03-30 21:01:54 +02:00
elif rand == 2:
2021-03-27 22:07:55 +01:00
return BombFactory.create(ATOMIC_BOMB)
2021-03-30 21:01:54 +02:00
elif rand == 3:
2021-03-27 22:07:55 +01:00
return BombFactory.create(CLAYMORE)
2021-03-30 21:01:54 +02:00
elif rand == 4:
2021-03-27 22:07:55 +01:00
return BombFactory.create(LAND_MINE)
2021-04-12 22:54:33 +02:00
2021-04-13 19:32:08 +02:00
def findBomb(self):
2021-04-26 21:51:08 +02:00
return BfsPathFinder(self.board).findBomb(State(RIGHT,Point(0,0)))
2021-04-13 19:32:08 +02:00
2021-04-12 22:54:33 +02:00
def finalState(self):
2021-04-13 21:27:51 +02:00
if len(self.board.bombMap) == 0:
return True
return False
def moveToNext(self):
2021-04-26 21:51:08 +02:00
action = self.path.pop(0)
self.doAction(action)
self.update()
2021-04-13 21:27:51 +02:00
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)
2021-04-26 21:51:08 +02:00
def doAction(self,action):
if(action == RIGHT):
self.agent.point.x += 1
if(action == LEFT):
self.agent.point.x -= 1
if (action == UP):
self.agent.point.y += 1
if (action == DOWN):
self.agent.point.y -= 1