forked from Telos4/RoboRally
164 lines
5.1 KiB
Python
164 lines
5.1 KiB
Python
|
from flask import Flask, render_template, request, session, make_response
|
||
|
import socket
|
||
|
import time
|
||
|
import numpy as np
|
||
|
from playsound import playsound
|
||
|
from itertools import zip_longest
|
||
|
import random
|
||
|
import json
|
||
|
import pygame
|
||
|
|
||
|
app = Flask(__name__)
|
||
|
app.secret_key = b'RoboRallyRolling'
|
||
|
|
||
|
probabilities = [0.21428571428571427, 0.14285714285714285, 0.07142857142857142, 0.07142857142857142,
|
||
|
0.21428571428571427, 0.21428571428571427, 0.07142857142857142]
|
||
|
|
||
|
#deck = roborally.CardDeck()
|
||
|
|
||
|
class Cmd:
|
||
|
possible_moves = ['forward', 'left', 'right', 'P0']
|
||
|
possible_colors = [(200,200,200), (255, 0, 0), (0,0,255)]
|
||
|
|
||
|
def __init__(self, action, color):
|
||
|
self.action = action
|
||
|
self.color = color
|
||
|
|
||
|
def __str__(self):
|
||
|
return "Cmd No. " + self.action
|
||
|
|
||
|
def __repr__(self):
|
||
|
return self.action + " " + str(self.color)
|
||
|
|
||
|
|
||
|
available_robots = {
|
||
|
0: {'id': 11, 'ip': '192.168.1.11', 'x': 1, 'y': 2, 'orientation': '>'},
|
||
|
1: {'id': 12, 'ip': '192.168.1.12', 'x': 3, 'y': 3, 'orientation': '>'}
|
||
|
}
|
||
|
|
||
|
|
||
|
players = {}
|
||
|
|
||
|
|
||
|
class Player:
|
||
|
MAX_PLAYERS = 4
|
||
|
player_counter = 0
|
||
|
|
||
|
def __init__(self):
|
||
|
if Player.player_counter < Player.MAX_PLAYERS:
|
||
|
self.id = Player.player_counter
|
||
|
Player.player_counter += 1
|
||
|
|
||
|
self.max_cards = 9
|
||
|
|
||
|
self.player_hand = deck.draw_cards(self.max_cards)
|
||
|
print("current hand: ", [str(c) for c in self.player_hand])
|
||
|
|
||
|
self.action_count = 5
|
||
|
self.action_chosen = False
|
||
|
|
||
|
self.initialize_robot()
|
||
|
|
||
|
else:
|
||
|
print("max players reached!")
|
||
|
|
||
|
def initialize_robot(self):
|
||
|
x = available_robots[self.id]['x']
|
||
|
y = available_robots[self.id]['y']
|
||
|
marker_id = available_robots[self.id]['id']
|
||
|
ip = available_robots[self.id]['ip']
|
||
|
orientation = available_robots[self.id]['orientation']
|
||
|
self.robot = game.board.create_robot(x, y, orientation, self.id, marker_id)
|
||
|
|
||
|
if game.comm_socket is not None:
|
||
|
cmd = f"initialize_robot, {marker_id}, {ip}, {x-1}, {y-1}, {orientation}\n"
|
||
|
game.comm_socket.sendall(cmd.encode())
|
||
|
data = game.comm_socket.recv(32)
|
||
|
|
||
|
if data.decode() == 'OK\n':
|
||
|
print("robot sucessfully initialized!")
|
||
|
else:
|
||
|
print("error: could not initialize robot!")
|
||
|
self.robot = None
|
||
|
|
||
|
def draw_new_cards(self):
|
||
|
self.player_hand += deck.draw_cards(self.max_cards - len(self.player_hand))
|
||
|
|
||
|
|
||
|
@app.route('/send_cmds', methods=['POST', 'GET'])
|
||
|
def send_cmds():
|
||
|
if request.method == 'POST':
|
||
|
cmds = json.loads(request.form['cmds_json'])
|
||
|
|
||
|
cmd_list = []
|
||
|
for cmd_nr in [f"cmd{i}" for i in range(5)]:
|
||
|
cmd = cmds[cmd_nr]
|
||
|
action = cmd['action']
|
||
|
color_str = cmd['color']
|
||
|
color_str = color_str.strip("()").split(",")
|
||
|
color = tuple(map(int, color_str))
|
||
|
cmd_list.append(Cmd(action, color))
|
||
|
print("got commands: ", cmd_list)
|
||
|
ev = pygame.event.Event(pygame.USEREVENT, {'cmds': cmd_list})
|
||
|
pygame.event.post(ev)
|
||
|
|
||
|
# send commands to the game
|
||
|
|
||
|
# if game.ready():
|
||
|
# game.process_actions()
|
||
|
#
|
||
|
# return 'OK'
|
||
|
# else:
|
||
|
# return 'please wait'
|
||
|
return "OK"
|
||
|
elif request.method == 'GET':
|
||
|
# GET is used when we have to wait for other players to finish
|
||
|
while not game.processing_done: # wait for other players to choose commands and processing to finish
|
||
|
pass
|
||
|
|
||
|
return 'OK'
|
||
|
|
||
|
WHITE = (255, 255, 255)
|
||
|
GRAY = (200, 200, 200)
|
||
|
RED = (255, 0, 0)
|
||
|
BLUE = (0, 0, 255)
|
||
|
|
||
|
@app.route('/', methods=['GET', 'POST'])
|
||
|
def hello_world():
|
||
|
prg = [Cmd('forward', GRAY), Cmd('left', GRAY), Cmd('right', BLUE),
|
||
|
Cmd('P0', GRAY), Cmd('right', RED)]
|
||
|
valid_cmds = [Cmd('forward', WHITE), Cmd('right', WHITE), Cmd('left', WHITE),
|
||
|
Cmd('P0', WHITE), Cmd('-', RED), Cmd('-', BLUE), Cmd('-', GRAY)]
|
||
|
|
||
|
if request.method == 'GET':
|
||
|
robot_info = None
|
||
|
return render_template('drag_example.html', current_program=prg, valid_commands=valid_cmds, robot_info=robot_info)
|
||
|
elif request.method == 'POST':
|
||
|
# print(request.form)
|
||
|
|
||
|
if request.form.get('drag') and request.form.get('drop'):
|
||
|
# swap cards in the current hand
|
||
|
i1 = int(request.form.get('drag')) # number of first card
|
||
|
i2 = int(request.form.get('drop')) # number of second card
|
||
|
|
||
|
card1 = deck.deck[i1] # get card by number
|
||
|
card2 = deck.deck[i2]
|
||
|
|
||
|
print("swapping {} and {}".format(card1, card2))
|
||
|
|
||
|
j1 = player_hand.index(card1) # get index of card in the hand
|
||
|
j2 = player_hand.index(card2)
|
||
|
|
||
|
player_hand[j1], player_hand[j2] = player_hand[j2], player_hand[j1] # swap the cards in the list
|
||
|
|
||
|
# print("current hand: ", [str(c) for c in player_hand[player_id]])
|
||
|
|
||
|
return 'OK'
|
||
|
else:
|
||
|
return render_template('drag_example.html', cmds=player_hand, player_id=player_id)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
#app.run(host='192.168.1.222', port=5000)
|
||
|
app.run(host='0.0.0.0', port=5000)
|