Pythonプログラミングで

チェスを作る

Stage 11 全体の機能を統括する

11-1 各種設定を変更させる

ここからは main.py をコーディングしていきます。

                        
import playmode
import readmode

settings = {'turnmode_play': True, 'turnmode_read': False, 'reverse_read': False}

def resetting():
    ON_OFF = ['OFF', 'ON']

    while True:
        print('''
    PLAY MODE
        BOARD ROTATION IN BLACK'S TURN: {}

    READ MODE
        BOARD ROTATION IN BLACK'S TURN: {}

        '''.format(ON_OFF[settings['turnmode_play']], ON_OFF[settings['turnmode_read']]))
        command = input("ENTER A COMMAND (P to change playmode / R to change readmode / X to exit) >>> ")
        if command in ['P', 'p', 'PLAY', 'play', 'Play', 'PLAYMODE', 'PlayMode', 'Playmode', 'playmode', 'PLAY MODE', 'Play Mode', 'Play mode', 'play mode']:
            print('''
            BOARD ROTATION IN BLACK'S TURN IN PLAY MODE: {}
            '''.format(ON_OFF[settings['turnmode_play']]))
            while True:
                command = input("ENTER A COMMAND (ON / OFF / EXIT) >>> ")
                if command in ['ON', 'on', 'On']:
                    settings['turnmode_play'] = True
                    break
                elif command in ['OFF', 'Off', 'off']:
                    settings['turnmode_play'] = False
                    break
                elif command in ['EXIT', 'Exit', 'exit', 'X', 'Ex', 'EX', 'ex']:
                    break
        elif command in ['R', 'r', 'READ', 'Read', 'read', 'READMODE', 'ReadMode', 'Readmode', 'readmode', 'READ MODE', 'Read Mode', 'Read mode', 'read mode']:
            print('''
            BOARD ROTATION IN BLACK'S TURN IN READ MODE: {}
            '''.format(ON_OFF[settings['turnmode_read']]))
            while True:
                command = input("ENTER A COMMAND (ON / OFF / EXIT) >>> ")
                if command in ['ON', 'on', 'On']:
                    settings['turnmode_read'] = True
                    settings['reverse_read'] = True
                    break
                elif command in ['OFF', 'Off', 'off']:
                    settings['turnmode_read'] = False
                    settings['reverse_read'] = False
                    break
                elif command in ['EXIT', 'Exit', 'exit', 'X', 'Ex', 'EX', 'ex']:
                    break
        elif command in ['X', 'x', 'Exit', 'EXIT', 'exit', 'EX', 'Ex', 'ex']:
            return



if __name__ == "__main__":
    while True:
        print("\n\nWELCOME TO CHESS\n")
        command = input("ENTER A COMMAND (P to PLAYMODE / R to READMODE / S to SETTINGS / X to EXIT) >>> ")
        if command in ['P', 'p', 'PLAY', 'play', 'Play', 'PLAYMODE', 'PlayMode', 'Playmode', 'playmode', 'PLAY MODE', 'Play Mode', 'Play mode', 'play mode']:
            playmode.playmode(settings['turnmode_play'])
            break

        elif command in ['R', 'r', 'READ', 'Read', 'read', 'READMODE', 'ReadMode', 'Readmode', 'readmode', 'READ MODE', 'Read Mode', 'Read mode', 'read mode']:
            readmode.readmode(settings['turnmode_read'], settings['reverse_read'])
            break

        elif command in ['S', 's', 'SETTINGS', 'settings', 'Settings', 'SETTING', 'Setting', 'setting']:
            resetting()
            
        elif command in ['X', 'x', 'Exit', 'EXIT', 'exit', 'EX', 'Ex', 'ex']:
            break
                        
                    
UNAVAILABLE

相変わらずなげーな

ここでは盤面を回転させるかを設定し、また playmode と readmode を振り分けています。

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

今回は盤面の回転に関する設定機能を実装しましょう。まずはデフォルトとして settings を辞書型で宣言します。

                        
settings = {'turnmode_play': True, 'turnmode_read': False, 'reverse_read': False}
                        
                    

それぞれ

turnmode_playplaymode の引数 turnmode
turnmode_readreadmode の引数 turnmode
reverse_readreadmode の引数 reverse

を表しています。詳細は 8-110-4 などを参照してください。

この値を変更する関数の名前を resetting として宣言しましょう。

                        
                            def resetting():
                        
                    

最初に ON と OFF の文字列をリストに格納しています。

                        
    ON_OFF = ['OFF', 'ON']
                        
                    
UNAVAILABLE

これ何やってんだ?

ON_OFF[False] で 'OFF' が、ON_OFF[True] で ON が出てくるようにすることで、settings の各値をインデックスに突っ込むだけで適切な文字列を表示してくれるようにしています。

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

