Added python tictactoe client
This commit is contained in:
parent
9efd739cbb
commit
f81fec6b9c
6 changed files with 706 additions and 1 deletions
|
@ -1 +1 @@
|
|||
Subproject commit 00312859714bef6e9a4fdb9931a41fef56eeb89a
|
||||
Subproject commit a94993dc5a626605bdf45c45f398270fe33eaaf1
|
135
games/tic-tac-toe-python/ggskpanel.glade
Normal file
135
games/tic-tac-toe-python/ggskpanel.glade
Normal file
|
@ -0,0 +1,135 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glade-interface>
|
||||
<!-- interface-requires gtk+ 2.16 -->
|
||||
<!-- interface-naming-policy project-wide -->
|
||||
<widget class="GtkWindow" id="window1">
|
||||
<property name="width_request">561</property>
|
||||
<property name="height_request">521</property>
|
||||
<child>
|
||||
<widget class="GtkVBox" id="vbox1">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<widget class="GtkHBox" id="hbox1">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label1">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes"><span size="x-large">GGS Killtrolpanel</span></property>
|
||||
<property name="use_markup">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImage" id="image1">
|
||||
<property name="visible">True</property>
|
||||
<property name="pixbuf">kill_process_icon.jpg</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkTable" id="table1">
|
||||
<property name="visible">True</property>
|
||||
<property name="n_rows">3</property>
|
||||
<property name="n_columns">2</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<child>
|
||||
<widget class="GtkButton" id="playersButton">
|
||||
<property name="label" translatable="yes">All players</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_playersButton_clicked"/>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="coordinatorButton">
|
||||
<property name="label" translatable="yes">Coordinator</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_coordinatorButton_clicked"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="dispatcherButton">
|
||||
<property name="label" translatable="yes">Dispatcher</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_dispatcherButton_clicked"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="coordinatorBackupButton">
|
||||
<property name="label" translatable="yes">Coordinator backup</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_coordinatorBackupButton_clicked"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="tablesButton">
|
||||
<property name="label" translatable="yes">All tables</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_tablesButton_clicked"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="gamevmButton">
|
||||
<property name="label" translatable="yes">All GameVMs</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="clicked" handler="on_gamevmButton_clicked"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</glade-interface>
|
44
games/tic-tac-toe-python/kpanel.py
Normal file
44
games/tic-tac-toe-python/kpanel.py
Normal file
|
@ -0,0 +1,44 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import sys, socket, thread, gobject, getpass, time, os
|
||||
try:
|
||||
import pygtk
|
||||
pygtk.require("2.16")
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
import gtk
|
||||
import gtk.glade
|
||||
except:
|
||||
sys.exit(1)
|
||||
|
||||
class GGSKPanel:
|
||||
|
||||
def __init__(self):
|
||||
#Set the Glade file
|
||||
self.gladefile = "ttt.glade"
|
||||
self.wTree = gtk.glade.XML(self.gladefile, "window1")
|
||||
|
||||
#Create our dictionay and connect it
|
||||
dic = { "on_window1_destroy_event" : gtk.main_quit
|
||||
,"on_coordinatorButton_clicked" : lambda x: self.terminateProcess("ggs_coordinator")
|
||||
,"on_coordinatorBackupButton_clicked" :\
|
||||
lambda x: self.terminateProcess("ggs_coordinator_backup")
|
||||
,"on_dispatcherButton_clicked" : lambda x: self.terminateProcess("ggs_dispatcher")
|
||||
}
|
||||
|
||||
self.wTree.signal_autoconnect(dic)
|
||||
|
||||
self.wTree.get_widget("window1").show()
|
||||
|
||||
def terminateProcess(self, process):
|
||||
os.system("echo \"exit(whereis(%s), 'Bye bye').\" | erl_call -sname ggs -e" % process)
|
||||
|
||||
def setStatus(self, msg):
|
||||
self.wTree.get_widget("statusbar").push(0, msg)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
chat = GGSKPanel()
|
||||
gobject.threads_init()
|
||||
gtk.main()
|
156
games/tic-tac-toe-python/server.js
Normal file
156
games/tic-tac-toe-python/server.js
Normal file
|
@ -0,0 +1,156 @@
|
|||
function playerCommand(player_id, command, args) {
|
||||
if (commaned == "hi") {
|
||||
hi(player_id);
|
||||
} else if (command == "set") {
|
||||
move(player_id, args);
|
||||
} else if (command == "new") {
|
||||
newGame();
|
||||
}
|
||||
}
|
||||
|
||||
var ROWS = 3;
|
||||
|
||||
function hi(player_id) {
|
||||
var p1_id = GGS.localStorage.getItem("p1_id");
|
||||
var p2_id = GGS.localStorage.getItem("p2_id");
|
||||
if (p1_id == "") {
|
||||
GGS.localStorage.setItem("p1_id", player_id);
|
||||
GGS.sendCommand(player_id, "welcome", "1");
|
||||
} else if (p2_id == "") {
|
||||
GGS.localStorage.setItem("p2_id", player_id);
|
||||
GGS.sendCommand(player_id, "welcome", "2");
|
||||
} else {
|
||||
GGS.sendCommand(player_id, "not_welcome", "Already have 2 players on this table");
|
||||
}
|
||||
}
|
||||
|
||||
function move(player_id, args) {
|
||||
var nextPlayer = GGS.localStorage.getItem("next_player");
|
||||
var p1_id = GGS.localStorage.getItem("p1_id");
|
||||
var p2_id = GGS.localStorage.getItem("p2_id");
|
||||
var valid = false;
|
||||
|
||||
if(nextPlayer == 1 && player_id == p1_id) {
|
||||
valid = true;
|
||||
} else if (nextPlayer == 2 && player_id == p2_id) {
|
||||
valid = true;
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
|
||||
var p = nextPlayer;
|
||||
var props = JSON.parse(args);
|
||||
var gameBoard = JSON.parse(GGS.localStorage.getItem("game_board"));
|
||||
|
||||
if (gameBoard[props.x][props.y] == 0) {
|
||||
|
||||
gameBoard[props.x][props.y] = p;
|
||||
GGS.localStorage.setItem("game_board", JSON.stringify(gameBoard));
|
||||
GGS.sendCommandToAll("game_board", boardAsString(gameBoard));
|
||||
|
||||
if (this.checkIfWon(p, gameBoard)) {
|
||||
if (p == 1) {
|
||||
GGS.sendCommand(p1_id, "winner", "You win!");
|
||||
GGS.sendCommand(p2_id, "loser", "You lose!");
|
||||
} else {
|
||||
GGS.sendCommand(p1_id, "loser", "You lose!");
|
||||
GGS.sendCommand(p2_id, "winner", "You win!");
|
||||
}
|
||||
}
|
||||
|
||||
if (nextPlayer == 1) {
|
||||
GGS.localStorage.setItem("next_player", 2);
|
||||
GGS.sendCommand(p1_id, "yourturn", "");
|
||||
} else {
|
||||
GGS.localStorage.setItem("next_player", 1);
|
||||
GGS.sendCommand(p2_id, "yourturn", "");
|
||||
}
|
||||
|
||||
} else {
|
||||
GGS.sendCommand(plaer_id, "warning", "Already set, chose something else.");
|
||||
}
|
||||
|
||||
} else {
|
||||
GGS.sendCommand(player_id, "warning", "Not your turn!");
|
||||
}
|
||||
}
|
||||
|
||||
function checkIfWon(player) {
|
||||
|
||||
var gameBoard = JSON.parse(GGS.localStorage.getItem("game_board"));
|
||||
|
||||
for (i = 0; i < ROWS; ++i) {
|
||||
for (j = 0; j < ROWS; ++j) {
|
||||
if (gameBoard[i][j] != 'X') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j == ROWS) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (j = 0; j < ROWS; ++j) {
|
||||
if (gameBoard[j][i] != 'X') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j == ROWS) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Now check diagnols
|
||||
for (i = 0; i < ROWS; ++i) {
|
||||
if (gameBoard[i][i] != 'X') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == ROWS) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (i = 0; i < ROWS; ++i) {
|
||||
if (gameBoard[i][ROWS - i - 1] != 'X') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == ROWS) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function newGame() {
|
||||
// Initiate game with empty rows and columns
|
||||
var gameBoard = [];
|
||||
for (var i=0; i < ROWS; i++) {
|
||||
gameBoard[i] = [];
|
||||
for (var j=0; i < ROWS; i++) {
|
||||
gameBoard[i][j] = '';
|
||||
}
|
||||
}
|
||||
|
||||
GGS.localStorage.setItem("game_board", JSON.stringify(gameBoard));
|
||||
GGS.sendCommandToAll("new_game", "");
|
||||
GGS.sendCommandToAll("game_board", boardAsString(gameBoard));
|
||||
}
|
||||
|
||||
function boardAsString(gameBoard) {
|
||||
var out = "";
|
||||
for (var i=0; i < ROWS; i++) {
|
||||
for (var j=0; j < ROWS; j++) {
|
||||
var p = gameBoard[i][j];
|
||||
if (p == 1) {
|
||||
out += "X";
|
||||
} else if (p == 2) {
|
||||
out +="O";
|
||||
} else {
|
||||
out += " ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
248
games/tic-tac-toe-python/ttt.glade
Normal file
248
games/tic-tac-toe-python/ttt.glade
Normal file
|
@ -0,0 +1,248 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<glade-interface>
|
||||
<!-- interface-requires gtk+ 2.16 -->
|
||||
<!-- interface-naming-policy project-wide -->
|
||||
<widget class="GtkWindow" id="window1">
|
||||
<property name="width_request">561</property>
|
||||
<property name="height_request">521</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<widget class="GtkVBox" id="vbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<widget class="GtkHBox" id="hbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<widget class="GtkLabel" id="label1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="ypad">7</property>
|
||||
<property name="label" translatable="yes"><span size="x-large">GGS-Pong</span></property>
|
||||
<property name="use_markup">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkTable" id="table1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="n_rows">3</property>
|
||||
<property name="n_columns">3</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<child>
|
||||
<widget class="GtkButton" id="x0y0">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="on_x0y0_clicked" swapped="no"/>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="x1y0">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="on_x1y0_clicked" swapped="no"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="x0y1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="on_x0y1_clicked" swapped="no"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="x1y1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="on_x1y1_clicked" swapped="no"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="x0y2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="on_x0y2_clicked" swapped="no"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="x1y2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="on_x1y2_clicked" swapped="no"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="x2y0">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="on_x2y0_clicked" swapped="no"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="x2y1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="on_x2y1_clicked" swapped="no"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">3</property>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="x2y2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="on_x2y2_clicked" swapped="no"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
<property name="right_attach">3</property>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkHBox" id="hbox2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<widget class="GtkEntry" id="adress">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="invisible_char">•</property>
|
||||
<property name="text" translatable="yes">ggs.jeena.net:9000</property>
|
||||
<property name="invisible_char_set">True</property>
|
||||
<property name="primary_icon_activatable">False</property>
|
||||
<property name="secondary_icon_activatable">False</property>
|
||||
<property name="primary_icon_sensitive">True</property>
|
||||
<property name="secondary_icon_sensitive">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkEntry" id="token">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="invisible_char">•</property>
|
||||
<property name="primary_icon_activatable">False</property>
|
||||
<property name="secondary_icon_activatable">False</property>
|
||||
<property name="primary_icon_sensitive">True</property>
|
||||
<property name="secondary_icon_sensitive">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="connectBtn">
|
||||
<property name="label" translatable="yes">☎</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="on_connectBtn_clicked" swapped="no"/>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkStatusbar" id="statusbar">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">2</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</glade-interface>
|
122
games/tic-tac-toe-python/ttt.py
Normal file
122
games/tic-tac-toe-python/ttt.py
Normal file
|
@ -0,0 +1,122 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import sys, socket, thread, gobject, getpass, time, os
|
||||
try:
|
||||
import pygtk
|
||||
pygtk.require("2.16")
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
import gtk
|
||||
import gtk.glade
|
||||
except:
|
||||
sys.exit(1)
|
||||
|
||||
class GGSTTT:
|
||||
|
||||
def __init__(self):
|
||||
#Set the Glade file
|
||||
self.gladefile = "ttt.glade"
|
||||
self.wTree = gtk.glade.XML(self.gladefile, "window1")
|
||||
host = "localhost"
|
||||
port = 9000
|
||||
|
||||
#Create our dictionay and connect it
|
||||
dic = { "on_window1_destroy_event" : gtk.main_quit
|
||||
,"on_x0y0_clicked" : lambda x: self.sendMove("{'x':0,'y':0}")
|
||||
,"on_x0y1_clicked" : lambda x: self.sendMove("{'x':0,'y':1}")
|
||||
,"on_x0y2_clicked" : lambda x: self.sendMove("{'x':0,'y':2}")
|
||||
,"on_x1y0_clicked" : lambda x: self.sendMove("{'x':1,'y':0}")
|
||||
,"on_x1y1_clicked" : lambda x: self.sendMove("{'x':1,'y':1}")
|
||||
,"on_x1y2_clicked" : lambda x: self.sendMove("{'x':1,'y':2}")
|
||||
,"on_x2y0_clicked" : lambda x: self.sendMove("{'x':2,'y':0}")
|
||||
,"on_x2y1_clicked" : lambda x: self.sendMove("{'x':2,'y':1}")
|
||||
,"on_x2y2_clicked" : lambda x: self.sendMove("{'x':2,'y':2}")
|
||||
,"on_connectBtn_clicked" : lambda x: self.doConnect()
|
||||
}
|
||||
|
||||
self.wTree.signal_autoconnect(dic)
|
||||
|
||||
self.wTree.get_widget("window1").show()
|
||||
|
||||
def doConnect(self):
|
||||
self.setStatus("Not connected")
|
||||
hostport = self.wTree.get_widget("adress").get_text()
|
||||
host, port = hostport.split(":")
|
||||
|
||||
self.connect(host, int(port))
|
||||
thread.start_new_thread(self.listen, ())
|
||||
|
||||
token = self.wTree.get_widget("token").get_text()
|
||||
self.s.send("Server-Command: hello\n" +
|
||||
"Content-Type: text\n" +
|
||||
"Content-Length: %s\n" % len(token)+
|
||||
"\n"+
|
||||
token)
|
||||
self.s.send("Game-Command: hi\n" +
|
||||
"Content-Type: text\n" +
|
||||
"Content-Length: 0\n"+
|
||||
"\n")
|
||||
|
||||
def sendMove(self, move):
|
||||
print "Sending move", move
|
||||
cmd = "set"
|
||||
self.s.send("Game-Command: %s\n" % cmd +
|
||||
"Content-Type: text\n" +
|
||||
"Content-Length: %s\n" % len(move)+
|
||||
"\n"+
|
||||
move)
|
||||
|
||||
def setStatus(self, msg):
|
||||
self.wTree.get_widget("statusbar").push(0, msg)
|
||||
|
||||
def listen(self):
|
||||
msg = {}
|
||||
print "listening"
|
||||
fs = self.s.makefile()
|
||||
while True:
|
||||
line = fs.readline()
|
||||
print "Received: '%s" % line.strip()
|
||||
if line != "\n":
|
||||
key = line.split(":")[0]
|
||||
value = line.split(":")[1]
|
||||
msg[key] = value.strip()
|
||||
else:
|
||||
msg["DATA"] = fs.read(int("%s" % msg["Content-Size"]))
|
||||
print "Got data:", msg
|
||||
self.protocolHandler(msg)
|
||||
|
||||
def protocolHandler(self, msg):
|
||||
if msg["Client-Command"] == "hello":
|
||||
data = msg["DATA"]
|
||||
self.token, defined, table_token = data.split(",")
|
||||
if defined == "false":
|
||||
print "Defining game"
|
||||
js = open("server.js").read()
|
||||
self.s.send("Server-Command: define\n"+
|
||||
"Content-Type: text\n" +
|
||||
("Content-Length: %s\n" % len(js))+
|
||||
"\n%s" % js)
|
||||
|
||||
elif msg["Client-Command"] == "welcome":
|
||||
self.setStatus("You are player %s" % msg["data"])
|
||||
elif msg["Client-Command"] == "chat":
|
||||
gobject.idle_add(self.updateChatText, msg["DATA"])
|
||||
elif msg["Client-Command"] == "lusers":
|
||||
print msg
|
||||
gobject.idle_add(self.updateUsers, msg["DATA"])
|
||||
|
||||
def connect(self, host,port):
|
||||
print "Connecting"
|
||||
self.setStatus("Connecting")
|
||||
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.s.connect((host, port))
|
||||
self.setStatus("Connected!")
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
ttt = GGSTTT()
|
||||
gobject.threads_init()
|
||||
gtk.main()
|
Reference in a new issue