Exemplo n.º 1
0
class Game:
    """Main running class for game."""
    def __init__(self):
        """Initialize running class."""
        self.config = ConfigParser()
        self.config.read('settings.ini')
        self.size_x = self.config.getint('screen', 'size_x')
        self.size_y = self.config.getint('screen', 'size_y')

        with open('languages.dat', 'rb') as lang_file:
            self.phrases = pickle.load(lang_file)[self.config.get(
                'total', 'language')]

        self.speech = Speech(self.config)
        self.speech.speak(self.phrases['start'])

        pygame.init()
        pygame.font.init()
        pygame.mixer.init()

        self.screen = pygame.display.set_mode((self.size_x, self.size_y))
        pygame.display.set_caption(self.phrases['title'])

        self.music = Music(self.config.getfloat('audio', 'music_volume'))
        self.sounds = Sound(self.config.getfloat('audio', 'sound_volume'))

        self.board = Board(self.config, self.screen, self.sounds)
        self.player = Player(self.board, self.speech, self.phrases)
        self.game_over = True
        self.win = False

        self.STOPPED_PLAYING = pygame.USEREVENT + 1
        pygame.mixer.music.set_endevent(self.STOPPED_PLAYING)
        self.fontObj = pygame.font.SysFont('arial', 50)
        self.clock = pygame.time.Clock()

        random.seed()
        self.music_play()
        self.new_game()

    def mainloop(self):
        """Run main loop game."""
        self.running = True
        while self.running:
            self.handle_events()
            self.draw()

            self.clock.tick(15)
            pygame.display.flip()

        self.speech.speak(self.phrases['finish'])
        self.speech.finish()
        pygame.quit()

    def handle_events(self):
        """Check all game events."""
        for event in pygame.event.get():
            if pygame.QUIT == event.type:
                self.running = False
            if self.STOPPED_PLAYING == event.type:
                self.music_play()
            elif pygame.KEYDOWN == event.type:
                if pygame.K_ESCAPE == event.key:
                    self.running = False
                elif pygame.K_F1 == event.key:
                    self.help()
                elif pygame.K_F2 == event.key:
                    self.turn_music()
                elif pygame.K_F3 == event.key:
                    self.change_level()
                elif pygame.K_F4 == event.key:
                    self.change_deck()
                elif pygame.K_F5 == event.key:
                    self.new_game()
                elif pygame.K_F9 == event.key:
                    self.change_language()
                elif pygame.K_TAB == event.key and pygame.key.get_mods(
                ) & pygame.KMOD_SHIFT:
                    if not self.game_over:
                        self.player.actions(Actions.ChangeZoneDown)
                elif pygame.K_TAB == event.key:
                    if not self.game_over:
                        self.player.actions(Actions.ChangeZoneUp)
                elif pygame.K_LEFT == event.key:
                    if not self.game_over:
                        self.player.actions(Actions.ChangeRowDown)
                elif pygame.K_RIGHT == event.key:
                    if not self.game_over:
                        self.player.actions(Actions.ChangeRowUp)
                elif pygame.K_UP == event.key:
                    if not self.game_over:
                        self.player.actions(Actions.ChangeCardUp)
                elif pygame.K_DOWN == event.key:
                    if not self.game_over:
                        self.player.actions(Actions.ChangeCardDown)
                elif pygame.K_SPACE == event.key:
                    if not self.game_over:
                        self.player.actions(Actions.Take)
                        self.check_win()

    def draw(self):
        """Main draw function."""
        self.screen.fill(Colors.DARKGREEN)
        self.board.draw()
        if self.game_over:
            if self.win:
                textSurfaceObj = self.fontObj.render(self.phrases['win'], True,
                                                     Colors.GREEN)
            else:
                textSurfaceObj = self.fontObj.render(self.phrases['game_over'],
                                                     True, Colors.RED)
            textRectObj = textSurfaceObj.get_rect()
            textRectObj.center = (self.size_x // 2, self.size_y // 2)
            self.screen.blit(textSurfaceObj, textRectObj)
        else:
            self.player.draw()

    def music_play(self):
        """Change music play."""
        if self.config.getboolean('audio', 'music'):
            name = random.choice(self.music.get_music_names())
            self.music.play(name)

    def check_win(self):
        """Check win game."""
        all_kings = 0
        for row in self.board.zones[1].rows:
            if row and 'king' == row[-1].rate:
                all_kings += 1
        if 8 == all_kings:
            self.game_over = True
            self.win = True
            self.speech.speak(self.phrases['win'])

    def new_game(self):
        """Start new game."""
        self.speech.speak(self.phrases['new_game'])
        self.game_over = False
        self.win = False
        self.board.create_deck()
        self.board.clear_zones()
        self.board.distribution()
        self.player.reset()
        self.player.speak()

    def help(self):
        """Speak help for keys control game."""
        language = self.config.get('total', 'language')
        with open('help.dat', 'rb') as help_file:
            data = pickle.load(help_file)
            for line in [line for line in data[language] if '\n' != line]:
                self.speech.speak(line)

                shift = len(line) // 5
                timeout = shift * 0.3
                time.sleep(timeout)

    def turn_music(self):
        """On or off music in game."""
        if self.config.getboolean('audio', 'music'):
            self.config.set('audio', 'music', 'false')
            pygame.mixer.music.stop()
            self.speech.speak(self.phrases['music_off'])
        else:
            self.config.set('audio', 'music', 'true')
            self.music_play()
            self.speech.speak(self.phrases['music_on'])
        with open('settings.ini', 'w') as config_file:
            self.config.write(config_file)

    def change_level(self):
        """Change level: begin, middle, hard."""
        if 'begin' == self.config.get('board', 'level'):
            self.config.set('board', 'level', 'middle')
            self.speech.speak(self.phrases['middle'])
        elif 'middle' == self.config.get('board', 'level'):
            self.config.set('board', 'level', 'hard')
            self.speech.speak(self.phrases['hard'])
        else:
            self.config.set('board', 'level', 'begin')
            self.speech.speak(self.phrases['begin'])
        with open('settings.ini', 'w') as config_file:
            self.config.write(config_file)

    def change_deck(self):
        """Change deck on game: 52 or 36."""
        if 'half' == self.config.get('board', 'deck'):
            self.config.set('board', 'deck', 'full')
            self.speech.speak(self.phrases['52_cards'])
        else:
            self.config.set('board', 'deck', 'half')
            self.speech.speak(self.phrases['36_cards'])
        with open('settings.ini', 'w') as config_file:
            self.config.write(config_file)

    def change_language(self):
        """Change language for phrases."""
        if 'ru' == self.config.get('total', 'language'):
            self.config.set('total', 'language', 'en')
            with open('languages.dat', 'rb') as lang_file:
                self.phrases = pickle.load(lang_file)['en']
        else:
            self.config.set('total', 'language', 'ru')
            with open('languages.dat', 'rb') as lang_file:
                self.phrases = pickle.load(lang_file)['ru']
        self.player.phrases = self.phrases
        self.speech.speak(self.phrases['language'])
        with open('settings.ini', 'w') as config_file:
            self.config.write(config_file)
Exemplo n.º 2
0
class Game:
    """Main running class for game."""
    def __init__(self):
        """Initialize running class."""
        self.config = ConfigParser()
        self.config.read('settings.ini')

        if self.config.getboolean('total', 'debug'):
            if getattr(sys, 'frozen', False):
                self.logger = Logger(
                    os.path.join(os.path.dirname(sys.executable),
                                 self.__class__.__name__))
            else:
                self.logger = Logger(
                    os.path.join(os.getcwd(), self.__class__.__name__))
        self.log = logging.getLogger()
        self.log.info(__name__ + ': ' + 'def ' + self.__init__.__name__ +
                      '(): ' + self.__init__.__doc__)

        self.size_x = self.config.getint('screen', 'size_x')
        self.size_y = self.config.getint('screen', 'size_y')

        with open('languages.dat', 'rb') as lang_file:
            self.phrases = pickle.load(lang_file)[self.config.get(
                'total', 'language')]

        self.speech = Speech(self.config)
        self.speech.speak(self.phrases['start'], True)

        pygame.init()
        pygame.font.init()
        pygame.mixer.init()

        self.screen = pygame.display.set_mode((self.size_x, self.size_y))
        pygame.display.set_caption(self.phrases['title'])

        self.music = Music(self.config.getfloat('audio', 'music_volume'))
        self.sounds = Sound(self.config.getfloat('audio', 'sound_volume'))

        self.menu = Menu(self.config, self.screen, self.speech, self.phrases,
                         self.sounds)
        self.menu_flag = True
        menu_functions = [self.new_game, self.rules, self.help, self.exit]
        self.menu.set_functions(menu_functions)

        self.board = Board(self.config, self.screen, self.sounds)
        self._ai = AI(self.board, self.speech, self.phrases)
        self.player = Player(self.board, self.speech, self.phrases, self._ai)
        self._ai.gamer = self.player
        self._ai.player.behaviors.set_controllers(self._ai)
        self.running = True
        self.game_over = True
        self.win = False

        self.handle_numbers = {'K_' + str(num): num for num in range(1, 10)}
        self.handle_numbers.update(
            {'K_KP' + str(num): num
             for num in range(1, 10)})

        self.font_obj = pygame.font.SysFont('arial', 50)
        self.clock = pygame.time.Clock()

        self.music_play()
        self.menu.activate(self.menu_flag)

    def mainloop(self):
        """Run main loop game."""
        self.log.info(__name__ + ': ' + 'def ' + self.mainloop.__name__ +
                      '(): ' + self.mainloop.__doc__)

        while self.running:
            self.handle_events()
            if self._ai.ai_step:
                self._ai.player.step()
            if self.menu_flag:
                self.menu.draw()
            else:
                self.draw()
            if not self.game_over:
                self.check_win()

            self.clock.tick(15)
            pygame.display.flip()

        self.speech.speak(self.phrases['finish'], True)
        self.speech.finish()
        self.board.finish()
        if self.config.getboolean('total', 'debug'):
            self.logger.finish()
        pygame.quit()

    def exit(self):
        """Exit from game in menu."""
        self.log.info(__name__ + ': ' + 'def ' + self.exit.__name__ + '(): ' +
                      self.exit.__doc__)

        self.menu_flag = not self.menu_flag
        self.menu.activate(self.menu_flag)
        self.running = False

    def handle_events(self):
        """Check all game events."""
        for event in pygame.event.get():
            if pygame.QUIT == event.type:
                self.running = False
            elif pygame.KEYDOWN == event.type:
                self.handle_events_keydown(event)

    def handle_events_keydown(self, event):
        """Check keydown events."""
        self.handle_events_keydown_functional(event)
        self.handle_events_keydown_arrows(event)
        if pygame.K_ESCAPE == event.key:
            if not self.game_over:
                self.menu_flag = not self.menu_flag
                self.menu.activate(self.menu_flag)
        elif pygame.K_SPACE == event.key and pygame.key.get_mods(
        ) & pygame.KMOD_SHIFT:
            if not self.menu_flag and not self.game_over and not self._ai.ai_step:
                self.player.select(True)
        elif pygame.K_SPACE == event.key:
            if self.menu_flag:
                self.menu.click()
            elif not self.game_over and not self._ai.ai_step:
                self.player.select()
        elif pygame.K_RETURN == event.key:
            if self.menu_flag:
                self.menu.click()
        elif pygame.K_c == event.key:
            if not self.menu_flag and not self.game_over and not self._ai.ai_step:
                self.speech.speak(self.player.cell.pos, True)
        elif pygame.K_p == event.key:
            if not self.menu_flag and not self.game_over and not self._ai.ai_step:
                phrase = self.phrases['your_info'] % self.player.info()
                self.speech.speak(phrase, True)
        elif pygame.K_e == event.key:
            if not self.menu_flag and not self.game_over and not self._ai.ai_step:
                phrase = self.phrases['enemy_info'] % self._ai.player.info()
                self.speech.speak(phrase, True)
        for key, num in self.handle_numbers.items():
            if getattr(pygame, key) == event.key:
                if not self.menu_flag and not self.game_over and not self._ai.ai_step:
                    self.player.select_fleet(num)

    def handle_events_keydown_functional(self, event):
        """Check functional keys."""
        if pygame.K_F1 == event.key:
            self.help()
        elif pygame.K_F2 == event.key:
            self.turn_music()
        elif pygame.K_F5 == event.key:
            self.new_game()
        elif pygame.K_F9 == event.key:
            self.change_language()

    def handle_events_keydown_arrows(self, event):
        """Check arrows keys."""
        if pygame.K_LEFT == event.key:
            if not self.menu_flag and not self.game_over and not self._ai.ai_step:
                self.player.move(DIR.left)
        elif pygame.K_RIGHT == event.key:
            if not self.menu_flag and not self.game_over and not self._ai.ai_step:
                self.player.move(DIR.right)
        elif pygame.K_UP == event.key:
            if self.menu_flag:
                self.menu.change_button(-1)
            elif not self.game_over and not self._ai.ai_step:
                self.player.move(DIR.up)
        elif pygame.K_DOWN == event.key:
            if self.menu_flag:
                self.menu.change_button(1)
            elif not self.game_over and not self._ai.ai_step:
                self.player.move(DIR.down)

    def draw(self):
        """Main draw function."""
        self.screen.fill(Colors.GRAY)
        self.board.draw()
        if not self.game_over:
            self.player.draw()
            self._ai.player.draw()
            self._ai.draw()
            self.screen.blit(self.board.board, self.board.offset)
        else:
            if self.win:
                text_surface_obj = self.font_obj.render(
                    self.phrases['win'], True, Colors.GREEN)
            else:
                text_surface_obj = self.font_obj.render(
                    self.phrases['game_over'], True, Colors.RED)
            text_rect_obj = text_surface_obj.get_rect()
            text_rect_obj.center = (self.size_x // 2, self.size_y // 2)
            self.screen.blit(text_surface_obj, text_rect_obj)

    def music_play(self):
        """Run music play."""
        self.log.info(__name__ + ': ' + 'def ' + self.music_play.__name__ +
                      '(): ' + self.music_play.__doc__)

        if self.config.getboolean('audio', 'music'):
            name = self.music.get_names()[0]
            self.music.play(name, -1)

    def check_win(self):
        """Check win game."""
        if not self._ai.player.if_exists_forts():
            self.game_over = True
            self.win = True
            self.speech.speak(self.phrases['win'], True)
        elif not self.player.if_exists_forts():
            self.game_over = True
            self.win = False
            self.speech.speak(self.phrases['game_over'], True)

    def new_game(self):
        """Start new game."""
        self.log.info(__name__ + ': ' + 'def ' + self.new_game.__name__ +
                      '(): ' + self.new_game.__doc__)

        self.menu_flag = not self.menu_flag
        self.menu.activate(self.menu_flag)
        self.speech.speak(self.phrases['new_game'], True)
        self.game_over = False
        self.win = False
        self._ai.player.init()
        self.player.init()
        self.player.create_fleets()
        #self._ai.ai_step = True # if remove create_fleets
        #self._ai.next_step() # if remove create_fleets
        self.player.speak()

    def help(self):
        """Speak help for keys control game."""
        self.log.info(__name__ + ': ' + 'def ' + self.help.__name__ + '(): ' +
                      self.help.__doc__)

        language = self.config.get('total', 'language')
        with open('help.dat', 'rb') as help_file:
            data = pickle.load(help_file)
            for line in [line for line in data[language] if line != '\n']:
                self.speech.speak(line, False)

    def rules(self):
        """Speak help for rules game."""
        self.log.info(__name__ + ': ' + 'def ' + self.rules.__name__ + '(): ' +
                      self.rules.__doc__)

        with open('help.dat', 'rb') as help_file:
            data = pickle.load(help_file)
            for line in [line for line in data['rules'] if line != '\n']:
                self.speech.speak(line, False)

    def turn_music(self):
        """On or off music in game."""
        self.log.info(__name__ + ': ' + 'def ' + self.turn_music.__name__ +
                      '(): ' + self.turn_music.__doc__)

        if self.config.getboolean('audio', 'music'):
            self.config.set('audio', 'music', 'false')
            pygame.mixer.music.stop()
            self.speech.speak(self.phrases['music_off'], True)
        else:
            self.config.set('audio', 'music', 'true')
            self.music_play()
            self.speech.speak(self.phrases['music_on'], True)
        with open('settings.ini', 'w') as config_file:
            self.config.write(config_file)

    def change_language(self):
        """Change language for phrases."""
        self.log.info(__name__ + ': ' + 'def ' +
                      self.change_language.__name__ + '(): ' +
                      self.change_language.__doc__)

        if self.config.get('total', 'language') == 'ru':
            self.config.set('total', 'language', 'en')
            with open('languages.dat', 'rb') as lang_file:
                self.phrases = pickle.load(lang_file)['en']
        else:
            self.config.set('total', 'language', 'ru')
            with open('languages.dat', 'rb') as lang_file:
                self.phrases = pickle.load(lang_file)['ru']
        self.player.phrases = self.phrases
        self.speech.speak(self.phrases['language'], True)
        with open('settings.ini', 'w') as config_file:
            self.config.write(config_file)