#!/usr/bin/python3 import copy from queue import Queue import pygame from config import * from app.graphsearch import Node, Graphsearch from app.board import Board from app.tractor import Tractor class App: def __init__(self): self.__running = True self.__screen = None self.__clock = None self.__board = Board() self.__tractor = Tractor(self.__board) self.__bot_is_running = False self.__moves = None def initialize(self): pygame.init() pygame.display.set_caption(CAPTION) self.__screen = pygame.display.set_mode((WIDTH, HEIGHT)) self.__clock = pygame.time.Clock() def event_handler(self, event: pygame.event.Event): if event.type == pygame.QUIT: self.__running = False def loop_handler(self): self.__board.draw(self.__screen) self.__tractor.draw(self.__screen) def keys_pressed_handler(self): keys = pygame.key.get_pressed() if keys[pygame.K_UP]: self.__tractor.move_up() print(self.__tractor) if keys[pygame.K_DOWN]: self.__tractor.move_down() print(self.__tractor) if keys[pygame.K_LEFT]: self.__tractor.move_left() print(self.__tractor) if keys[pygame.K_RIGHT]: self.__tractor.move_right() print(self.__tractor) if keys[pygame.K_w]: self.__tractor.move() print(self.__tractor) if keys[pygame.K_h]: self.__tractor.harvest() if keys[pygame.K_v]: self.__tractor.sow() if keys[pygame.K_n]: self.__tractor.hydrate() if keys[pygame.K_f]: self.__tractor.fertilize() if keys[pygame.K_l]: self.__tractor.rotate_left() if keys[pygame.K_r]: self.__tractor.rotate_right() if keys[pygame.K_b]: self.get_moves_by_bfs() if not self.__moves: print(f"Bfs is failed") else: print(f"Bfs is succeed") self.__bot_is_running = True self.__tractor.move_by_bfs_handler(self.__moves) def update_screen(self): pygame.display.flip() def quit(self): pygame.quit() def get_moves_by_bfs(self): x, y = self.__tractor.get_position() node = Node(None, x, y, self.__tractor.get_direction(), 0, "initial state", "movement") board = copy.deepcopy(self.__board) self.__moves = Graphsearch.bfs(Queue(), Queue(), node, lambda n=node, b=board: Graphsearch.succ(n, b), lambda n=node: Graphsearch.goaltest(n), board) def run(self): self.initialize() while self.__running: self.__clock.tick(FPS) for event in pygame.event.get(): self.event_handler(event) if not self.__bot_is_running: self.keys_pressed_handler() self.loop_handler() self.update_screen() self.quit()