def new_versus(self): # Create a new Human Versus game ID and redirect to it game = Game(versus=True) game_id = game.id Session.add(game) Session.commit() return redirect('/game/cont/%s/' % game_id)
def long_poll(self, id): from datetime import datetime from time import sleep start = datetime.now() if 'my_board' in request.POST: my_board = request.POST['my_board'] my_board = int(my_board, 2) else: return '' game = self.game_q.filter_by(id=id).first() while True: Session.refresh(game) if not game: return '' board_size = game.size x_pos = game.x_pos o_pos = game.o_pos cur_board = x_pos | o_pos data = {} if cur_board > my_board: x_pos_bin = int_to_bin(x_pos, board_size) o_pos_bin = int_to_bin(o_pos, board_size) positions = [] for i in range(board_size): positions.append([]) for j in range(board_size): if x_pos_bin[(i*board_size)+j] == '1': positions[i].append('X') elif o_pos_bin[(i*board_size)+j] == '1': positions[i].append('O') else: positions[i].append('') data['result'] = positions if bit_count(cur_board) == (board_size**2): data['message'] = 'It\'s a tie!' if game_over(x_pos): data['message'] = 'X Wins!' elif game_over(o_pos): data['message'] = 'O Wins!' if len(data) > 0: return data sleep(1) delta = datetime.now() - start if delta.seconds >= 30: return {'again': True} return ''
def cont_game(self, id): # Continue an existing Human Versus game game = self.game_q.filter_by(id=id).first() if not game: return redirect('/') message = '' user_side = '' finished = False board_size = game.size x_pos = game.x_pos o_pos = game.o_pos x_pos_bin = int_to_bin(x_pos, board_size) o_pos_bin = int_to_bin(o_pos, board_size) if 'move' in request.POST: if 'user_side' in session: user_side = session['user_side'] elif user_side == '': # Determine your side by the person whose turn it should be # Note: I have no idea what security issues this raises # should one user maliciously and purposfully clear their # cookies. if bit_count(x_pos) <= bit_count(o_pos): user_side = 'X' else: user_side = 'O' session['user_side'] = user_side session.save() if (not game_over(x_pos)) and (not game_over(o_pos)) and is_legal_move(x_pos, o_pos, request.POST['move'], user_side): if user_side == 'X': x_pos, x_pos_bin = add_move(x_pos, request.POST['move'], board_size) game.x_pos = x_pos Session.commit() else: o_pos, o_pos_bin = add_move(o_pos, request.POST['move'], board_size) game.o_pos = o_pos Session.commit() if game_over(x_pos): finished = True if user_side == 'X': message = 'You win!' elif user_side == 'O': message = 'You lose!' elif game_over(o_pos): finished = True if user_side == 'O': message = 'You win!' elif user_side == 'X': message = 'You lose!' elif bit_count(x_pos | o_pos) == (board_size**2): finished = True message = 'It\'s a tie!' positions = [] for i in range(board_size): positions.append([]) for j in range(board_size): if x_pos_bin[(i*board_size)+j] == '1': positions[i].append('X') elif o_pos_bin[(i*board_size)+j] == '1': positions[i].append('O') else: positions[i].append('') c.board_size = board_size c.positions = positions c.user_side = user_side c.finished = finished c.message = message c.this_url = request.environ.get('PATH_INFO') # c.this_url = url.current(qualified=False) if request.is_xhr: return self.json(positions) return render('/game/continue.mako')
def __before__(self): self.game_q = Session.query(Game)