SZI_PROJEKT_GR1_TRAKTOR/env.py
2019-05-31 15:06:43 +02:00

169 lines
4.4 KiB
Python
Executable File

#!/usr/bin/env python3
import string
import sys
import os
import time
import asyncio
from Tomato import Tomato
from Cucumber import Cucumber
from Plant import Plant
from Trac import Trac
string.ascii_letters = 'oOpPx'
string.ascii_numbers = '01'
OKGREEN = '\033[92m'
OKBLUE = '\033[94m'
OKRED = '\033[91m'
ENDC = '\033[0m'
def initialize_field():
field = []
for i in range(11):
row = []
for j in range(7):
if i == 0 or i == 10 or j == 0 \
or j == 3 or j == 6:
row.append(None)
elif j < 3:
row.append(Cucumber())
else:
row.append(Tomato())
field.append(row)
return field
def print_field(field, tractor):
if sys.platform == "win32":
os.system("cls")
else:
os.system("clear")
print(tractor.get_position())
sys.stdout.write(OKBLUE)
sys.stdout.write("$")
sys.stdout.write(" ")
sys.stdout.write("\n")
for x, row in enumerate(field):
for y, i in enumerate(row):
if not i:
if tractor.get_position()[0] == x \
and tractor.get_position()[1] == y:
sys.stdout.write(OKBLUE)
sys.stdout.write(tractor.get_symbol())
sys.stdout.write(" ")
else:
sys.stdout.write(" ")
else:
symbol = i.get_symbol()
if symbol[1] == "green":
sys.stdout.write(OKGREEN)
sys.stdout.write(symbol[0])
sys.stdout.write(" ")
else:
sys.stdout.write(OKRED)
sys.stdout.write(symbol[0])
sys.stdout.write(" ")
sys.stdout.write("\n")
def update_state(field):
for row in field:
for i in row:
if i:
i.tick(1)
def try_move(field, tractor):
x = tractor.get_position()[0]
y = tractor.get_position()[1]
rotation = tractor.get_rotation()
if rotation == 'N':
x -= 1
elif rotation == 'S':
x += 1
elif rotation == 'W':
y -= 1
else:
y += 1
if x >= 0 and x < len(field) \
and y >= 0 and y < len(field[0]) \
and not field[x][y]:
# print(str(x) + " " + str(y))
return True
return False
def look_at_plats(field, location):
<<<<<<< HEAD
wsp = []
def send_stats(field, location):
x = location[0]
y = location[1]
stats = field[x][y]
str_stats = str(stats["ttl"]) + " " + str(stats["is_alive"]) + " " + str(stats["hydration"]) + " " \
+ str(stats["soil_level"]) + " " + str(stats["ready"]) + "\n"
return str_stats
=======
wsp = [
(location[0] + 1, location[1]),
(location[0] - 1, location[1]),
(location[0], location[1] - 1),
(location[0], location[1] + 1)
]
return wsp
>>>>>>> 7994cc70ae86d020bb27138d1becb1bf9b8befe1
if __name__ == "__main__":
field = initialize_field()
tractor = Trac('N', (0,0))
async def handle_echo(reader, writer):
data = await reader.readline()
message = data.decode().split()
if message[0] == "rotate":
tractor.set_rotation(message[1])
writer.write("OK\n".encode())
elif message[0] == "try":
if try_move(field, tractor):
writer.write("OK\n".encode())
else:
writer.write("FAIL\n".encode())
elif message[0] == "move":
tractor.move()
writer.write(("OK\n").encode())
elif message[0] == "look":
tractor.move()
writer.write(("OK\n").encode())
elif message[0] == "get_stats":
x = message[1]
y = message[2]
stats = send_stats(field, (x, y)).encode()
writer.write(stats)
print_field(field, tractor)
# print(tractor.get_position().get_x())
# print(tractor.get_position().get_y())
# print(tractor.get_rotation())
update_state(field)
await writer.drain()
writer.close()
async def main():
server = await asyncio.start_server(
handle_echo, '127.0.0.1', 8888)
addr = server.sockets[0].getsockname()
async with server:
await server.serve_forever()
asyncio.run(main())