Merge pull request 'snake_move' (#16) from snake_move into BFS
Reviewed-on: #16
This commit is contained in:
commit
da6b3ef067
262
BFS.py
Normal file
262
BFS.py
Normal file
@ -0,0 +1,262 @@
|
||||
import random
|
||||
|
||||
import pygame
|
||||
import Node
|
||||
from displayControler import NUM_X, NUM_Y
|
||||
|
||||
|
||||
def goalTest1(hIndex):
|
||||
for i in list(hIndex.values()):
|
||||
if i == 0:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def succ1(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"] < 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"] < 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["zwrot"] == "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 check1(tab, state):
|
||||
for i in tab:
|
||||
if i.state == state:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def BFS1(istate):
|
||||
|
||||
|
||||
fringe = []
|
||||
explored = []
|
||||
|
||||
x = Node.Node(istate)
|
||||
fringe.append(x)
|
||||
|
||||
while True:
|
||||
|
||||
|
||||
if fringe == []:
|
||||
return False
|
||||
|
||||
elem = fringe.pop(0)
|
||||
|
||||
if goalTest1(elem.state["hydradeIndex"]):
|
||||
x = elem
|
||||
tab = []
|
||||
while x.parent != None:
|
||||
tab.append([x.parent, x.action])
|
||||
x = x.parent
|
||||
return tab
|
||||
explored.append(elem)
|
||||
|
||||
for resp in succ1(elem.state):
|
||||
if check1(fringe, resp[1]) and check1(explored, resp[1]):
|
||||
x = Node.Node(resp[1])
|
||||
x.parent = elem
|
||||
x.action = resp[0]
|
||||
fringe.append(x)
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
quit()
|
||||
|
||||
|
||||
|
||||
|
||||
def goalTest2(state, goalTreassure):
|
||||
if state["x"] == goalTreassure[0] and state["y"] == goalTreassure[1]:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def succ2(state):
|
||||
resp = []
|
||||
if state["direction"] == "N":
|
||||
if state["y"] > 0:
|
||||
resp.append(["forward", {'x': state["x"], 'y': state["y"]-1, 'direction': state["direction"]}])
|
||||
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "E"}])
|
||||
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "W"}])
|
||||
elif state["direction"] == "S":
|
||||
if state["y"] < NUM_Y:
|
||||
resp.append(["forward", {'x': state["x"], 'y': state["y"]+1, 'direction': state["direction"]}])
|
||||
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "W"}])
|
||||
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "E"}])
|
||||
elif state["direction"] == "E":
|
||||
if state["x"] < NUM_X:
|
||||
resp.append(["forward", {'x': state["x"]+1, 'y': state["y"], 'direction': state["direction"]}])
|
||||
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "S"}])
|
||||
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "N"}])
|
||||
else: #state["zwrot"] == "W"
|
||||
if state["x"] > 0:
|
||||
resp.append(["forward", {'x': state["x"]-1, 'y': state["y"], 'direction': state["direction"]}])
|
||||
resp.append(["right", {'x': state["x"], 'y': state["y"], 'direction': "N"}])
|
||||
resp.append(["left", {'x': state["x"], 'y': state["y"], 'direction': "S"}])
|
||||
|
||||
return resp
|
||||
|
||||
|
||||
def check2(tab, state):
|
||||
for i in tab:
|
||||
if i.state == state:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def BFS2(istate):
|
||||
goalTreassuere = (random.randint(0,NUM_X-1), random.randint(0,NUM_Y-1))
|
||||
print(goalTreassuere)
|
||||
fringe = []
|
||||
explored = []
|
||||
|
||||
x = Node.Node(istate)
|
||||
fringe.append(x)
|
||||
|
||||
while True:
|
||||
|
||||
if fringe == []:
|
||||
return False
|
||||
|
||||
elem = fringe.pop(0)
|
||||
|
||||
if goalTest2(elem.state, goalTreassuere):
|
||||
x = elem
|
||||
tab = []
|
||||
while x.parent != None:
|
||||
tab.append([x.parent, x.action])
|
||||
x = x.parent
|
||||
return tab
|
||||
|
||||
explored.append(elem)
|
||||
|
||||
for resp in succ2(elem.state):
|
||||
if check2(fringe, resp[1]) and check2(explored, resp[1]):
|
||||
x = Node.Node(resp[1])
|
||||
x.parent = elem
|
||||
x.action = resp[0]
|
||||
fringe.append(x)
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
quit()
|
||||
|
||||
|
||||
|
||||
|
||||
"""
|
||||
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"]):
|
||||
x = elem
|
||||
tab = []
|
||||
while x.parent != None:
|
||||
tab.append(x.action)
|
||||
x = x.parent
|
||||
return tab
|
||||
|
||||
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)
|
||||
"""
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
8
Image.py
8
Image.py
@ -6,6 +6,7 @@ class Image:
|
||||
def __init__(self):
|
||||
self.plants_image_dict={}
|
||||
self.tractor_image=None
|
||||
self.garage_image=None
|
||||
def load_images(self):
|
||||
files_plants={0:"borowka",
|
||||
1:"kukurydza",
|
||||
@ -19,6 +20,8 @@ class Image:
|
||||
self.plants_image_dict[files_plants[index]]=plant_image
|
||||
tractor_image=pygame.image.load("images/traktor.png")
|
||||
tractor_image=pygame.transform.scale(tractor_image,(dCon.CUBE_SIZE,dCon.CUBE_SIZE))
|
||||
garage=pygame.image.load("images/garage.png")
|
||||
self.garage_image=pygame.transform.scale(garage,(dCon.CUBE_SIZE,dCon.CUBE_SIZE))
|
||||
def return_random_plant(self):
|
||||
x=random.randint(0,5)
|
||||
keys=list(self.plants_image_dict.keys())
|
||||
@ -26,4 +29,7 @@ class Image:
|
||||
return (plant,self.plants_image_dict[plant])
|
||||
|
||||
def return_plant(self,plant_name):
|
||||
return (plant_name,self.plants_image_dict[plant_name])
|
||||
return (plant_name,self.plants_image_dict[plant_name])
|
||||
|
||||
def return_garage(self):
|
||||
return self.garage_image
|
14
Pole.py
14
Pole.py
@ -33,13 +33,18 @@ class Pole:
|
||||
slot_dict=self.get_slot_dict()
|
||||
for coordinates in slot_dict:
|
||||
slot_dict[coordinates].draw()
|
||||
garage=self.slot_dict[(0,0)]
|
||||
garage.set_garage_image()
|
||||
|
||||
def randomize_colors(self):
|
||||
pygame.display.update()
|
||||
time.sleep(3)
|
||||
self.ui.render_text("Randomizing Crops")
|
||||
for coordinates in self.slot_dict:
|
||||
self.slot_dict[coordinates].set_random_plant()
|
||||
if(coordinates==(0,0)):
|
||||
continue
|
||||
else:
|
||||
self.slot_dict[coordinates].set_random_plant()
|
||||
|
||||
def change_color_of_slot(self,coordinates,color): #Coordinates must be tuple (x,y) (left top slot has cord (0,0) ), color has to be from defined in Colors.py or custom in RGB value (R,G,B)
|
||||
self.get_slot_from_cord(coordinates).color_change(color)
|
||||
@ -55,5 +60,8 @@ class Pole:
|
||||
def check_collision(self,mouse_x,mouse_y):
|
||||
mouse_x=math.floor(mouse_x/dCon.CUBE_SIZE)
|
||||
mouse_y=math.floor(mouse_y/dCon.CUBE_SIZE)
|
||||
collided=self.get_slot_from_cord((mouse_x,mouse_y))
|
||||
return collided.print_status()
|
||||
if(mouse_x<dCon.NUM_X):
|
||||
if(mouse_y<dCon.NUM_Y):
|
||||
collided=self.get_slot_from_cord((mouse_x,mouse_y))
|
||||
return collided.print_status()
|
||||
return ""
|
@ -78,5 +78,11 @@ class Roslina:
|
||||
self.stan.checkStan()
|
||||
return
|
||||
|
||||
def return_stan(self):
|
||||
return self.stan
|
||||
|
||||
def get_hydrate_stats(self):
|
||||
return self.stan.return_hydrate()
|
||||
|
||||
def report_status(self):
|
||||
return f"Nazwa rosliny: {self.nazwa} "+self.stan.report_all()
|
25
Slot.py
25
Slot.py
@ -15,6 +15,7 @@ class Slot:
|
||||
self.screen=screen
|
||||
self.field=pygame.Rect(self.x_axis*dCon.CUBE_SIZE,self.y_axis*dCon.CUBE_SIZE,dCon.CUBE_SIZE,dCon.CUBE_SIZE)
|
||||
self.image_loader=image_loader
|
||||
self.garage_image=None
|
||||
|
||||
def draw(self):
|
||||
pygame.draw.rect(self.screen,Colors.BROWN,self.field,0) #Draw field
|
||||
@ -39,9 +40,31 @@ class Slot:
|
||||
self.screen.blit(self.plant_image, (self.x_axis * dCon.CUBE_SIZE, self.y_axis * dCon.CUBE_SIZE))
|
||||
pygame.draw.rect(self.screen, Colors.BLACK, self.field, BORDER_THICKNESS)
|
||||
|
||||
def set_garage_image(self):
|
||||
self.plant_image=self.image_loader.return_garage()
|
||||
self.screen.blit(self.plant_image, (self.x_axis * dCon.CUBE_SIZE, self.y_axis * dCon.CUBE_SIZE))
|
||||
pygame.draw.rect(self.screen, Colors.BLACK, self.field, BORDER_THICKNESS)
|
||||
|
||||
|
||||
def random_plant(self): #Probably will not be used later only for demo purpouse
|
||||
return self.image_loader.return_random_plant()
|
||||
|
||||
def return_plant(self):
|
||||
return self.plant
|
||||
|
||||
def get_hydrate_stats(self):
|
||||
return self.plant.get_hydrate_stats()
|
||||
|
||||
def print_status(self):
|
||||
return f"wspolrzedne: (X:{self.x_axis} Y:{self.y_axis}) "+self.plant.report_status()
|
||||
return f"wspolrzedne: (X:{self.x_axis} Y:{self.y_axis}) "+self.plant.report_status()
|
||||
def irrigatePlant(self):
|
||||
self.plant.stan.nawodnienie = 100
|
||||
|
||||
def setHydrate(self,index):
|
||||
if(index==0):
|
||||
self.plant.stan.nawodnienie=random.randint(0,60)
|
||||
elif(index==1):
|
||||
self.plant.stan.nawodnienie=random.randint(61,100)
|
||||
elif(index==-1):
|
||||
pass
|
||||
|
3
Stan.py
3
Stan.py
@ -44,5 +44,8 @@ class Stan:
|
||||
self.akcja = None
|
||||
return
|
||||
|
||||
def return_hydrate(self):
|
||||
return self.nawodnienie
|
||||
|
||||
def report_all(self):
|
||||
return f"Nawodnienie: {self.nawodnienie} Zyznosc: {self.zyznosc} Wzrost: {self.wzrost} Choroba: {self.choroba}"
|
161
Tractor.py
161
Tractor.py
@ -6,85 +6,11 @@ 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)
|
||||
|
||||
|
||||
|
||||
tab = [-1, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 0, 1, 0, 1, 1,
|
||||
0, |