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] 
예제 #5
0
# 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]