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"]):
|
2024-04-13 23:55:58 +02:00
|
|
|
x = elem
|
|
|
|
tab = []
|
|
|
|
while x.parent != None:
|
|
|
|
tab.append(x.action)
|
|
|
|
x = x.parent
|
|
|
|
return tab
|
2024-04-12 22:11:30 +02:00
|
|
|
|
|
|
|
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-04-13 01:39:39 +02:00
|
|
|
def __init__(self,slot,screen, osprzet,clock):
|
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-04-13 01:39:39 +02:00
|
|
|
self.clock=clock
|
|
|
|
self.slot_hydrate_dict={}
|
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
|
2024-04-13 00:13:51 +02:00
|
|
|
self.do_move_if_valid(pole,next_slot_coordinates)
|
|
|
|
|
|
|
|
def do_move_if_valid(self,pole, next_slot_coordinates):
|
2024-04-11 22:25:38 +02:00
|
|
|
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()
|
2024-04-13 01:39:39 +02:00
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
2024-03-23 21:00:08 +01:00
|
|
|
|
|
|
|
def random_move(self, pole):
|
2024-04-13 01:39:39 +02:00
|
|
|
self.clock.tick(2)
|
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-13 01:39:39 +02:00
|
|
|
self.clock.tick(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
|
|
|
|
2024-04-13 01:39:39 +02:00
|
|
|
def reset_pos(self,pole):
|
|
|
|
self.do_move_if_valid(pole,(0,0))
|
|
|
|
|
|
|
|
def initial_move(self,pole):
|
2024-04-13 23:49:04 +02:00
|
|
|
for y in range (0,dCon.NUM_Y):
|
2024-04-13 01:39:39 +02:00
|
|
|
if(y%2==0):
|
2024-04-13 23:49:04 +02:00
|
|
|
for x in range(0,dCon.NUM_X):
|
2024-04-13 01:39:39 +02:00
|
|
|
self.snake_move(pole,x,y)
|
|
|
|
else:
|
2024-04-13 23:49:04 +02:00
|
|
|
for x in range(dCon.NUM_X,-1,-1):
|
2024-04-13 01:39:39 +02:00
|
|
|
self.snake_move(pole,x,y)
|
|
|
|
|
|
|
|
|
|
|
|
def snake_move(self,pole,x,y):
|
|
|
|
next_slot_coordinates=(x,y)
|
|
|
|
if(self.do_move_if_valid(pole,next_slot_coordinates)):
|
2024-04-13 23:49:04 +02:00
|
|
|
if pole.get_slot_from_cord((x,y)).get_hydrate_stats() < 60:
|
|
|
|
hydrateIndex = 0
|
|
|
|
else:
|
|
|
|
hydrateIndex = 1
|
|
|
|
self.slot_hydrate_dict[(x,y)]= hydrateIndex #Budowanie slownika slotow z poziomem nawodnienia dla traktorka
|
2024-04-13 01:39:39 +02:00
|
|
|
self.clock.tick(10)
|
|
|
|
for event in pygame.event.get():
|
|
|
|
if event.type == pygame.QUIT:
|
|
|
|
quit()
|
2024-04-14 00:13:27 +02:00
|
|
|
def move_by_root(self, root, pole, actions = None):
|
2024-04-13 23:55:58 +02:00
|
|
|
for move in root:
|
2024-04-14 00:13:27 +02:00
|
|
|
self.slot.redraw_image()
|
2024-04-13 23:55:58 +02:00
|
|
|
if move == 'forward':
|
|
|
|
self.move_forward(pole)
|
|
|
|
if move == 'right':
|
|
|
|
self.turn_right()
|
|
|
|
if move == 'left':
|
|
|
|
self.turn_left()
|
2024-04-14 00:13:27 +02:00
|
|
|
for a in actions:
|
|
|
|
a()
|
|
|
|
|
2024-04-13 23:55:58 +02:00
|
|
|
self.clock.tick(3)
|
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.")
|
2024-04-13 23:55:58 +02:00
|
|
|
def irrigateSlot(self):
|
|
|
|
self.slot.irrigatePlant()
|
2024-04-12 22:11:30 +02:00
|
|
|
|