Pythonプログラミングで

リバーシを作る

Stage 7 ゲーム進行をデザインする

7-4 入力処理を実装する

さて今回はユーザーにどのマスに石を置くか入力してもらい、それに基づいて実際に盤面を変更します。

                        
    ### INPUT
    print('(X to give up) >>> ', end='')
    s = input()
    # give up
    if s in ['X', 'x']:
        main_board.winner = -player
        break
    else:
        square = IO.InputFormat(s)
        logger.info('motion = {}'.format(square))
    
    # invalid putting
    if square == False:
        print('INVALID INPUT')
        continue
    elif main_board.turn(player, *square) == FAILED:
        print('INVALID PUTTING')
        continue
    
    ### PLAYER CHANGE
    player *= -1

    main_board.BoardPrint()
                        
                    

では早速コーディングしましょう。

~~~~~~~~~~~~~~~

まずはユーザーに入力してもらう部分です。

                        
    ### INPUT
    print('(X to give up) >>> ', end='')
    s = input()
                        
                    

print で書いてるのは下のところの黄色で囲った部分ですね。

UNAVAILABLE

ギブできるようにすんのか

ええ、途中で辞めたくなることだってあるでしょ?

入力内容を s という変数に入れたら、先ほど設定したギブの場合と通常の場合を分けてあげましょう。

                        
    # give up
    if s in ['X', 'x']:
        main_board.winner = -player
        break
    else:
        square = IO.InputFormat(s)
        logger.info('motion = {}'.format(square))
                        
                    

ギブを表す X については大文字でも小文字でも受け付けるようにしてあげます。この時は「相手の勝利」ということで winner を -player にしてループを抜けます。

                        
    # give up
    if s in ['X', 'x']:
        main_board.winner = -player
        break
                        
                    

~~~~~~~~~~~~~~~

ギブではないときは前回コーディングした IO.py の InputFormat メソッドを使います。[row, column] の形でリターンされますから、これを square という変数に入れておいてあげましょう。

                        
    else:
        square = IO.InputFormat(s)
        logger.info('motion = {}'.format(square))
                        
                    

とはいえ、そもそも解読できなかった場合は InputFormat は FAILED をリターンしてきますから、この場合は「入力がおかしい」として continue してください。

                        
    # invalid putting
    if square == False:
        print('INVALID INPUT')
        continue
                        
                    

また、解読ができても石をおくことができない場所に石をおこうとしている場合も「そこに石おけない」として continue する必要があります。

                        
    elif main_board.turn(player, *square) == FAILED:
        print('INVALID PUTTING')
        continue
                        
                    

ここで注意が必要なのですが、elif 文の中で turn メソッドを実行していますから、すでに石は置かれ裏返しも終わっている状態です。

よく考えてください。5-2 でやったことをもとにすれば、turn が最終的に SUCCEEDED を出すか FAILED を出すかは実際に石を裏返すまでわかりませんよね?

SUCCEEDED なら石裏返ってるはずだな

その通り。よってこれ以上 turn を実行する必要はありません。

石も裏返したことだし、あとは相手のターンにしてあげましょう。

                        
    ### PLAYER CHANGE
    player *= -1

    main_board.BoardPrint()
                        
                    

プレーヤーを変えて盤面を表示したらおしまいです。

NEXT 7-5 ゲームセット後の操作を実装する