Beispiel #1
0
 def __init__(self):
     self.screen = pygame.display.set_mode((800, 600),1)
     pygame.display.set_caption("Memory v1.0")
             
     self.loader = Loader()
                     
     self.game_board = GameBoard()        
     self.side_panel = SidePanel()
     self.robot_mouse = RobotMouse() 
     self.ai_player = AIPlayer(3)
     
     self.side_panel.ai_level = self.ai_player.level
     self.side_panel.update_stats()
     self.pair_snd = self.loader.load_sound("pair.wav")
     self.win_snd = self.loader.load_sound("win.wav")
     self.win_snd.set_volume(0.5)
     self.boom_snd = self.loader.load_sound("boom.wav")
     self.boom_snd.set_volume(0.3)
     
     self.stardust = StarDustAnim()
     self.starburst = StarBurstAnim()
Beispiel #2
0
class Memory(object):
    def __init__(self):
        self.screen = pygame.display.set_mode((800, 600),1)
        pygame.display.set_caption("Memory v1.0")
                
        self.loader = Loader()
                        
        self.game_board = GameBoard()        
        self.side_panel = SidePanel()
        self.robot_mouse = RobotMouse() 
        self.ai_player = AIPlayer(3)
        
        self.side_panel.ai_level = self.ai_player.level
        self.side_panel.update_stats()
        self.pair_snd = self.loader.load_sound("pair.wav")
        self.win_snd = self.loader.load_sound("win.wav")
        self.win_snd.set_volume(0.5)
        self.boom_snd = self.loader.load_sound("boom.wav")
        self.boom_snd.set_volume(0.3)
        
        self.stardust = StarDustAnim()
        self.starburst = StarBurstAnim()
              
    def setup_new_game(self):
        self.board = Board()
        self.ai_player.set_board(self.board)
        self.game_board.set_board(self.board.get_cards())

        self.side_panel.player_score = 0
        self.side_panel.robot_score = 0
        self.side_panel.update_score()

    def select_card(self,card):
        self.board.select_card(card)
        self.game_board.touch_card(card)

    def main_loop(self):            
        clock = pygame.time.Clock()

        SETUP_NEW_GAME = 0
        PLAYER1_SELECT_FIRST = 10
        PLAYER1_SELECT_SECOND = 11
        PLAYER1_DONE = 12
        PLAYER2_SELECT_FIRST = 50
        PLAYER2_SELECT_SECOND = 51
        PLAYER2_DONE = 52
        ROBOT_SELECT_FIRST = 20
        ROBOT_SELECT_FIRST_WAIT = 21
        ROBOT_SELECT_SECOND = 30
        ROBOT_SELECT_SECOND_WAIT = 31
        ROBOT_DONE = 40
        GAME_OVER = 98
        GAME_OVER_WAIT = 99
        START_SCREEN = 100
    
        DELAY = 40
        state_delay = 0
        
        state = START_SCREEN
        
        next_player = 0
        
        starburst_count = 0
        
        shown_cards = []
        
        mouse_over_card = Card(-1, False)

        while 1:
            clock.tick(30)
            
            mouse_clicked = False
            mouse_pos = (0,0)            
            for event in pygame.event.get():
                if event.type == QUIT:
                    return
                elif event.type == KEYDOWN:
                    if event.key == K_ESCAPE:
                        return
                    #elif event.key == K_F1:
                    #    self.side_panel.player_score =18
                    #    self.side_panel.robot_score = 0
                    #    state = GAME_OVER 
                    #elif event.key == K_F2:
                    #    self.side_panel.player_score = 0
                    #    self.side_panel.robot_score = 18
                    #    state = GAME_OVER 
                    #elif event.key == K_F3:
                    #    self.side_panel.player_score = 9
                    #    self.side_panel.robot_score = 9
                    #    state = GAME_OVER 
                elif event.type == MOUSEBUTTONDOWN:
                    #if event.button == 3:
                    #    self.starburst.add(event.pos)
                    if event.button == 1:
                        mouse_clicked = True
                        mouse_pos = event.pos            
                
            # === STATE HANDLER ===

            is_select_event = False
            selected_card = Card(-1, False)
            
            if event.type == MOUSEMOTION:
                mouse_over_card.mouse_over = False                
                c = self.game_board.location_to_card(event.pos)
                if c is not None:
                    c.mouse_over = True
                    mouse_over_card = c
            
            if state_delay > 0:
                state_delay -= 1
            else:
                # --- NEW GAME ---
                if state == START_SCREEN and mouse_clicked:
                    state = SETUP_NEW_GAME
                    self.setup_new_game()
                    self.game_board.goto_game()
                elif state == SETUP_NEW_GAME:
                    if self.side_panel.x > 600:
                        self.side_panel.x-=10
                    else:
                        if next_player == 1:
                            self.side_panel.show_robot(False,0,0)
                            state = PLAYER2_SELECT_FIRST
                            next_player = 0
                        else:
                            self.side_panel.show_player1(False)
                            state = PLAYER1_SELECT_FIRST
                            next_player = 1
                # --- PLAYER1 STATES ---
                elif state == PLAYER1_SELECT_FIRST and self.stardust.anim_done() and self.game_board.is_init_done() and mouse_clicked:
                    c = self.game_board.location_to_card(mouse_pos)
                    is_select_event = True
                    selected_card = c
                    if c and not c.selected:
                        self.select_card(c)
                        state = PLAYER1_SELECT_SECOND
                elif state == PLAYER1_SELECT_SECOND and mouse_clicked:
                    c = self.game_board.location_to_card(mouse_pos)
                    is_select_event = True
                    selected_card = c
                    if c and not c.selected:
                        self.select_card(c)
                        state = PLAYER1_DONE
                        state_delay = DELAY
                elif state == PLAYER1_DONE:
                    pair = self.board.end_of_turn() 
                    if pair:
                        for p in pair:
                            self.stardust.add(self.game_board.card_to_location(p))
                        self.side_panel.player1_score+=1
                        self.side_panel.update_score()
                        state = PLAYER1_SELECT_FIRST
                        self.pair_snd.play() 
                    else:
                        self.side_panel.show_player2(False)
                        state = PLAYER2_SELECT_FIRST 
                    if self.board.is_game_over():
                        state = GAME_OVER
                # --- PLAYER2 STATES ---
                elif state == PLAYER2_SELECT_FIRST and self.stardust.anim_done() and self.game_board.is_init_done() and mouse_clicked:
                    c = self.game_board.location_to_card(mouse_pos)
                    is_select_event = True
                    selected_card = c
                    if c and not c.selected:
                        self.select_card(c)
                        state = PLAYER2_SELECT_SECOND
                elif state == PLAYER2_SELECT_SECOND and mouse_clicked:
                    c = self.game_board.location_to_card(mouse_pos)
                    is_select_event = True
                    selected_card = c
                    if c and not c.selected:
                        self.select_card(c)
                        state = PLAYER2_DONE
                        state_delay = DELAY
                elif state == PLAYER2_DONE:
                    pair = self.board.end_of_turn() 
                    if pair:
                        for p in pair:
                            self.stardust.add(self.game_board.card_to_location(p))
                        self.side_panel.robot_score+=1
                        self.side_panel.update_score()
                        state = PLAYER2_SELECT_FIRST
                        self.pair_snd.play() 
                    else:
                        self.side_panel.show_player1(False)
                        state = PLAYER1_SELECT_FIRST 
                    if self.board.is_game_over():
                        state = GAME_OVER
                # --- GAME OVER ---
                elif state == GAME_OVER and self.stardust.anim_done():         
                    r = self.side_panel.show_winner()
                    self.win_snd.play()
                    self.side_panel.games_stat+=1
                    if r == 1:
                        self.side_panel.player_stat+=1
                        self.ai_player.you_lose()
                    elif r == 2:
                        self.side_panel.robot_stat+=1
                        self.ai_player.you_win()
                    self.side_panel.ai_level = self.ai_player.level
                    self.side_panel.update_stats()
                    self.game_board.goto_gameover(r)
                    state = GAME_OVER_WAIT
                    starburst_count = 40
                    starburst_delay = 0
                elif state == GAME_OVER_WAIT:
                    if mouse_clicked:         
                        self.game_board.goto_game()
                        self.setup_new_game()
                        state = SETUP_NEW_GAME
                        self.starburst.stop()
                    else:
                        if starburst_count:
                            if starburst_delay == 0:
                                starburst_count-=1
                                self.boom_snd.play()
                                x = random.randint(50,550)
                                y = random.randint(50,550)
                                self.starburst.add((x,y))
                                starburst_delay = random.randint(15,30)
                            else:
                                starburst_delay -= 1

            # === DRAWING ===

            self.game_board.draw(self.screen)
            
            if is_select_event and  not (selected_card in shown_cards):
                self.game_board.render_large_image(self.screen, selected_card)
                shown_cards.append(selected_card)
            
            if state != START_SCREEN:
                self.side_panel.draw(self.screen)                            
                self.robot_mouse.draw(self.screen)
            
            self.stardust.draw(self.screen)
            self.starburst.draw(self.screen)
            
            pygame.display.flip()