Пример #1
0
class Game:
    def __init__(self, parent):

        self.root = parent
        self.gui = GUI(parent, self)

        self.log = Log('log.txt')

        self.players = {
            MassType.BLACK: Player(MassType.BLACK),
            MassType.WHITE: Player(MassType.WHITE),
        }

        self.start_app()

    def start_app(self):

        # BGMの再生を開始
        # pygame.mixer.init()
        # pygame.mixer.music.set_volume(0.10)
        # self.bgm = pygame.mixer.Sound('bgm.wav')
        # self.bgm.play(-1)

        # Top画面を表示
        self.gui.show_top()

    def start_game(self, black_player_type, white_player_type):

        # 盤面の描画をクリア
        self.gui.clear_board()

        # 盤面を初期化
        self.board = Board()

        # 黒が先手
        self.turn = MassType.BLACK

        # プレイヤータイプをセット
        self.players[MassType.BLACK].type = black_player_type
        self.players[MassType.WHITE].type = white_player_type

        # CPUが使用する駒配置アルゴリズムをセット
        if black_player_type == PlayerType.CPU:
            self.players[MassType.BLACK].set_strategy(
                StrategyType.EVALUATION_RANDOM)
        if white_player_type == PlayerType.CPU:
            self.players[MassType.WHITE].set_strategy(
                StrategyType.EVALUATION_THEN_FORECAST)

        # スコアを初期化
        self.players[MassType.BLACK].score = 2
        self.players[MassType.WHITE].score = 2

        # 盤面を描画
        self.gui.clear_latest_mass()
        self.update_board()

        # 先手がCPUの場合、駒配置を実行
        if self.players[self.turn].type == PlayerType.CPU:
            self.root.after(1000, self.cpu_put)

    def on_clicked_start_button(self):
        print('スタートボタン')

    def on_clicked_play_first_button(self):
        self.gui.show_game()
        self.start_game(PlayerType.HUMAN, PlayerType.CPU)

    def on_clicked_play_second_button(self):
        self.gui.show_game()
        self.start_game(PlayerType.CPU, PlayerType.HUMAN)

    def on_clicked_human_match_button(self):
        self.gui.show_game()
        self.start_game(PlayerType.HUMAN, PlayerType.HUMAN)

    def on_clicked_cpu_match_button(self):
        self.gui.show_game()
        self.start_game(PlayerType.CPU, PlayerType.CPU)

    def on_clicked_undo_button(self):
        # CPUのターンのクリックは無視
        if self.players[self.turn].type == PlayerType.HUMAN:
            # 盤面の描画をクリア
            self.gui.clear_board()

            mass_list = self.log.get_board_last_player_turn(self.turn)

            # 盤面を初期化
            self.board = Board()
            self.board.set_mass_list(mass_list)

            # スコアを初期化
            self.players[MassType.BLACK].score = Util.get_piece_num(
                mass_list, MassType.BLACK)
            self.players[MassType.WHITE].score = Util.get_piece_num(
                mass_list, MassType.WHITE)
            print(str(self.players[MassType.BLACK].score))
            print(str(self.players[MassType.WHITE].score))

            # 盤面を描画
            self.gui.clear_latest_mass()
            self.update_board()

    def on_clicked_top_back_button(self):
        self.gui.show_top()

    def on_clicked_restart_button(self):
        self.start_game(self.players[MassType.BLACK].type,
                        self.players[MassType.WHITE].type)

    def on_clicked_mass(self, event):

        # CPUのターンのクリックは無視
        if self.players[self.turn].type == PlayerType.CPU:
            return

        # クリックした座標からマスを算出
        x = event.x // Common.MASS_SIZE
        y = event.y // Common.MASS_SIZE

        # 駒を置く
        self.update(x, y)

    def cpu_put(self):
        mass_list_temp = Util.copy_mass_list(self.board.mass_list)
        x, y = self.players[self.turn].put(mass_list_temp)
        self.update(x, y)

    def update(self, x, y):
        if self.board.update(x, y, self.turn):

            # ログ書き込み
            self.log.write(self.turn, x, y)

            # スコアを更新
            self.players[MassType.BLACK].score = self.board.get_piece_num(
                MassType.BLACK)
            self.players[MassType.WHITE].score = self.board.get_piece_num(
                MassType.WHITE)

            # ターン交代
            self.turn = Util.get_opp_type(self.turn)

            # GUIを更新
            self.gui.clear_latest_mass()
            self.gui.draw_latest_mass(x, y)
            self.update_board()

            # 終了した場合
            if self.board.has_finished():
                self.gui.show_result_dialog(self.players[MassType.BLACK].score,
                                            self.players[MassType.WHITE].score)
            # 終了していない場合
            else:
                # パスを判定
                if not self.board.can_put_somewhere(self.turn):
                    self.turn = Util.get_opp_type(self.turn)
                    self.gui.show_skip_dialog()

                    # もう一度GUIを更新
                    self.update_board()

                # CPUのターンならば一定時間経過後に駒を打つ
                if self.players[self.turn].type == PlayerType.CPU:
                    self.root.after(1000, self.cpu_put)

    def update_board(self):
        self.gui.clear_board()
        self.gui.draw_board(self.board.mass_list,
                            self.board.get_puttable_list(self.turn),
                            self.players[MassType.BLACK].score,
                            self.players[MassType.WHITE].score, self.turn)