# -*- coding: utf-8 -*-
"""
対人オセロゲーム（プログラム）
"""
# これは，難易度１を達成するプログラムのソースコードです．
# これを流用する場合は，内容を理解し，コメントを追加しなさい．
# 難易度２以上の達成を目指すには，このコードからでは遠回りになる場合があります．
# きちんと自分で考えて試行錯誤することが大切です．


class Othello:
    BOARD_SIZE = 8
    STONE_STR  =  ["[ ]", " X ", " O "]  # 石の文字


    def __init__(self):
        # 盤面を初期化した状態でインスタンス変数として生成
        self.board      = [[0 for j in range(__class__.BOARD_SIZE)] for i in range(__class__.BOARD_SIZE)]
        self.board_rev  = [[False for j in range(__class__.BOARD_SIZE)] for i in range(__class__.BOARD_SIZE)]

        # 最初の石をセット
        self.board[3][4] = 1
        self.board[4][3] = 1
        self.board[3][3] = 2
        self.board[4][4] = 2

        self.num_side = 1


    # 盤面の表示
    def print_board(self):
        print("   1  2  3  4  5  6  7  8")  # 横方向の目盛
        j = 1
        for board_raw in self.board:
            print(f"{j} ", end="")          # 縦方向の目盛
            for board_cel in board_raw:
                # 石を表示
                print(__class__.STONE_STR[board_cel], end="")
            print(f" {j}")                  # 縦方向の目盛
            j += 1
        print("   1  2  3  4  5  6  7  8")  # 横方向の目盛


    # 位置が盤面の外かどうかを判定
    def is_out_of_board(self, num_v, num_h):
        if (0 <= num_v < __class__.BOARD_SIZE) and (0 <= num_h < __class__.BOARD_SIZE):
            return False
        return True


    # board_revの初期化
    def clear_board_rev(self):
        for i in range(__class__.BOARD_SIZE):
            for j in range(__class__.BOARD_SIZE):
                self.board_rev[i][j] = False


    # 石を置けるかどうかを判定
    def check_puttable(self, num_side, num_v, num_h):
        flag_rev = False
        # 位置が盤面の外の場合や既に石が置かれていた場合はやり直し
        if self.is_out_of_board(num_v, num_h) or (self.board[num_v][num_h] != 0):
            return flag_rev

        flag_rev = True
        return flag_rev
    

    # 石を置き，裏返せるところを返す
    def put_stone(self, num_side, num_v, num_h):
        self.board[num_v][num_h] = num_side



def main():
    board = Othello()
    board.print_board()

    num_side = 1  # どちらの手番か
    num_move = 1  # 何手目か

    while True:
        # 手番の出力
        print(f"{Othello.STONE_STR[num_side]}の番です")
        print(f"どこに置きますか？（ {num_move} 手目）")
        # 位置の入力　listのインデックスと対応させるため -1
        num_v = int(input("縦：")) - 1
        num_h = int(input("横：")) - 1
        print()  # 改行のみ

        # 位置が縦横ともに０以下の場合はパス
        if (num_v < 0) and (num_h < 0):
            print("パス")
            num_side = (num_side % 2) + 1
            num_move += 1
            continue

        if not(board.check_puttable(num_side, num_v, num_h)):
            print("そこには置けません")
            continue

        board.put_stone(num_side, num_v, num_h)

        # 盤面を表示して攻守交替
        board.print_board()
        num_side = (num_side % 2) + 1
        num_move += 1




if __name__ == "__main__":
    main()
