import time import pygame import random import displayControler as dCon import Slot import Osprzet import Node def goalTest(hIndex): for i in list(hIndex.values()): if i == 0: return False return True def succ(state): resp = [] hIndex = state["hydradeIndex"].copy() if state["direction"] == "N": if state["y"] > 0: if hIndex[state["x"], state["y"]-1] == 0: hIndex[state["x"], state["y"] - 1] = 1 resp.append(["forward", {'x': state["x"], 'y': state["y"]-1, 'direction': state["direction"], 'hydradeIndex': hIndex}]) resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "E", 'hydradeIndex': state["hydradeIndex"].copy()}]) resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "W", 'hydradeIndex': state["hydradeIndex"].copy()}]) elif state["direction"] == "S": if state["y"] < dCon.NUM_Y-1: if hIndex[state["x"], state["y"]+1] == 0: hIndex[state["x"], state["y"] + 1] = 1 resp.append(["forward", {'x': state["x"], 'y': state["y"]+1, 'direction': state["direction"], 'hydradeIndex': hIndex}]) resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "W", 'hydradeIndex': state["hydradeIndex"].copy()}]) resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "E", 'hydradeIndex': state["hydradeIndex"].copy()}]) elif state["direction"] == "E": if state["x"] < dCon.NUM_X-1: if hIndex[state["x"]+1, state["y"]] == 0: hIndex[state["x"] + 1, state["y"]] = 1 resp.append(["forward", {'x': state["x"]+1, 'y': state["y"], 'direction': state["direction"], 'hydradeIndex': hIndex}]) resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "S", 'hydradeIndex': state["hydradeIndex"].copy()}]) resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "N", 'hydradeIndex': state["hydradeIndex"].copy()}]) else: #state["direction"] == "W" if state["x"] > 0: if hIndex[state["x"]-1, state["y"]] == 0: hIndex[state["x"] - 1, state["y"]] = 1 resp.append(["forward", {'x': state["x"]-1, 'y': state["y"], 'direction': state["direction"], 'hydradeIndex': hIndex}]) resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "N", 'hydradeIndex': state["hydradeIndex"].copy()}]) resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "S", 'hydradeIndex': state["hydradeIndex"].copy()}]) return resp def check(tab, state): for i in tab: if i.state == state: return False return True def BFS(istate): fringe = [] explored = [] x = Node.Node(istate) fringe.append(x) while True: if fringe == []: return False elem = fringe.pop(0) if goalTest(elem.state["hydradeIndex"]): return elem #TODO ciąg akcji zbudowany z wykorzystaniem pól parent i action explored.append(elem) for resp in succ(elem.state): if check(fringe, resp[1]) and check(explored, resp[1]): x = Node.Node(resp[1]) x.parent = elem x.action = resp[0] fringe.append(x) class Tractor: DIRECTION_NORTH = 'N' DIRECTION_SOUTH = 'S' DIRECTION_WEST = 'W' DIRECTION_EAST = 'E' def __init__(self,slot,screen, osprzet): self.tractor_images = { Tractor.DIRECTION_NORTH: pygame.transform.scale(pygame.image.load('images/traktorN.png'), (dCon.CUBE_SIZE, dCon.CUBE_SIZE)), Tractor.DIRECTION_SOUTH: pygame.transform.scale(pygame.image.load('images/traktorS.png'), (dCon.CUBE_SIZE, dCon.CUBE_SIZE)), Tractor.DIRECTION_WEST: pygame.transform.scale(pygame.image.load('images/traktorW.png'), (dCon.CUBE_SIZE, dCon.CUBE_SIZE)), Tractor.DIRECTION_EAST: pygame.transform.scale(pygame.image.load('images/traktor.png'), (dCon.CUBE_SIZE, dCon.CUBE_SIZE)) } self.direction = Tractor.DIRECTION_EAST # początkowy kierunek wschód self.current_tractor_image = self.tractor_images[self.direction] self.screen=screen self.slot=slot self.osprzet = osprzet def draw_tractor(self): self.screen.blit(self.current_tractor_image, (self.slot.x_axis * dCon.CUBE_SIZE, self.slot.y_axis * dCon.CUBE_SIZE)) pygame.display.update() def turn_left(self): # zmiana kierunku w lewo direction_map = { Tractor.DIRECTION_EAST: Tractor.DIRECTION_NORTH, Tractor.DIRECTION_NORTH: Tractor.DIRECTION_WEST, Tractor.DIRECTION_WEST: Tractor.DIRECTION_SOUTH, Tractor.DIRECTION_SOUTH: Tractor.DIRECTION_EAST } self.direction = direction_map[self.direction] self.current_tractor_image = self.tractor_images[self.direction] self.draw_tractor() def turn_right(self): # zmiana kierunku w prawo direction_map = { Tractor.DIRECTION_EAST: Tractor.DIRECTION_SOUTH, Tractor.DIRECTION_SOUTH: Tractor.DIRECTION_WEST, Tractor.DIRECTION_WEST: Tractor.DIRECTION_NORTH, Tractor.DIRECTION_NORTH: Tractor.DIRECTION_EAST } self.direction = direction_map[self.direction] self.current_tractor_image = self.tractor_images[self.direction] self.draw_tractor() def move_forward(self, pole): next_slot_coordinates = None if self.direction == Tractor.DIRECTION_EAST: next_slot_coordinates = (self.slot.x_axis + 1, self.slot.y_axis) self.current_tractor_image = self.tractor_images[self.direction] elif self.direction == Tractor.DIRECTION_WEST: next_slot_coordinates = (self.slot.x_axis - 1, self.slot.y_axis) self.current_tractor_image = self.tractor_images[self.direction] elif self.direction == Tractor.DIRECTION_SOUTH: next_slot_coordinates = (self.slot.x_axis, self.slot.y_axis + 1) self.current_tractor_image = self.tractor_images[self.direction] elif self.direction == Tractor.DIRECTION_NORTH: next_slot_coordinates = (self.slot.x_axis, self.slot.y_axis - 1) self.current_tractor_image = self.tractor_images[self.direction] # sprawdzenie czy następny slot jest dobry if next_slot_coordinates and pole.is_valid_move(next_slot_coordinates): next_slot = pole.get_slot_from_cord(next_slot_coordinates) self.slot.redraw_image() self.slot = next_slot self.draw_tractor() def random_move(self, pole): # losowanie skrętu turn_direction = random.choice([self.turn_left, self.turn_right]) turn_direction() time.sleep(0.5) # wykonanie ruchu do przodu z uwzględnieniem aktualnej orientacji self.move_forward(pole) #to tak zrobiłam już na później, może się przyda def change_osprzet(self, new_osprzet): self.osprzet = new_osprzet def print_osprzet_info(self): print("ID:", self.osprzet.id) print("Marka:", self.osprzet.marka) print("Model:", self.osprzet.model) if self.osprzet.akcje: print("Akcje:") for akcja in self.osprzet.akcje: print("- Typ:", akcja.typ) else: print("Brak akcji przypisanych do tego sprzętu.")