This commit is contained in:
marcinljablonski 2019-04-29 10:49:03 +02:00
parent bf2ecb7de5
commit 4642d1d86e
7 changed files with 216 additions and 33 deletions

View File

@ -31,25 +31,25 @@ class Cucumber(Plant):
def decrease_ttl(self, n): def decrease_ttl(self, n):
self.__ttl -= n self.__ttl -= n
if self.__ttl == 0: if self.__ttl == 0:
self.__is_life == False self.__is_alive == False
def increase_hydration(self, n): def increase_hydration(self, n):
self.__hydration += n self.__hydration += n
if self.__hydration > 40: if self.__hydration > 40:
self.__is_life = False self.__is_alive = False
def decrase_hydration(self, n): def decrase_hydration(self, n):
self.__hydration -= n * self.__dehydration_ratio self.__hydration -= n * self.__dehydration_ratio
if self.__hydration < 1: if self.__hydration < 1:
self.__is_life = False self.__is_alive = False
def increase_soillevel(self, n): def increase_soillevel(self, n):
self.__soil_level += n self.__soil_level += n
if self.__soil_level > 40: if self.__soil_level > 40:
self.__is_life = False self.__is_alive = False
def decrease_soillevel(self, n): def decrease_soillevel(self, n):
self.__soil_level -= n * self.__desoil_ratio self.__soil_level -= n * self.__desoil_ratio
if self.__soil_level < 1: if self.__soil_level < 1:
self.__is_life = False self.__is_alive = False

View File

@ -31,25 +31,25 @@ class Tomato(Plant):
def decrease_ttl(self, n): def decrease_ttl(self, n):
self.__ttl -= n self.__ttl -= n
if self.__ttl == 0: if self.__ttl == 0:
self.__is_life == False self.__is_alive == False
def increase_hydration(self, n): def increase_hydration(self, n):
self.__hydration += n self.__hydration += n
if self.__hydration > 40: if self.__hydration > 40:
self.__is_life = False self.__is_alive = False
def decrase_hydration(self, n): def decrase_hydration(self, n):
self.__hydration -= n * self.__dehydration_ratio self.__hydration -= n * self.__dehydration_ratio
if self.__hydration < 1: if self.__hydration < 1:
self.__is_life = False self.__is_alive = False
def increase_soillevel(self, n): def increase_soillevel(self, n):
self.__soil_level += n self.__soil_level += n
if self.__soil_level > 40: if self.__soil_level > 40:
self.__is_life = False self.__is_alive = False
def decrease_soillevel(self, n): def decrease_soillevel(self, n):
self.__soil_level -= n * self.__desoil_ratio self.__soil_level -= n * self.__desoil_ratio
if self.__soil_level < 1: if self.__soil_level < 1:
self.__is_life = False self.__is_alive = False

111
] Normal file
View File

@ -0,0 +1,111 @@
import asyncio
import sys
import time
from queue import PriorityQueue
def heuristic(a, b):
(x1, y1) = a
(x2, y2) = b
return abs(x1 - x2) + abs(y1 - y2)
async def tractor():
directions = ['N', 'W', 'S', 'E']
current_rotation = 'S'
start = (0,0)
current_position = start
goal = (10,6)
frontier = PriorityQueue()
frontier.put(start, 0)
came_from = {}
cost_so_far = {}
came_from[start] = None
cost_so_far[start] = 0
start_flag = True
while not frontier.empty():
local_graph = []
is_already_moved = False
for i, direction in enumerate(directions):
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
writer.write("move\n".encode())
data = await reader.readline()
result = data.decode()
writer.close()
time.sleep(0.7)
if result == "OK":
print("OK")
if direction == 'N':
local_graph.append((current_position[0] - 1, current_position[1]))
elif direction == 'S':
local_graph.append((current_position[0] + 1, current_position[1]))
elif direction == 'W':
local_graph.append((current_position[0], current_position[1] - 1 ))
else:
local_graph.append((current_position[0], current_position[1] + 1 ))
if i == 3 and len(local_graph) == 1:
is_already_moved = True
else:
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
writer.write(("rotate " + directions[((i + 2) % 4)] + "\n").encode())
data = await reader.readline()
writer.close()
time.sleep(0.7)
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
writer.write("move\n".encode())
data = await reader.readline()
writer.close()
time.sleep(0.7)
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
current_rotation = directions[((i - 1) % 4)]
writer.write(("rotate " + current_rotation + "\n").encode())
data = await reader.readline()
writer.close()
time.sleep(0.7)
current = frontier.get()
if not start_flag and not is_already_moved:
if current[0] == current_position[0] and current[1] > current_position[1]:
current_rotation = 'E'
elif current[0] == current_position[0] and current[1] < current_position[1]:
current_rotation = 'W'
elif current[0] > current_position[0]:
current_rotation = 'S'
elif current[0] < current_position[0]:
current_rotation = 'N'
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
writer.write(("rotate " + current_rotation + "\n").encode())
data = await reader.readline()
writer.close()
time.sleep(0.7)
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
writer.write("move\n".encode())
data = await reader.readline()
writer.close()
time.sleep(0.7)
if current == goal:
break
for next in local_graph:
new_cost = cost_so_far[current] + 1
if next not in cost_so_far or new_cost < cost_so_far[next]:
cost_so_far[next] = new_cost
priority = new_cost + heuristic(goal, next)
frontier.put(next, priority)
came_from[next] = current
start_flag = False
# reader, writer = await asyncio.open_connection(
# '127.0.0.1', 8888)
# time.sleep(0.7)
# writer.write("rotate E\n".encode())
# data = await reader.readline()
# sys.stdout.write(data.decode())
# time.sleep(0.7)
asyncio.run(tractor())