実際に使っているところを見た方が早いでしょう。

                        
    while True:
        print('''
    PLAY MODE
        BOARD ROTATION IN BLACK'S TURN: {}

    READ MODE
        BOARD ROTATION IN BLACK'S TURN: {}

        '''.format(ON_OFF[settings['turnmode_play']], ON_OFF[settings['turnmode_read']]))
                        
                    
UNAVAILABLE

この一番上の while ってなんだ?

あとで説明するから今は黙ってて。

デフォルト状態

  • turnmode_play: True
  • turnmode_read: False

でこれを実行してみるとこうなります。

UNAVAILABLE
UNAVAILABLE

うまい具合に ON と OFF が使い分けられてるな

さて、この状態からまずは playmode と readmode のどちらの設定を変更するか、コマンドを使って選んでもらいます。

                        
        command = input("ENTER A COMMAND (P to change playmode / R to change readmode / X to exit) >>> ")
                        
                    

この結果から場合わけしましょう。

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

まず playmode の場合。

                        
        if command in ['P', 'p', 'PLAY', 'play', 'Play', 'PLAYMODE', 'PlayMode', 'Playmode', 'playmode', 'PLAY MODE', 'Play Mode', 'Play mode', 'play mode']:
            print('''
            BOARD ROTATION IN BLACK'S TURN IN PLAY MODE: {}
            '''.format(ON_OFF[settings['turnmode_play']]))
            while True:
                command = input("ENTER A COMMAND (ON / OFF / EXIT) >>> ")
                if command in ['ON', 'on', 'On']:
                    settings['turnmode_play'] = True
                    break
                elif command in ['OFF', 'Off', 'off']:
                    settings['turnmode_play'] = False
                    break
                elif command in ['EXIT', 'Exit', 'exit', 'X', 'Ex', 'EX', 'ex']:
                    break
                        
                    

さらに内側に while を用意して turnmode_play を ON にするか OFF にするか、はたまた設定をやめて脱出するか選択させます。

                        
        if command in ['P', 'p', 'PLAY', 'play', 'Play', 'PLAYMODE', 'PlayMode', 'Playmode', 'playmode', 'PLAY MODE', 'Play Mode', 'Play mode', 'play mode']:
            print('''
            BOARD ROTATION IN BLACK'S TURN IN PLAY MODE: {}
            '''.format(ON_OFF[settings['turnmode_play']]))
            while True:
                command = input("ENTER A COMMAND (ON / OFF / EXIT) >>> ") 
                if command in ['ON', 'on', 'On']:
                    settings['turnmode_play'] = True
                    break
                elif command in ['OFF', 'Off', 'off']:
                    settings['turnmode_play'] = False
                    break
                elif command in ['EXIT', 'Exit', 'exit', 'X', 'Ex', 'EX', 'ex']:
                    break
                        
                    

コマンド通りに設定を変更したら break で内側の while ループを脱出します。

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

readmode もほぼ同じです。違うところだけハイライトを当てますね。

                        
        elif command in ['R', 'r', 'READ', 'Read', 'read', 'READMODE', 'ReadMode', 'Readmode', 'readmode', 'READ MODE', 'Read Mode', 'Read mode', 'read mode']: 
            print('''
            BOARD ROTATION IN BLACK'S TURN IN READ MODE: {}
            '''.format(ON_OFF[settings['turnmode_read']]))
            while True:
                command = input("ENTER A COMMAND (ON / OFF / EXIT) >>> ")
                if command in ['ON', 'on', 'On']:
                    settings['turnmode_read'] = True
                    settings['reverse_read'] = True
                    break
                elif command in ['OFF', 'Off', 'off']:
                    settings['turnmode_read'] = False
                    settings['reverse_read'] = False
                    break
                elif command in ['EXIT', 'Exit', 'exit', 'X', 'Ex', 'EX', 'ex']:
                    break
                        
                    

ただしここでは turnmode_read と reverse_read の値を合わせることをお忘れなく。10-4 でも申し上げていますが、これを合わせないと盤面を見たい向きからみることができません。

最後に EXIT の場合をコーディングします。

                        
        elif command in ['X', 'x', 'Exit', 'EXIT', 'exit', 'EX', 'Ex', 'ex']:
            return
                        
                    
UNAVAILABLE

なんだよ、なんもねーじゃねえか

あらら、長い方がよかったでしょうか。

UNAVAILABLE

すいませんでした

return の部分は単純に while 脱出すれば関数からも出られますので break でも構いません。

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

UNAVAILABLE

で、while ループの説明どうなった?

これからしますよ。もちろん忘れてなんかいません。

UNAVAILABLE

もし while ループがないとして、一度コマンドをしくじったらどうなります?

UNAVAILABLE

そのまま関数出ちゃうな

と言うことで、関数のなかにとどまっているために無限ループの形をとっています。

NEXT 11-2 スタート画面を作る