2024-04-12 09:12:38 +02:00
|
|
|
import time
|
2024-03-11 13:24:12 +01:00
|
|
|
import pygame
|
|
|
|
import random
|
2024-03-11 21:24:16 +01:00
|
|
|
import displayControler as dCon
|
|
|
|
import Slot
|
2024-03-23 21:00:08 +01:00
|
|
|
import Osprzet
|
2024-04-12 22:11:30 +02:00
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-03-11 13:24:12 +01:00
|
|
|
|
|
|
|
class Tractor:
|
2024-04-11 22:25:38 +02:00
|
|
|
DIRECTION_NORTH = 'N'
|
|
|
|
DIRECTION_SOUTH = 'S'
|
|
|
|
DIRECTION_WEST = 'W'
|
|
|
|
DIRECTION_EAST = 'E'
|
2024-03-23 21:00:08 +01:00
|
|
|
def __init__(self,slot,screen, osprzet):
|
2024-04-11 22:25:38 +02:00
|
|
|
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]
|
2024-03-11 13:24:12 +01:00
|
|
|
self.screen=screen
|
2024-03-23 21:00:08 +01:00
|
|
|
self.slot=slot
|
|
|
|
self.osprzet = osprzet
|
2024-03-11 13:24:12 +01:00
|
|
|
|
2024-04-11 22:25:38 +02:00
|
|
|
|
2024-03-11 13:24:12 +01:00
|
|
|
def draw_tractor(self):
|
2024-04-11 22:25:38 +02:00
|
|
|
self.screen.blit(self.current_tractor_image, (self.slot.x_axis * dCon.CUBE_SIZE, self.slot.y_axis * dCon.CUBE_SIZE))
|
2024-03-11 13:24:12 +01:00
|
|
|
pygame.display.update()
|
|
|
|
|
2024-04-11 22:25:38 +02:00
|
|
|
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]
|
2024-04-12 09:12:38 +02:00
|
|
|
self.draw_tractor()
|
2024-04-11 22:25:38 +02:00
|
|
|
|
|
|
|
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]
|
2024-04-12 09:12:38 +02:00
|
|
|
self.draw_tractor()
|
2024-04-11 22:25:38 +02:00
|
|
|
|
|
|
|
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)
|
2024-04-12 09:12:38 +02:00
|
|
|
self.slot.redraw_image()
|
2024-03-23 21:00:08 +01:00
|
|
|
self.slot = next_slot
|
|
|
|
self.draw_tractor()
|
|
|
|
|
|
|
|
def random_move(self, pole):
|
2024-04-11 22:25:38 +02:00
|
|
|
# losowanie skrętu
|
|
|
|
turn_direction = random.choice([self.turn_left, self.turn_right])
|
|
|
|
turn_direction()
|
2024-04-12 09:12:38 +02:00
|
|
|
time.sleep(0.5)
|
2024-04-11 22:25:38 +02:00
|
|
|
# wykonanie ruchu do przodu z uwzględnieniem aktualnej orientacji
|
|
|
|
self.move_forward(pole)
|
2024-03-23 21:00:08 +01:00
|
|
|
|
|
|
|
|
|
|
|
#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):
|
2024-03-24 13:10:02 +01:00
|
|
|
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)
|
2024-03-23 21:00:08 +01:00
|
|
|
else:
|
2024-04-12 22:11:30 +02:00
|
|
|
print("Brak akcji przypisanych do tego sprzętu.")
|
|
|
|
|