Binary file not shown.

Binary file not shown.

4
env.py
View File

@ -93,7 +93,7 @@ def try_move(field, tractor):
if __name__ == "__main__": if __name__ == "__main__":
field = initialize_field() field = initialize_field()
tractor = Trac('S', Point((0,0))) tractor = Trac('N', Point((0,0)))
async def handle_echo(reader, writer): async def handle_echo(reader, writer):
data = await reader.readline() data = await reader.readline()
@ -115,7 +115,7 @@ if __name__ == "__main__":
else: else:
y += 1 y += 1
tractor.set_position((x,y)) tractor.set_position((x,y))
writer.write("OK\n".encode()) writer.write(("OK " + rotation + "\n").encode())
else: else:
writer.write("FAIL\n".encode()) writer.write("FAIL\n".encode())
if sys.platform == "win32": if sys.platform == "win32":

View File

@ -1,6 +1,7 @@
import asyncio import asyncio
import sys import sys
import time import time
from queue import PriorityQueue
def heuristic(a, b): def heuristic(a, b):
(x1, y1) = a (x1, y1) = a
@ -9,10 +10,11 @@ def heuristic(a, b):
async def tractor(): async def tractor():
graph = ['N', 'W', 'S', 'E'] directions = ['N', 'W', 'S', 'E']
graph_index = 0 current_rotation = 'N'
current_rotation = 'S' last_rotation = None
start = (0,0) start = (0,0)
current_position = start
goal = (10,6) goal = (10,6)
frontier = PriorityQueue() frontier = PriorityQueue()
@ -21,35 +23,105 @@ async def tractor():
cost_so_far = {} cost_so_far = {}
came_from[start] = None came_from[start] = None
cost_so_far[start] = 0 cost_so_far[start] = 0
start_flag = True
while not frontier.empty(): while not frontier.empty():
is_possible = False local_graph = []
while not is_possible: # is_already_moved = False
graph_index = (graph_index + 1) % 4
current = frontier.get() current = frontier.get()
print(start_flag)
last_position = current
if not start_flag:
if current[0] == last_position[0] and current[1] > last_position[1]:
current_rotation = 'E'
elif current[0] == last_position[0] and current[1] < last_position[1]:
current_rotation = 'W'
elif current[0] > last_position[0]:
current_rotation = 'S'
elif current[0] < last_position[0]:
current_rotation = 'N'
last_rotation = current_rotation
for i, direction in enumerate(directions):
if direction == last_rotation:
continue
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
# current_rotation = directions[((i - 1) % 4)]
writer.write(("rotate " + direction + "\n").encode())
data = await reader.readline()
writer.close()
time.sleep(0.7)
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
writer.write("move\n".encode())
data = await reader.readline()
result = data.decode().split()
writer.close()
time.sleep(0.7)
if result[0] == "OK":
print("Jade na "+result[1])
# print("ok"+result[1])
if direction == 'N':
local_graph.append((current_position[0] - 1, current_position[1]))
elif direction == 'S':
local_graph.append((current_position[0] + 1, current_position[1]))
elif direction == 'W':
local_graph.append((current_position[0], current_position[1] - 1 ))
else:
local_graph.append((current_position[0], current_position[1] + 1 ))
print(local_graph)
# print("nawrót")
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
writer.write(("rotate " + directions[((i + 2) % 4)] + "\n").encode())
data = await reader.readline()
# print(current_rotation)
writer.close()
time.sleep(0.7)
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
writer.write("move\n".encode())
print("hop -nawrót")
data = await reader.readline()
writer.close()
time.sleep(0.7)
# reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
# current_rotation = directions[((i - 1) % 4)]
# writer.write(("rotate " + current_rotation + "\n").encode())
# data = await reader.readline()
# writer.close()
# time.sleep(0.7)
# else:
# reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
# current_rotation = directions[((i + 1) % 4)]
# writer.write(("rotate " + current_rotation + "\n").encode())
# data = await reader.readline()
# writer.close()
# time.sleep(0.7)
# print(":(")
if not start_flag:
print("jaaazda")
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
writer.write(("rotate " + current_rotation + "\n").encode())
data = await reader.readline()
writer.close()
time.sleep(0.7)
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
writer.write("move\n".encode())
data = await reader.readline()
writer.close()
time.sleep(0.7)
if current == goal: if current == goal:
break break
for next in for next in local_graph:
new_cost = cost_so_far[current] + 1 new_cost = cost_so_far[current] + 1
if next not in cost_so_far or new_cost < cost_so_far[next]: if next not in cost_so_far or new_cost < cost_so_far[next]:
cost_so_far[next] = new_cost cost_so_far[next] = new_cost
priority = new_cost + heuristic(goal, next) priority = new_cost + heuristic(goal, next)
frontier.put(next, priority) frontier.put(next, priority)
came_from[next] = current came_from[next] = current
reader, writer = await asyncio.open_connection(
'127.0.0.1', 8888)
writer.write("move XD\n".encode()) start_flag = False
data = await reader.readline()
sys.stdout.write(data.decode())
time.sleep(0.7)
writer.write("rotate E\n".encode())
data = await reader.readline()
sys.stdout.write(data.decode())
time.sleep(0.7)
writer.close()
asyncio.run(tractor()) asyncio.run(tractor())