def __init__(self): print "initialize tetris" self.gui = [PygameGoodRenderer(), LedRenderer()] self.input = DdrInput() while True: self.init_game()
class TetrisGame(object): #one-time initialization for gui etc def __init__(self): print "initialize tetris" self.gui = [PygameGoodRenderer(), LedRenderer()] self.input = DdrInput() while True: self.init_game() #initializes each game def init_game(self): print "init next game" self.boards = [Board(MAXX,MAXY), Board(MAXX,MAXY)] self.players = [None,None] self.gameState = GameState() self.board_animation(0,"up_arrow") self.board_animation(1,"up_arrow") self.start_time = None self.input.reset() self.update_gui() self.handle_input() #this calls all other functions, such as add_player, start_game def add_player(self,num): # 0=left, 1=right print "adding player",num if self.players[num]==None: self.boards[num].clear() p = Player(num, self.gameState, self.boards[num], self.boards[(num+1)%2]) self.players[num] = p self.board_animation(num,"down_arrow") self.gameState.num_players+=1 self.update_gui() def start_game(self): print "start game" self.boards[0].clear() self.boards[1].clear() self.gameState.state = "playing" self.update_gui() self.start_time = time() self.drop_time = time() self.gravity() def handle_input(self): game_on = True t = 0 while game_on: t+=1 if (self.gameState.state=="ending") or (self.gameState.state=="playing" and time()-self.start_time > TIME_LIMIT): self.end_game() game_on = False return if self.gameState.state=="playing" and time()-self.drop_time > self.gameState.delay/1000.0: self.gravity() self.drop_time = time() if self.gameState.state != "ending": self.update_gui() ev = self.input.poll() if ev: player,direction = ev #print "Player",player,direction if direction == DIE: #Exit instruction game_on = False pygame.quit() sys.exit() if self.gameState.state=="playing": if self.players[player]!=None: #DROP is only for debugging purposes for now, to make the game end. if direction == DROP: while self.players[player].handle_move( DOWN ): pass else: self.players[player].handle_move(direction) elif self.gameState.state == "waiting": if direction==UP: self.add_player(player) elif direction==DOWN: if self.players[player]!=None: self.start_game() self.update_gui() elif t%10000==0: t=0 self.update_gui() def gravity(self): for p in self.players: if p: p.handle_move(DOWN) def update_gui(self): [gui.render_game(self.to_dict()) for gui in self.gui] #self.gui[0].render_game(self.to_gui_dict()) def end_game(self): if self.gameState.winner!=None: winner_id = self.gameState.winner print "GAME OVER: layer",winner_id,"wins" else: if self.gameState.num_players == 2: if self.players[0].score > self.players[1].score: winner_id = 0 elif self.players[1].score > self.players[0].score: winner_id = 1 else: winner_id = 2 #tie, show both as winners. elif self.players[0]!=None: winner_id = 0 else: winner_id = 1 self.animate_ending(winner_id) def board_animation(self, board_id, design, color="green"): b = self.boards[board_id] d = self.create_shapes(design) for coord in d: b.landed[coord]=color def animate_ending(self,winner_board): if winner_board == 2: self.board_animation(0,"outline") self.board_animation(1,"outline") else: self.board_animation(winner_board,"outline","yellow") self.update_gui() sleep(3) def create_shapes(self,design): #in progress..... shapes = {} y = 4 up_diags = [(1,y+4),(1,y+3),(2,y+3),(2,y+2),(3,y+2),(3,y+1), (8,y+4),(8,y+3),(7,y+3),(7,y+2),(6,y+2),(6,y+1)] down_diags = [(x0,10-y0+2*y) for (x0,y0) in up_diags] line = [(i,j) for i in [4,5] for j in range(y,y+11)] up_arrow = line[:] for xy in up_diags: up_arrow.append(xy) down_arrow = line[:] for xy in down_diags: down_arrow.append(xy) sides = [(i,j) for i in [0,9] for j in range(18)] tb = [(i,j) for i in range(10) for j in [0,17]] outline = tb + sides shapes["down_arrow"] = down_arrow shapes["up_arrow"] = up_arrow shapes["outline"] = outline shapes["test"] = [(5,5)] return shapes[design] def to_dict(self): d = {} for n in range(2): board = self.boards[n] offset = n*MAXX #blocks for (x,y) in board.landed: d[(x+offset,y)] = board.landed[(x,y)] if self.players[n]!=None: p = self.players[n] #shapes if p.shape: blocks = p.shape.blocks for b in blocks: if b.y >= 0: d[(b.x+offset*n,b.y)] = b.color #score score = p.score for i in range(10): bit = score%2 score = score>>1 coord = (MAXX-1-i + offset, MAXY+1) if bit: d[coord] = "yellow" #level level = self.gameState.level d[(level+offset,MAXY)] = LEVEL_COLORS[level] #time if self.start_time!=None: time_left = (self.start_time + TIME_LIMIT - time()) #seconds left for i in range(TIME_LIMIT/60): #0,1,2,3 (minutes) if time_left/60 >= i: seconds = time_left - 60*i # is in .5-1 secs, etc if not (.5<seconds<1.0 or 1.5<seconds<2.0 or 2.5<seconds<3.0): coord = (MAXX-1-i + offset, MAXY) d[coord] = "white" return d def to_gui_dict(self): d = {} if self.start_time!=None: d[(2,"level")] = self.gameState.level d[(2,"time_left")] = self.start_time + TIME_LIMIT - time() for n in range(2): board = self.boards[n] offset = n*MAXX #blocks for (x,y) in board.landed: d[(x+offset,y)] = board.landed[(x,y)] if self.players[n]!=None: p = self.players[n] #score d[(n,"score")] = p.score #shapes if p.shape: blocks = p.shape.blocks for b in blocks: if b.y >= 0: d[(b.x+offset*n,b.y)] = b.color return d
class TetrisGame(object): #one-time initialization for gui etc def __init__(self): print "initialize tetris" self.gui = [PygameGoodRenderer(), LedRenderer()] self.input = DdrInput() while True: self.init_game() #initializes each game def init_game(self): print "init next game" self.boards = [Board(MAXX, MAXY), Board(MAXX, MAXY)] self.players = [None, None] self.gameState = GameState() self.board_animation(0, "up_arrow") self.board_animation(1, "up_arrow") self.start_time = None self.input.reset() self.update_gui() self.handle_input( ) #this calls all other functions, such as add_player, start_game def add_player(self, num): # 0=left, 1=right print "adding player", num if self.players[num] == None: self.boards[num].clear() p = Player(num, self.gameState, self.boards[num], self.boards[(num + 1) % 2]) self.players[num] = p self.board_animation(num, "down_arrow") self.gameState.num_players += 1 self.update_gui() def start_game(self): print "start game" self.boards[0].clear() self.boards[1].clear() self.gameState.state = "playing" self.update_gui() self.start_time = time() self.drop_time = time() self.gravity() def handle_input(self): game_on = True t = 0 while game_on: t += 1 if (self.gameState.state == "ending") or (self.gameState.state == "playing" and time() - self.start_time > TIME_LIMIT): self.end_game() game_on = False return if self.gameState.state == "playing" and time( ) - self.drop_time > self.gameState.delay / 1000.0: self.gravity() self.drop_time = time() if self.gameState.state != "ending": self.update_gui() ev = self.input.poll() if ev: player, direction = ev #print "Player",player,direction if direction == DIE: #Exit instruction game_on = False pygame.quit() sys.exit() if self.gameState.state == "playing": if self.players[player] != None: #DROP is only for debugging purposes for now, to make the game end. if direction == DROP: while self.players[player].handle_move(DOWN): pass else: self.players[player].handle_move(direction) elif self.gameState.state == "waiting": if direction == UP: self.add_player(player) elif direction == DOWN: if self.players[player] != None: self.start_game() self.update_gui() elif t % 10000 == 0: t = 0 self.update_gui() def gravity(self): for p in self.players: if p: p.handle_move(DOWN) def update_gui(self): d = self.to_dict() [gui.render_game(d) for gui in self.gui] #self.gui[0].render_game(self.to_gui_dict()) def end_game(self): if self.gameState.winner != None: winner_id = self.gameState.winner print "GAME OVER: layer", winner_id, "wins" else: if self.gameState.num_players == 2: if self.players[0].score > self.players[1].score: winner_id = 0 elif self.players[1].score > self.players[0].score: winner_id = 1 else: winner_id = 2 #tie, show both as winners. elif self.players[0] != None: winner_id = 0 else: winner_id = 1 self.animate_ending(winner_id) def board_animation(self, board_id, design, color="green"): b = self.boards[board_id] d = self.create_shapes(design) for coord in d: b.landed[coord] = color def animate_ending(self, winner_board): if winner_board == 2: self.board_animation(0, "outline") self.board_animation(1, "outline") else: self.board_animation(winner_board, "outline", "yellow") self.update_gui() sleep(3) def create_shapes(self, design): #in progress..... shapes = {} y = 4 up_diags = [(1, y + 4), (1, y + 3), (2, y + 3), (2, y + 2), (3, y + 2), (3, y + 1), (8, y + 4), (8, y + 3), (7, y + 3), (7, y + 2), (6, y + 2), (6, y + 1)] down_diags = [(x0, 10 - y0 + 2 * y) for (x0, y0) in up_diags] line = [(i, j) for i in [4, 5] for j in range(y, y + 11)] up_arrow = line[:] for xy in up_diags: up_arrow.append(xy) down_arrow = line[:] for xy in down_diags: down_arrow.append(xy) sides = [(i, j) for i in [0, 9] for j in range(18)] tb = [(i, j) for i in range(10) for j in [0, 17]] outline = tb + sides shapes["down_arrow"] = down_arrow shapes["up_arrow"] = up_arrow shapes["outline"] = outline shapes["test"] = [(5, 5)] return shapes[design] def to_dict(self): d = {} for n in range(2): board = self.boards[n] offset = n * MAXX #blocks for (x, y) in board.landed: d[(x + offset, y)] = board.landed[(x, y)] if self.players[n] != None: p = self.players[n] #shapes if p.shape: blocks = p.shape.blocks for b in blocks: if b.y >= 0: d[(b.x + offset * n, b.y)] = b.color #score score = p.score for i in range(10): bit = score % 2 score = score >> 1 coord = (MAXX - 1 - i + offset, MAXY + 1) if bit: d[coord] = "yellow" #level level = self.gameState.level d[(level + offset, MAXY)] = LEVEL_COLORS[level] #time if self.start_time != None: time_left = (self.start_time + TIME_LIMIT - time() ) #seconds left for i in range(TIME_LIMIT / 60): #0,1,2,3 (minutes) if time_left / 60 >= i: seconds = time_left - 60 * i # is in .5-1 secs, etc if not (.5 < seconds < 1.0 or 1.5 < seconds < 2.0 or 2.5 < seconds < 3.0): coord = (MAXX - 1 - i + offset, MAXY) d[coord] = "white" return d def to_gui_dict(self): d = {} if self.start_time != None: d[(2, "level")] = self.gameState.level d[(2, "time_left")] = self.start_time + TIME_LIMIT - time() for n in range(2): board = self.boards[n] offset = n * MAXX #blocks for (x, y) in board.landed: d[(x + offset, y)] = board.landed[(x, y)] if self.players[n] != None: p = self.players[n] #score d[(n, "score")] = p.score #shapes if p.shape: blocks = p.shape.blocks for b in blocks: if b.y >= 0: d[(b.x + offset * n, b.y)] = b.color return d
# ddrdemo.py # Copyright (C) 2011 Russell Cohen <*****@*****.**> # # This file is part of Burton-Conner Tetris Battle. # # Burton-Conner Tetris Battle is free software: you can redistribute it # and/or modify it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # Burton-Conner Tetris Battle is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Burton-Conner Tetris Battle. If not, see # <http://www.gnu.org/licenses/>. from ddrinput import DdrInput from ddrinput import DIRECTIONS from ddrinput import LEFT,RIGHT,UP,DOWN d = DdrInput() while 1: ev = d.poll() if ev: player,direction = ev print 'Player', int(player), DIRECTIONS[direction]
# ddrdemo.py # Copyright (C) 2011 Russell Cohen <*****@*****.**> # # This file is part of Burton-Conner Tetris Battle. # # Burton-Conner Tetris Battle is free software: you can redistribute it # and/or modify it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # Burton-Conner Tetris Battle is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Burton-Conner Tetris Battle. If not, see # <http://www.gnu.org/licenses/>. from ddrinput import DdrInput from ddrinput import DIRECTIONS from ddrinput import LEFT, RIGHT, UP, DOWN d = DdrInput() while 1: ev = d.poll() if ev: player, direction = ev print 'Player', int(player), DIRECTIONS[direction]