182 lines
6.1 KiB
Python
182 lines
6.1 KiB
Python
from flask import Flask, render_template, request, session, make_response
|
|
import random
|
|
import socket
|
|
import time
|
|
import roborally
|
|
|
|
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 Game:
|
|
def __init__(self):
|
|
self.action_stack = {}
|
|
self.processing_done = False # indicates whether all commands in the current round have been processed
|
|
|
|
self.board = roborally.Board()
|
|
|
|
self.comm_socket = socket.socket() # socket for communicating with the program controlling the robots
|
|
try:
|
|
self.comm_socket.connect(('192.168.1.222', 1337))
|
|
except socket.error:
|
|
print("could not connect to robot control socket!")
|
|
|
|
def ready(self):
|
|
# have all players chosen an action?
|
|
return len(self.action_stack.keys()) == Player.player_counter
|
|
|
|
def register_actions(self, player_id, actions):
|
|
# store the selected actions for the given player
|
|
if not player_id in self.action_stack.keys(): # make sure that the actions have not been registered before
|
|
print("registered actions: ", [str(a) for a in actions])
|
|
self.action_stack[player_id] = actions
|
|
deck.return_cards(actions) # put cards back into the deck
|
|
self.processing_done = False
|
|
return True
|
|
else:
|
|
print("actions already chosen!")
|
|
return False
|
|
|
|
def process_actions(self):
|
|
l = []
|
|
for p in self.action_stack.keys():
|
|
l.append(zip([p] * len(self.action_stack[p]), self.action_stack[p]))
|
|
chosen_cards = list(zip(*l))
|
|
|
|
# apply the chosen commands to the board which generates a list of movement commands to send to the control program
|
|
cmd_list = self.board.apply_actions(chosen_cards)
|
|
|
|
if False:
|
|
# send movements to the program
|
|
for c in current_actions:
|
|
if c[0] == 0:
|
|
print("{}, {}\n".format(c[1].action, 11))
|
|
self.comm_socket.sendall("{}, {}\n".format(c[1].action, 11).encode())
|
|
elif c[0] == 1:
|
|
print("{}, {}\n".format(c[1].action, 14))
|
|
self.comm_socket.sendall("{}, {}\n".format(c[1].action, 14).encode())
|
|
data = self.comm_socket.recv(32)
|
|
|
|
if data == b'OK\n':
|
|
print("an error occured while processing the commands")
|
|
self.processing_done = True
|
|
self.action_stack = {}
|
|
return
|
|
|
|
time.sleep(0.5)
|
|
|
|
#self.comm_socket.send()
|
|
|
|
|
|
# clear the action stack for the next round
|
|
self.action_stack = {}
|
|
|
|
self.processing_done = True
|
|
|
|
class Player:
|
|
MAX_PLAYERS = 3
|
|
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
|
|
|
|
else:
|
|
print("max players reached!")
|
|
|
|
def draw_new_cards(self):
|
|
self.player_hand += deck.draw_cards(self.max_cards - len(self.player_hand))
|
|
|
|
players = {}
|
|
game = Game()
|
|
|
|
|
|
@app.route('/send_cmds', methods=['POST', 'GET'])
|
|
def send_cmds():
|
|
if request.method == 'POST':
|
|
# POST is used for submitting commands
|
|
player_id = session['player_id']
|
|
p = players[player_id]
|
|
|
|
if game.register_actions(p.id, p.player_hand[0:p.action_count]):
|
|
p.player_hand = p.player_hand[p.action_count:] # discard used cards
|
|
p.draw_new_cards()
|
|
|
|
if game.ready():
|
|
game.process_actions()
|
|
|
|
return 'OK'
|
|
else:
|
|
return 'please wait'
|
|
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'
|
|
|
|
@app.route('/', methods=['GET', 'POST'])
|
|
def hello_world():
|
|
if not 'player_id' in session:
|
|
if Player.player_counter < Player.MAX_PLAYERS:
|
|
# new player
|
|
p = Player()
|
|
session['player_id'] = p.id
|
|
players[p.id] = p
|
|
player_id = session['player_id']
|
|
else:
|
|
return "Sorry, maximum number of players reached!"
|
|
else:
|
|
player_id = session['player_id']
|
|
if Player.player_counter < player_id + 1:
|
|
session.clear()
|
|
response = make_response('Please reload the page!')
|
|
#response.set_cookie('player_id', '', expires=0)
|
|
return response
|
|
player_hand = players[player_id].player_hand
|
|
|
|
|
|
if request.method == 'GET':
|
|
return render_template('drag_example.html', cmds=player_hand, player_id=player_id)
|
|
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='0.0.0.0', port=5000)
|