Changeset 9535 for branches/session_centric/src/tictactoe.py
- Timestamp:
- 04/26/08 04:06:08 (7 months ago)
- Files:
-
- 1 modified
-
branches/session_centric/src/tictactoe.py (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/session_centric/src/tictactoe.py
r9465 r9535 16 16 17 17 class TicTacToeSession(stanza_session.StanzaSession): 18 # initiate a session 18 19 def begin(self, rows = 3, cols = 3, role_s = 'x'): 19 20 self.rows = rows … … 21 22 22 23 self.role_s = role_s 24 25 self.strike = 3 23 26 24 27 if self.role_s == 'x': … … 69 72 self.cols = 3 70 73 74 # number in a row needed to win 71 75 if form.getField('strike'): 72 76 self.strike = int(form.getField('strike').getValues()[0]) … … 104 108 105 109 self.our_turn() 106 107 def is_my_turn(self):108 # XXX not great semantics109 return self.received == self.ignore110 110 111 111 # just sent an invitation, expecting a reply … … 120 120 121 121 elif msg.getTag('decline', namespace=games_ns): 122 self.XXX() 122 # XXX notify the user 123 124 # XXX end session 125 pass 123 126 124 127 # silently ignores any received messages … … 126 129 pass 127 130 131 def game_over(self, msg): 132 invite = msg.getTag('invite', namespace=games_ns) 133 134 # ignore messages unless they're renewing the game 135 if invite and invite.getAttr('type') == 'renew': 136 self.invited(msg) 137 128 138 def wait_for_move(self, msg): 129 139 turn = msg.getTag('turn', namespace=games_ns) … … 136 146 if id != self.next_move_id: 137 147 print 'unexpected move id, lost a move somewhere?' 138 r aise148 return 139 149 140 150 try: 141 151 self.board.mark(row, col, self.role_o) 142 152 except InvalidMove, e: 143 print 'received invalid move' 153 # received an invalid move, end the game. 154 155 # XXX notify the user 156 self.terminate('cheating') 144 157 return 145 158 … … 154 167 self.our_turn() 155 168 169 def is_my_turn(self): 170 # XXX not great semantics 171 return self.received == self.ignore 172 156 173 def our_turn(self): 157 174 # ignore messages until we've made our move 158 175 self.received = self.ignore 159 self.board. win.set_title(self.board.title + ':your turn')176 self.board.set_title('your turn') 160 177 161 178 def their_turn(self): 162 179 self.received = self.wait_for_move 163 self.board. win.set_title(self.board.title + ':their turn')180 self.board.set_title('their turn') 164 181 165 182 # called when the board receives input … … 174 191 175 192 # check win conditions 176 if self.board.check_for_strike(self.role_s, row, col, self.strike):193 if self.board.check_for_strike(self.role_s, row, col, self.strike): 177 194 self.won() 178 195 elif self.board.full(): … … 183 200 self.their_turn() 184 201 202 # sends a move message 185 203 def send_move(self, row, column): 186 204 msg = xmpp.Message() … … 199 217 self.send(msg) 200 218 219 # sends a termination message and ends the game 220 def terminate(self, reason): 221 msg = xmpp.Message() 222 223 terminate = msg.NT.terminate 224 terminate.setNamespace(games_ns) 225 terminate.setAttr('reason', reason) 226 227 self.send(msg) 228 229 self.received = self.game_over 230 231 def won(self): 232 self.terminate('won') 233 self.board.won() 234 235 def lost(self): 236 self.terminate('lost') 237 self.board.lost() 238 239 def drawn(self): 240 self.terminate('draw') 241 self.board.drawn() 242 201 243 class TicTacToeBoard: 244 def __init__(self, session, rows, cols): 245 self.session = session 246 247 self.state = 'None' 248 249 self.rows = rows 250 self.cols = cols 251 252 self.board = [ [None] * self.cols for r in xrange(self.rows) ] 253 254 self.setup_window() 255 202 256 def check_for_strike(self, p, r, c, strike): 203 # up and down, left and right257 # number in a row: up and down, left and right 204 258 tallyI = 0 205 259 tally_ = 0 206 260 207 # right triangles: L\ , F/ 261 # number in a row: diagonal 262 # (imagine L or F as two sides of a right triangle: L\ or F/) 208 263 tallyL = 0 209 264 tallyF = 0 … … 242 297 return False 243 298 244 def __init__(self, session, rows, cols):245 self.session = session246 247 self.rows = rows248 self.cols = cols249 250 self.board = [ [None] * self.cols for r in xrange(self.rows) ]251 252 self.setup_window()253 254 299 # is the board full? 255 300 def full(self): … … 264 309 self.win = gtk.Window() 265 310 266 self.title = 'tic-tac-toe with %s' % self.session.jid267 268 self.win.set_title(self.title) 311 self.title_prefix = 'tic-tac-toe with %s' % self.session.jid 312 self.set_title() 313 269 314 self.win.set_app_paintable(True) 270 315 … … 314 359 self.draw_o(cr, i, j, row_height, col_width) 315 360 361 # XXX draw 'won', 'lost', 'draw' 362 316 363 def draw_x(self, cr, row, col, row_height, col_width): 317 364 cr.set_source_rgb(0, 0, 0) … … 352 399 353 400 self.win.queue_draw() 401 402 def set_title(self, suffix = None): 403 str = self.title_prefix 404 405 if suffix: 406 str += ': ' + suffix 407 408 self.win.set_title(str) 409 410 def won(self): 411 self.state = 'won' 412 self.set_title('you won!') 413 self.win.queue_draw() 414 415 def lost(self): 416 self.state = 'lost' 417 self.set_title('you lost.') 418 self.win.queue_draw() 419 420 def drawn(self): 421 self.state = 'drawn' 422 self.win.set_title(self.title_prefix + ': a draw.') 423 self.win.queue_draw()
