added level editor and improved user interface
This commit is contained in:
parent
4597fa88d6
commit
5ffec68506
33
app.py
33
app.py
|
@ -3,6 +3,7 @@ import random
|
||||||
import socket
|
import socket
|
||||||
import time
|
import time
|
||||||
import roborally
|
import roborally
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.secret_key = b'RoboRallyRolling'
|
app.secret_key = b'RoboRallyRolling'
|
||||||
|
@ -110,6 +111,28 @@ class Player:
|
||||||
def initialize_robot(self, x, y, orientation, marker_id):
|
def initialize_robot(self, x, y, orientation, marker_id):
|
||||||
self.robot = game.board.create_robot(x, y, orientation, self.id, marker_id)
|
self.robot = game.board.create_robot(x, y, orientation, self.id, marker_id)
|
||||||
|
|
||||||
|
# TODO: general form
|
||||||
|
# (1,1) <-> (-6, 3)
|
||||||
|
# (1,2) <-> (-6, 2) -> y_ctrl = y_game - 4
|
||||||
|
# (2,1) <-> (-5, 3) -> x_ctrl = x_game - 7
|
||||||
|
x_trans = x - 7
|
||||||
|
y_trans = 4 - y
|
||||||
|
angle_trans = {'>': 0.0, 'v': -np.pi/2, '<': -np.pi, '^': np.pi/2}
|
||||||
|
cmd = "set position, {}, ({}, {}, {})\n".format(marker_id, x_trans, y_trans, angle_trans[orientation])
|
||||||
|
game.comm_socket.sendall(cmd.encode())
|
||||||
|
data = game.comm_socket.recv(32)
|
||||||
|
print("data from set position: ", data)
|
||||||
|
|
||||||
|
cmd2 = "turn left, {}\n".format(marker_id)
|
||||||
|
game.comm_socket.sendall(cmd2.encode())
|
||||||
|
data = game.comm_socket.recv(32)
|
||||||
|
print("data from turn left: ", data)
|
||||||
|
|
||||||
|
cmd3 = "turn right, {}\n".format(marker_id)
|
||||||
|
game.comm_socket.sendall(cmd3.encode())
|
||||||
|
data = game.comm_socket.recv(32)
|
||||||
|
print("data from turn right: ", data)
|
||||||
|
|
||||||
def draw_new_cards(self):
|
def draw_new_cards(self):
|
||||||
self.player_hand += deck.draw_cards(self.max_cards - len(self.player_hand))
|
self.player_hand += deck.draw_cards(self.max_cards - len(self.player_hand))
|
||||||
|
|
||||||
|
@ -124,7 +147,9 @@ def send_cmds():
|
||||||
if p.robot is None:
|
if p.robot is None:
|
||||||
x = int(request.form.get('x'))
|
x = int(request.form.get('x'))
|
||||||
y = int(request.form.get('y'))
|
y = int(request.form.get('y'))
|
||||||
p.initialize_robot(x, y, '>', 11)
|
orient = request.form.get('orient')
|
||||||
|
marker_id = int(request.form.get('marker_id'))
|
||||||
|
p.initialize_robot(x, y, orient, marker_id)
|
||||||
|
|
||||||
if game.register_actions(p.id, p.player_hand[0:p.action_count]):
|
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.player_hand = p.player_hand[p.action_count:] # discard used cards
|
||||||
|
@ -167,10 +192,10 @@ def hello_world():
|
||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
robot = players[player_id].robot
|
robot = players[player_id].robot
|
||||||
if robot is not None:
|
if robot is not None:
|
||||||
robot_pos = (robot.x, robot.y, robot.orientation)
|
robot_info = (robot.x, robot.y, robot.orientation, robot.marker_id)
|
||||||
else:
|
else:
|
||||||
robot_pos = None
|
robot_info = None
|
||||||
return render_template('drag_example.html', cmds=player_hand, player_id=player_id, robot_pos=robot_pos)
|
return render_template('drag_example.html', cmds=player_hand, player_id=player_id, robot_info=robot_info)
|
||||||
elif request.method == 'POST':
|
elif request.method == 'POST':
|
||||||
#print(request.form)
|
#print(request.form)
|
||||||
|
|
||||||
|
|
9
board.txt
Normal file
9
board.txt
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
###############
|
||||||
|
# #p<<<<< #
|
||||||
|
# a # b #
|
||||||
|
# v # v>> #
|
||||||
|
# + - +r- + p-#
|
||||||
|
#^<<^ # ^ #
|
||||||
|
# d # c #
|
||||||
|
# >>>>> < #
|
||||||
|
###############
|
77
roborally.py
77
roborally.py
|
@ -225,6 +225,9 @@ class Tile:
|
||||||
#
|
#
|
||||||
# occupant: Robot that is standing on the tile
|
# occupant: Robot that is standing on the tile
|
||||||
def __init__(self, x, y, modifier=None):
|
def __init__(self, x, y, modifier=None):
|
||||||
|
if modifier == ' ':
|
||||||
|
self.modifier = None
|
||||||
|
else:
|
||||||
self.modifier = modifier
|
self.modifier = modifier
|
||||||
self.occupant = None
|
self.occupant = None
|
||||||
self.x = x
|
self.x = x
|
||||||
|
@ -265,39 +268,42 @@ class Tile:
|
||||||
|
|
||||||
|
|
||||||
class Board:
|
class Board:
|
||||||
x_dims = 12 # number of tiles in x direction
|
x_dims = 13 # number of tiles in x direction
|
||||||
y_dims = 6 # number of tiles in y direction
|
y_dims = 7 # number of tiles in y direction
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.board = {}
|
self.board = self.read_board_from_file('board.txt')
|
||||||
for x in range(Board.x_dims + 2):
|
|
||||||
for y in range(Board.y_dims + 2):
|
|
||||||
if (x == 0) or (x == Board.x_dims + 1) or (y == 0) or (y == Board.y_dims + 1):
|
|
||||||
# place walls around the board
|
|
||||||
self.board[(x, y)] = Tile(x, y, '#')
|
|
||||||
elif y > 2 and y < 6 and x == 7:
|
|
||||||
self.board[(x, y)] = Tile(x, y, '#')
|
|
||||||
elif x == 1 and (y >= 1) and (y < 4):
|
|
||||||
self.board[(x, y)] = Tile(x, y, 'v')
|
|
||||||
elif y == 4:
|
|
||||||
self.board[(x, y)] = Tile(x, y, '>')
|
|
||||||
elif y == 1 and (x >= 2) and (x < 5):
|
|
||||||
self.board[(x, y)] = Tile(x, y, '>')
|
|
||||||
elif y == 1 and (x >= 6) and (x <= 8):
|
|
||||||
self.board[(x, y)] = Tile(x, y, '<')
|
|
||||||
else:
|
|
||||||
self.board[(x,y)] = Tile(x,y)
|
|
||||||
|
|
||||||
self.board[(5, 1)].modifier = '+'
|
#self.read_board_from_file('board.txt')
|
||||||
self.board[(5, 4)].modifier = '-'
|
|
||||||
self.board[(2, 2)].modifier = 'p'
|
|
||||||
self.board[(3, 3)].modifier = 'r'
|
|
||||||
|
|
||||||
# place flags near the corners of the board
|
# for x in range(Board.x_dims + 2):
|
||||||
self.board[(2,2)].modifier = 'a'
|
# for y in range(Board.y_dims + 2):
|
||||||
self.board[(Board.x_dims-1, 2)].modifier = 'b'
|
# if (x == 0) or (x == Board.x_dims + 1) or (y == 0) or (y == Board.y_dims + 1):
|
||||||
self.board[(Board.x_dims-1, Board.y_dims-1)].modifier = 'c'
|
# # place walls around the board
|
||||||
self.board[(2, Board.y_dims-1)].modifier = 'd'
|
# self.board[(x, y)] = Tile(x, y, '#')
|
||||||
|
# elif y > 2 and y < 6 and x == 7:
|
||||||
|
# self.board[(x, y)] = Tile(x, y, '#')
|
||||||
|
# elif x == 1 and (y >= 1) and (y < 4):
|
||||||
|
# self.board[(x, y)] = Tile(x, y, 'v')
|
||||||
|
# elif y == 4:
|
||||||
|
# self.board[(x, y)] = Tile(x, y, '>')
|
||||||
|
# elif y == 1 and (x >= 2) and (x < 5):
|
||||||
|
# self.board[(x, y)] = Tile(x, y, '>')
|
||||||
|
# elif y == 1 and (x >= 6) and (x <= 8):
|
||||||
|
# self.board[(x, y)] = Tile(x, y, '<')
|
||||||
|
# else:
|
||||||
|
# self.board[(x,y)] = Tile(x,y)
|
||||||
|
#
|
||||||
|
# self.board[(5, 1)].modifier = '+'
|
||||||
|
# self.board[(5, 4)].modifier = '-'
|
||||||
|
# self.board[(2, 2)].modifier = 'p'
|
||||||
|
# self.board[(3, 3)].modifier = 'r'
|
||||||
|
#
|
||||||
|
# # place flags near the corners of the board
|
||||||
|
# self.board[(2,2)].modifier = 'a'
|
||||||
|
# self.board[(Board.x_dims-1, 2)].modifier = 'b'
|
||||||
|
# self.board[(Board.x_dims-1, Board.y_dims-1)].modifier = 'c'
|
||||||
|
# self.board[(2, Board.y_dims-1)].modifier = 'd'
|
||||||
|
|
||||||
|
|
||||||
# self.board[(2, 2)].modifier = '^'
|
# self.board[(2, 2)].modifier = '^'
|
||||||
|
@ -310,6 +316,19 @@ class Board:
|
||||||
#self.robots[3] = Robot(2, 2, 'v', 3, self.board)
|
#self.robots[3] = Robot(2, 2, 'v', 3, self.board)
|
||||||
#self.create_robot(1,1,'>', 7, 11)
|
#self.create_robot(1,1,'>', 7, 11)
|
||||||
|
|
||||||
|
def read_board_from_file(self, file):
|
||||||
|
fh = open('board.txt').readlines()
|
||||||
|
Board.x_dims = len(fh[0].strip()) - 2
|
||||||
|
Board.y_dims = len(fh) - 2
|
||||||
|
|
||||||
|
board = {}
|
||||||
|
for y, line in enumerate(fh):
|
||||||
|
for x, tile_modifier in enumerate(line.strip()):
|
||||||
|
board[(x,y)] = Tile(x, y, tile_modifier)
|
||||||
|
return board
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def create_robot(self, x, y, orientation, player_id, marker_id):
|
def create_robot(self, x, y, orientation, player_id, marker_id):
|
||||||
new_robot = Robot(x, y, orientation, marker_id, self.board)
|
new_robot = Robot(x, y, orientation, marker_id, self.board)
|
||||||
self.robots[player_id] = new_robot
|
self.robots[player_id] = new_robot
|
||||||
|
|
|
@ -18,7 +18,44 @@
|
||||||
cursor: move;
|
cursor: move;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.robotOrientation {
|
||||||
|
width: 75px;
|
||||||
|
height: 75px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.robotOrientation90 {
|
||||||
|
width: 75px;
|
||||||
|
height: 75px;
|
||||||
|
-webkit-transform: rotate(90deg);
|
||||||
|
-moz-transform: rotate(90deg);
|
||||||
|
-o-transform: rotate(90deg);
|
||||||
|
-ms-transform: rotate(90deg);
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.robotOrientation180 {
|
||||||
|
width: 75px;
|
||||||
|
height: 75px;
|
||||||
|
-webkit-transform: rotate(180deg);
|
||||||
|
-moz-transform: rotate(180deg);
|
||||||
|
-o-transform: rotate(180deg);
|
||||||
|
-ms-transform: rotate(180deg);
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.robotOrientation270 {
|
||||||
|
width: 75px;
|
||||||
|
height: 75px;
|
||||||
|
-webkit-transform: rotate(270deg);
|
||||||
|
-moz-transform: rotate(270deg);
|
||||||
|
-o-transform: rotate(270deg);
|
||||||
|
-ms-transform: rotate(270deg);
|
||||||
|
transform: rotate(270deg);
|
||||||
|
}
|
||||||
|
|
||||||
.rotate90 {
|
.rotate90 {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
-webkit-transform: rotate(90deg);
|
-webkit-transform: rotate(90deg);
|
||||||
-moz-transform: rotate(90deg);
|
-moz-transform: rotate(90deg);
|
||||||
-o-transform: rotate(90deg);
|
-o-transform: rotate(90deg);
|
||||||
|
|
|
@ -27,23 +27,43 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{% if robot_pos is none %}
|
{% if robot_info is none %}
|
||||||
<label for="inputRobotX">X:</label>
|
<label for="inputRobotX">X:</label>
|
||||||
<input type="number" id="inputRobotX" name="robot_x" min="1" max="12" value="5">
|
<input type="number" id="inputRobotX" name="robot_x" min="1" max="13" value="1">
|
||||||
|
<br>
|
||||||
<label for="inputRobotY">Y:</label>
|
<label for="inputRobotY">Y:</label>
|
||||||
<input type="number" id="inputRobotY" name="robot_y" min="1" max="6" value="3">
|
<input type="number" id="inputRobotY" name="robot_y" min="1" max="7" value="1">
|
||||||
|
<br>
|
||||||
<img id="orientation" src="/static/orientation.png" alt="0">
|
<label for="orientation">Orientation:</label>
|
||||||
|
<img id="orientation" class="robotOrientation" src="/static/orientation.png" alt="0">
|
||||||
|
<input hidden id="inputRobotOrientation" value=">" readonly>
|
||||||
|
<br>
|
||||||
|
<label for="inputRobotID">Robot ID:</label>
|
||||||
|
<select name="robotID" id="inputRobotID">
|
||||||
|
<option value="11">11</option>
|
||||||
|
<option value="12">12</option>
|
||||||
|
<option value="13">13</option>
|
||||||
|
<option value="14">14</option>
|
||||||
|
</select>
|
||||||
{% else %}
|
{% else %}
|
||||||
<label for="inputRobotX">X:</label>
|
<label for="outputRobotX">X:</label>
|
||||||
<input type="number" id="inputRobotX" name="robot_x" min="1" max="12" value="{{ robot_pos[0] }}" readonly>
|
<input type="number" id="outputRobotX" name="robot_x" min="1" max="12" value="{{ robot_info[0] }}" readonly>
|
||||||
|
<br>
|
||||||
<label for="inputRobotY">Y:</label>
|
<label for="outputRobotY">Y:</label>
|
||||||
<input type="number" id="inputRobotY" name="robot_y" min="1" max="6" value="{{ robot_pos[1] }}" readonly>
|
<input type="number" id="outputRobotY" name="robot_y" min="1" max="6" value="{{ robot_info[1] }}" readonly>
|
||||||
|
<br>
|
||||||
<img id="orientation" src="/static/orientation.png" name="{{ robot_pos[2] }}">
|
{% if robot_info[2] == '>' %}
|
||||||
|
<img id="outputOrientation" class="robotOrientation" src="/static/orientation.png" alt="0">
|
||||||
|
{% elif robot_info[2] == 'v' %}
|
||||||
|
<img id="outputOrientation" class="robotOrientation90" src="/static/orientation.png" alt="0">
|
||||||
|
{% elif robot_info[2] == '<' %}
|
||||||
|
<img id="outputOrientation" class="robotOrientation180" src="/static/orientation.png" alt="0">
|
||||||
|
{% elif robot_info[2] == '^' %}
|
||||||
|
<img id="outputOrientation" class="robotOrientation270" src="/static/orientation.png" alt="0">
|
||||||
|
{% endif %}
|
||||||
|
<br>
|
||||||
|
<label for="outputRobotID">Robot ID:</label>
|
||||||
|
<input name="robotID" id="outputRobotID" value="{{ robot_info[3] }}" readonly>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -66,19 +86,28 @@
|
||||||
var mainCanvas = $(".main-canvas");
|
var mainCanvas = $(".main-canvas");
|
||||||
|
|
||||||
var orientation_icon = $("#orientation");
|
var orientation_icon = $("#orientation");
|
||||||
|
var orientation_input = $("#inputRobotOrientation");
|
||||||
|
|
||||||
orientation_icon.click(function () {
|
orientation_icon.click(function () {
|
||||||
if (this.alt === "0") {
|
if (this.alt === "0") {
|
||||||
this.alt = "90";
|
this.alt = "90";
|
||||||
|
$("#inputRobotOrientation").val("v");
|
||||||
|
//document.getElementById("inputRobotOrientation").value = "v";
|
||||||
}
|
}
|
||||||
else if (this.alt === "90") {
|
else if (this.alt === "90") {
|
||||||
this.alt = "180";
|
this.alt = "180";
|
||||||
|
$("#inputRobotOrientation").val("<");
|
||||||
|
//document.getElementById("inputRobotOrientation").value = "<";
|
||||||
}
|
}
|
||||||
else if (this.alt === "180") {
|
else if (this.alt === "180") {
|
||||||
this.alt = "270";
|
this.alt = "270";
|
||||||
|
$("#inputRobotOrientation").val("^");
|
||||||
|
//document.getElementById("inputRobotOrientation").value = "^";
|
||||||
}
|
}
|
||||||
else if (this.alt === "270") {
|
else if (this.alt === "270") {
|
||||||
this.alt = "0";
|
this.alt = "0";
|
||||||
|
$("#inputRobotOrientation").val(">");
|
||||||
|
//document.getElementById("inputRobotOrientation").value = ">";
|
||||||
}
|
}
|
||||||
$(this).css({'transform' : 'rotate('+ this.alt +'deg)'});
|
$(this).css({'transform' : 'rotate('+ this.alt +'deg)'});
|
||||||
});
|
});
|
||||||
|
@ -87,7 +116,8 @@
|
||||||
$("#btnSubmit").click(function () {
|
$("#btnSubmit").click(function () {
|
||||||
var robot_x = $("#inputRobotX");
|
var robot_x = $("#inputRobotX");
|
||||||
var robot_y = $("#inputRobotY");
|
var robot_y = $("#inputRobotY");
|
||||||
|
var robot_orient = $("#inputRobotOrientation");
|
||||||
|
var robot_id = $("#inputRobotID");
|
||||||
//alert("button");
|
//alert("button");
|
||||||
for (i = 0; i < 9; i++) {
|
for (i = 0; i < 9; i++) {
|
||||||
var c = document.getElementsByClassName("box card" + String(i));
|
var c = document.getElementsByClassName("box card" + String(i));
|
||||||
|
@ -97,7 +127,7 @@
|
||||||
}
|
}
|
||||||
$(please_wait).show();
|
$(please_wait).show();
|
||||||
|
|
||||||
$.post("/send_cmds", { "x" : robot_x.val(), "y": robot_y.val()}, function (data) {
|
$.post("/send_cmds", { "x" : robot_x.val(), "y": robot_y.val(), "orient": robot_orient.val(), "marker_id": robot_id.val()}, function (data) {
|
||||||
console.log(data);
|
console.log(data);
|
||||||
if (data === 'OK') {
|
if (data === 'OK') {
|
||||||
location.reload(); // reload page to get new cards for next round
|
location.reload(); // reload page to get new cards for next round
|
||||||
|
|
Loading…
Reference in New Issue
Block a user