Commit 538a32cb authored by judge's avatar judge

QWebchess work

It sort of works, most of some of the time
parent 318bb473
...@@ -890,9 +890,11 @@ class HumanPlayer(Player): ...@@ -890,9 +890,11 @@ class HumanPlayer(Player):
sys.stdout.write("SELECTION?\n") sys.stdout.write("SELECTION?\n")
try: try:
p = map(int, sys.stdin.readline().strip("\r\n ").split(" ")) p = map(int, sys.stdin.readline().strip("\r\n ").split(" "))
return p
except: except:
sys.stderr.write("ILLEGAL GIBBERISH\n") sys.stderr.write("ILLEGAL GIBBERISH\n")
continue continue
# It's your move captain # It's your move captain
def get_move(self): def get_move(self):
if isinstance(graphics, GraphicsThread): if isinstance(graphics, GraphicsThread):
...@@ -908,6 +910,7 @@ class HumanPlayer(Player): ...@@ -908,6 +910,7 @@ class HumanPlayer(Player):
sys.stdout.write("MOVE?\n") sys.stdout.write("MOVE?\n")
try: try:
p = map(int, sys.stdin.readline().strip("\r\n ").split(" ")) p = map(int, sys.stdin.readline().strip("\r\n ").split(" "))
return p
except: except:
sys.stderr.write("ILLEGAL GIBBERISH\n") sys.stderr.write("ILLEGAL GIBBERISH\n")
continue continue
...@@ -1673,11 +1676,10 @@ class GameThread(StoppableThread): ...@@ -1673,11 +1676,10 @@ class GameThread(StoppableThread):
self.cond = threading.Condition() # conditional for some reason, I forgot self.cond = threading.Condition() # conditional for some reason, I forgot
self.final_result = "" self.final_result = ""
self.server = server self.server = server
self.retry_illegal = False
# Run the game (run in new thread with start(), run in current thread with run()) # Run the game (run in new thread with start(), run in current thread with run())
def run(self): def run(self):
...@@ -1804,14 +1806,17 @@ class GameThread(StoppableThread): ...@@ -1804,14 +1806,17 @@ class GameThread(StoppableThread):
break break
except Exception,e: except Exception,e:
#if False: #if False:
result = e.message
sys.stderr.write("qchess.py exception: "+result + "\n")
self.stop()
with self.lock: result = e.message
self.final_result = self.state["turn"].colour + " " + e.message if self.retry_illegal:
break self.state["turn"].update(result);
else:
sys.stderr.write("qchess.py exception: "+result + "\n")
self.stop()
with self.lock:
self.final_result = self.state["turn"].colour + " " + e.message
break
...@@ -2701,6 +2706,7 @@ def main(argv): ...@@ -2701,6 +2706,7 @@ def main(argv):
global sleep_timeout global sleep_timeout
retry_illegal = False
server_addr = None server_addr = None
max_moves = None max_moves = None
...@@ -2798,7 +2804,8 @@ def main(argv): ...@@ -2798,7 +2804,8 @@ def main(argv):
sleep_timeout = -1 sleep_timeout = -1
else: else:
sleep_timeout = float(arg[2:].split("=")[1]) sleep_timeout = float(arg[2:].split("=")[1])
elif (arg[1] == '-' and arg[2:] == "retry-illegal"):
retry_illegal = not retry_illegal
elif (arg[1] == '-' and arg[2:] == "help"): elif (arg[1] == '-' and arg[2:] == "help"):
# Help # Help
os.system("less data/help.txt") # The best help function os.system("less data/help.txt") # The best help function
...@@ -2845,6 +2852,7 @@ def main(argv): ...@@ -2845,6 +2852,7 @@ def main(argv):
board = Board(style) board = Board(style)
board.max_moves = max_moves board.max_moves = max_moves
game = GameThread(board, players) game = GameThread(board, players)
game.retry_illegal = retry_illegal
...@@ -2987,4 +2995,4 @@ if __name__ == "__main__": ...@@ -2987,4 +2995,4 @@ if __name__ == "__main__":
# --- main.py --- # # --- main.py --- #
# EOF - created from make on Sun May 19 12:36:10 WST 2013 # EOF - created from make on Thursday 20 June 18:09:07 WST 2013
...@@ -15,11 +15,10 @@ class GameThread(StoppableThread): ...@@ -15,11 +15,10 @@ class GameThread(StoppableThread):
self.cond = threading.Condition() # conditional for some reason, I forgot self.cond = threading.Condition() # conditional for some reason, I forgot
self.final_result = "" self.final_result = ""
self.server = server self.server = server
self.retry_illegal = False
# Run the game (run in new thread with start(), run in current thread with run()) # Run the game (run in new thread with start(), run in current thread with run())
def run(self): def run(self):
...@@ -146,14 +145,17 @@ class GameThread(StoppableThread): ...@@ -146,14 +145,17 @@ class GameThread(StoppableThread):
break break
except Exception,e: except Exception,e:
#if False: #if False:
result = e.message
sys.stderr.write("qchess.py exception: "+result + "\n")
self.stop()
with self.lock: result = e.message
self.final_result = self.state["turn"].colour + " " + e.message if self.retry_illegal:
break self.state["turn"].update(result);
else:
sys.stderr.write("qchess.py exception: "+result + "\n")
self.stop()
with self.lock:
self.final_result = self.state["turn"].colour + " " + e.message
break
......
...@@ -88,6 +88,7 @@ def main(argv): ...@@ -88,6 +88,7 @@ def main(argv):
global sleep_timeout global sleep_timeout
retry_illegal = False
server_addr = None server_addr = None
max_moves = None max_moves = None
...@@ -185,7 +186,8 @@ def main(argv): ...@@ -185,7 +186,8 @@ def main(argv):
sleep_timeout = -1 sleep_timeout = -1
else: else:
sleep_timeout = float(arg[2:].split("=")[1]) sleep_timeout = float(arg[2:].split("=")[1])
elif (arg[1] == '-' and arg[2:] == "retry-illegal"):
retry_illegal = not retry_illegal
elif (arg[1] == '-' and arg[2:] == "help"): elif (arg[1] == '-' and arg[2:] == "help"):
# Help # Help
os.system("less data/help.txt") # The best help function os.system("less data/help.txt") # The best help function
...@@ -232,6 +234,7 @@ def main(argv): ...@@ -232,6 +234,7 @@ def main(argv):
board = Board(style) board = Board(style)
board.max_moves = max_moves board.max_moves = max_moves
game = GameThread(board, players) game = GameThread(board, players)
game.retry_illegal = retry_illegal
......
...@@ -265,9 +265,11 @@ class HumanPlayer(Player): ...@@ -265,9 +265,11 @@ class HumanPlayer(Player):
sys.stdout.write("SELECTION?\n") sys.stdout.write("SELECTION?\n")
try: try:
p = map(int, sys.stdin.readline().strip("\r\n ").split(" ")) p = map(int, sys.stdin.readline().strip("\r\n ").split(" "))
return p
except: except:
sys.stderr.write("ILLEGAL GIBBERISH\n") sys.stderr.write("ILLEGAL GIBBERISH\n")
continue continue
# It's your move captain # It's your move captain
def get_move(self): def get_move(self):
if isinstance(graphics, GraphicsThread): if isinstance(graphics, GraphicsThread):
...@@ -283,6 +285,7 @@ class HumanPlayer(Player): ...@@ -283,6 +285,7 @@ class HumanPlayer(Player):
sys.stdout.write("MOVE?\n") sys.stdout.write("MOVE?\n")
try: try:
p = map(int, sys.stdin.readline().strip("\r\n ").split(" ")) p = map(int, sys.stdin.readline().strip("\r\n ").split(" "))
return p
except: except:
sys.stderr.write("ILLEGAL GIBBERISH\n") sys.stderr.write("ILLEGAL GIBBERISH\n")
continue continue
......
<html> <html>
<head> <head>
<title>QChess Web UI</title> <title id="status">QChess Web UI</title>
<!--<link rel="stylesheet" href="css.css" />--> <!--<link rel="stylesheet" href="css.css" />-->
<script type="text/javascript" src="jquery-1.10.1.min.js"></script>
<script type="text/javascript" src="js.js"></script> <script type="text/javascript" src="js.js"></script>
<style>
div
{
position:relative;
width:600px;
height:800px;
text-align:center;
}
input
{
position:relative;
width:80px;
height:30px;
}
</style>
</head> </head>
<body onload="javascript:boardLoad();" style="width: 100%"> <body style="width: 100%">
<div>
<table style="margin-left: auto; margin-right: auto; font-size: 20" width=600px height=600px> <p id="welcome"> Press the button to start </p>
<tr><td onclick="javascript:selectPiece('00');" id="00"></td><td onclick="javascript:selectPiece('01');" id="01"></td><td onclick="javascript:selectPiece('02');" id="02"></td><td onclick="javascript:selectPiece('03');" id="03"></td><td onclick="javascript:selectPiece('04');" id="04"></td><td onclick="javascript:selectPiece('05');" id="05"></td><td onclick="javascript:selectPiece('06');" id="06"></td><td onclick="javascript:selectPiece('07');" id="07"></td></tr>
<tr><td onclick="javascript:selectPiece('10');" id="10"></td><td onclick="javascript:selectPiece('11');" id="11"></td><td onclick="javascript:selectPiece('12');" id="12"></td><td onclick="javascript:selectPiece('13');" id="13"></td><td onclick="javascript:selectPiece('14');" id="14"></td><td onclick="javascript:selectPiece('15');" id="15"></td><td onclick="javascript:selectPiece('16');" id="16"></td><td onclick="javascript:selectPiece('17');" id="17"></td></tr> <div style="width:100%;">
<tr><td onclick="javascript:selectPiece('20');" id="20"></td><td onclick="javascript:selectPiece('21');" id="21"></td><td onclick="javascript:selectPiece('22');" id="22"></td><td onclick="javascript:selectPiece('23');" id="23"></td><td onclick="javascript:selectPiece('24');" id="24"></td><td onclick="javascript:selectPiece('25');" id="25"></td><td onclick="javascript:selectPiece('26');" id="26"></td><td onclick="javascript:selectPiece('27');" id="27"></td></tr> <!-- Board and UI -->
<tr><td onclick="javascript:selectPiece('30');" id="30"></td><td onclick="javascript:selectPiece('31');" id="31"></td><td onclick="javascript:selectPiece('32');" id="32"></td><td onclick="javascript:selectPiece('33');" id="33"></td><td onclick="javascript:selectPiece('34');" id="34"></td><td onclick="javascript:selectPiece('35');" id="35"></td><td onclick="javascript:selectPiece('36');" id="36"></td><td onclick="javascript:selectPiece('37');" id="37"></td></tr> <div>
<tr><td onclick="javascript:selectPiece('40');" id="40"></td><td onclick="javascript:selectPiece('41');" id="41"></td><td onclick="javascript:selectPiece('42');" id="42"></td><td onclick="javascript:selectPiece('43');" id="43"></td><td onclick="javascript:selectPiece('44');" id="44"></td><td onclick="javascript:selectPiece('45');" id="45"></td><td onclick="javascript:selectPiece('46');" id="46"></td><td onclick="javascript:selectPiece('47');" id="47"></td></tr> <table style="margin-left: auto; margin-right: auto; font-size: 18" width=500px height=500px id="board"></table>
<tr><td onclick="javascript:selectPiece('50');" id="50"></td><td onclick="javascript:selectPiece('51');" id="51"></td><td onclick="javascript:selectPiece('52');" id="52"></td><td onclick="javascript:selectPiece('53');" id="53"></td><td onclick="javascript:selectPiece('54');" id="54"></td><td onclick="javascript:selectPiece('55');" id="55"></td><td onclick="javascript:selectPiece('56');" id="56"></td><td onclick="javascript:selectPiece('57');" id="57"></td></tr> <button id="start">New Game</button>
<tr><td onclick="javascript:selectPiece('60');" id="60"></td><td onclick="javascript:selectPiece('61');" id="61"></td><td onclick="javascript:selectPiece('62');" id="62"></td><td onclick="javascript:selectPiece('63');" id="63"></td><td onclick="javascript:selectPiece('64');" id="64"></td><td onclick="javascript:selectPiece('65');" id="65"></td><td onclick="javascript:selectPiece('66');" id="66"></td><td onclick="javascript:selectPiece('67');" id="67"></td></tr> <p id="loglink"></p>
<tr><td onclick="javascript:selectPiece('70');" id="70"></td><td onclick="javascript:selectPiece('71');" id="71"></td><td onclick="javascript:selectPiece('72');" id="72"></td><td onclick="javascript:selectPiece('73');" id="73"></td><td onclick="javascript:selectPiece('74');" id="74"></td><td onclick="javascript:selectPiece('75');" id="75"></td><td onclick="javascript:selectPiece('76');" id="76"></td><td onclick="javascript:selectPiece('77');" id="77"></td></tr> </div>
</table>
<br /> <!-- Message box
<br /> <div style="float:right;">
<small>Made By Sam Moore [SZM] and Mitchell Pomery [BG3]</small> <h2>Messages</h2>
<input type="text" value="" id="messages" style="width:80%; height:80%;">
<input type="text" value="" id="say" style="width:60%;">
<button id="message" style="width:20%;">Send</button>
</div> -->
</div> </div>
</body> </body>
</html> </html>
//progcomp.ucc.asn.au/cgi-bin/qchess.cgi?r=start /**
//progcomp.ucc.asn.au/cgi-bin/qchess.cgi?r=quit * qwebchess.js
//progcomp.ucc.asn.au/cgi-bin/qchess.cgi?x=X&y=Y (0 indexed) * jQuery interface for Quantum Chess
*
* @authors Sam Moore and Mitch Pomery
*/
pieceSelected = ""; // currently selected piece pieceSelected = ""; // currently selected piece
piece = ""; playerColour = "W"; // colour of this player
colour = "W"; // colour of this player
canClick = true;
// Unicode representations of chess pieces // Unicode representations of chess pieces
pieceChar = {"W" : { "p" : "\u2659", "h" : "\u2658", "b" : "\u2657", "r" : "\u2656", "q" : "\u2655", "k" : "\u2654", "?" : "?"}, pieceChar = {"W" : { "p" : "\u2659", "h" : "\u2658", "b" : "\u2657", "r" : "\u2656", "q" : "\u2655", "k" : "\u2654", "?" : "?"},
...@@ -13,250 +14,393 @@ pieceChar = {"W" : { "p" : "\u2659", "h" : "\u2658", "b" : "\u2657", "r" : "\u26 ...@@ -13,250 +14,393 @@ pieceChar = {"W" : { "p" : "\u2659", "h" : "\u2658", "b" : "\u2657", "r" : "\u26
emptyHTML = "<!--0-->&nbsp; <big> <bold>&nbsp;</bold> </big> &nbsp;" emptyHTML = "<!--0-->&nbsp; <big> <bold>&nbsp;</bold> </big> &nbsp;"
// Select (or move) a piece gameStarted = false;
function selectPiece(loc) { canClick = true;
if (!canClick)
return;
x = (""+loc).charAt(1);
y = (""+loc).charAt(0);
//alert(loc);
// work out whether to select or move based on the comment tag for the clicked location // jQuery foo goes in here
// It is either "<!--W-->" (white; select) or <!--B-->" (black) or "<!--0-->" (empty) $(document).ready(function()
if (pieceSelected == "") {
// Click the start/quit button
$("#start").click(function()
{ {
square = document.getElementById(loc); if (gameStarted === false)
if (square.innerHTML.charAt(4) == colour)
{ {
console.log("Piece Selected: " + loc); gameStarted = true;
pieceSelected = loc; $("#board").boardLoad();
ajaxUpdate("x=" + x + "&y=" + y); $("#welcome").hide();
if ((+x + +y) % 2 == 0) $("#status").show();
square.style.background = "#DFD"; $("#status").html("white SELECT?");
else $("#start").html("Quit Game");
square.style.background = "#8F8";
}
}
else {
//alert("pieceMoved");
if (validMove(pieceSelected, piece, loc)) {
doMove(pieceSelected, loc);
ajaxUpdate("x=" + x + "&y=" + y);
pieceSelected = ""; pieceSelected = "";
canClick = true;
$.ajax({url : "/cgi-bin/qchess.cgi", data : {r : "force_quit"}, success : function() {}});
$.ajax({url : "/cgi-bin/qchess.cgi", data : {r : "start"}}).done(function(data) {$(this).update(data)});
} }
else { else
console.log("Invalid Move"); {
gameStarted = false;
$("#welcome").show();
$("#status").html("Game over");
$("#start").html("New Game");
$.ajax({url : "/cgi-bin/qchess.cgi", data : {r : "quit"}, success : function() {console.log("Quit game");}});
} }
} });
}
function resetColour(loc) // bind click event to table cells
{ $("#board").on('click', 'td' , function(e)
square = document.getElementById(loc); {
if ((+loc[loc.length-1] + +loc[loc.length-2]) % 2 == 0) if (canClick === false)
square.style.background = "#FFF"; return;
else
square.style.background = "#DDD"; var id = $(this).attr("id");
legal = true;
if (pieceSelected === "")
{
if ($(this).legalSelection())
{
pieceSelected = id;
$(this).setSquareColour("blue");
}
else
{
legal = false;
alert("Illegal selection " + id);
}
}
else
{
mover = $("#board").find("#"+pieceSelected);
if (mover.legalMove($(this)))
{
$("#status").html(colourString(otherColour(mover.getColour())) + " SELECT?");
mover.move($(this));
pieceSelected = "";
$("#board td").each(function() {$(this).setSquareColour("default");});
}
else
{
legal = false;
alert("Illegal move " + id);
}
}
} if (legal)
$.ajax({url : "/cgi-bin/qchess.cgi", data : {x : id[0], y : id[1]}}).done(function(data) {$(this).update(data)});
});
function validMove(start, piece, end) { $.fn.showMoves = function()
return true; {
} $(this).setSquareColour("green");
var that = $(this); //Look [DJA]! I used it!
function doMove(start, end) { $("#board td").each(function()
alert("doMove("+start+","+end+")"); {
s1 = document.getElementById(start); if (that.legalMove($(this)) === true) // See?
s2 = document.getElementById(end); {
s2.innerHTML = s1.innerHTML; //alert("Legal move from " + that.attr("id") + " -> " + $(this).attr("id"));
s1.innerHTML = emptyHTML; $(this).setSquareColour("red");
}
});
}
resetColour(start); // Get colour of occupied square
// W - white
// B - black
// 0 - unoccupied
$.fn.getColour = function()
{
return $(this).html()[4]; // yeah, I know this is horrible, so sue me
}
if ((+end[end.length-1] + +end[end.length-2]) % 2 == 1) // Get type of piece
$.fn.getType = function()
{ {
s2.innerHTML = s2.innerHTML.replace(/<bold>.*<\/bold>/i, "<bold>?</bold>"); return $(this).html().match(/<bold>(.*)<\/bold>/)[1]; // again, I know it's horrible, so sue me
} }
//console.log("Piece Moved");
}
function boardLoad() { // Get coords
ajaxUpdate("r=force_quit"); $.fn.getX = function() {return Number($(this).attr("id")[0]);}
$.fn.getY = function() {return Number($(this).attr("id")[1]);}
// Check a square is a valid selection
for (i = 0; i < 8; i++) { $.fn.legalSelection = function()
for (j = 0; j < 8; j++) { {
e = ""+i + "" + j; return ($(this).getColour() == playerColour);
resetColour(e);
}
} }
//Place pieces on the board
for (i = 0; i < 8; i++) {
black = document.getElementById("1" + i);
white = document.getElementById("6" + i);
//pawns
black.innerHTML = "<!--B--> " + pieceChar["B"]["p"] + " <big> <bold>?</bold> </big> ?";
white.innerHTML = "<!--W--> " + pieceChar["W"]["p"] + " <big> <bold>?</bold> </big> ?";
black = document.getElementById("0" + i);
white = document.getElementById("7" + i);
piece = "p";
if (i == 0 || i == 7)
piece = "r";
if (i == 1 || i == 6)
piece = "h";
if (i == 2 || i == 5)
piece = "b";
if (i == 3)
piece = "k";
if (i == 4)
piece = "q";
//major pieces
black.innerHTML = "<!--B--> " + pieceChar["B"][piece] + "<big> <bold>?</bold> </big> ?";
white.innerHTML = "<!--W--> " + pieceChar["W"][piece] + "<big> <bold>?</bold> </big> ?";
// empty squares // determine whether a piece can move into another square
for (j = 2; j < 6; j++) $.fn.legalMove = function(target)
{
if (target.getColour() == $(this).getColour())
return false;
if (target.getX() == $(this).getX() && target.getY() == $(this).getY())
return false;
switch ($(this).getType())
{ {
square = document.getElementById(""+j + i); case pieceChar["W"]['p']:
square.innerHTML = emptyHTML; if ($(this).getY() == 6 && target.getY() == 4 && $(this).getX() == target.getX() && target.getColour() == '0')
} return true;
} if ($(this).getY() - target.getY() != 1 || Math.abs($(this).getX() - target.getX()) > 1)
return false;
setTimeout(function(){ajaxUpdate("r=start");}, 1000); return ($(this).getX() == target.getX() || target.getColour() != '0');
}
case pieceChar["B"]['p']:
if ($(this).getY() == 1 && target.getY() == 3 && $(this).getX() == target.getX())
return true;
if ($(this).getY() - target.getY() != -1 || Math.abs($(this).getX() - target.getX()) > 1)
return false;
return ($(this).getX() == target.getX() || target.getColour() != '0');
//AJAX Stuff case pieceChar["W"]['h']:
function ajaxUpdate(queryString) { case pieceChar["B"]['h']:
var ajaxRequest; // The variable that makes Ajax possible! return ((Math.abs($(this).getY() - target.getY()) == 2 && Math.abs($(this).getX() - target.getX()) == 1)
|| (Math.abs($(this).getX() - target.getX()) == 2 && Math.abs($(this).getY() - target.getY()) == 1));
try { case pieceChar["W"]['k']:
// Opera 8.0+, Firefox, Safari case pieceChar["B"]['k']:
ajaxRequest = new XMLHttpRequest();