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
相変わらずなげーな
ここでは盤面を回転させるかを設定し、また playmode と readmode を振り分けています。
~~~~~~~~~~~~~~~
今回は盤面の回転に関する設定機能を実装しましょう。まずはデフォルトとして settings を辞書型で宣言します。
settings = {'turnmode_play': True, 'turnmode_read': False, 'reverse_read': False}
それぞれ
turnmode_play | playmode の引数 turnmode |
turnmode_read | readmode の引数 turnmode |
reverse_read | readmode の引数 reverse |
を表しています。詳細は 8-1 や 10-4 などを参照してください。
この値を変更する関数の名前を resetting として宣言しましょう。
def resetting():
最初に ON と OFF の文字列をリストに格納しています。
ON_OFF = ['OFF', 'ON']
これ何やってんだ?
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']]))
この一番上の while ってなんだ?
あとで説明するから今は黙ってて。
デフォルト状態
turnmode_play: True
turnmode_read: False
でこれを実行してみるとこうなります。
うまい具合に 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
なんだよ、なんもねーじゃねえか
あらら、長い方がよかったでしょうか。
すいませんでした
return の部分は単純に while 脱出すれば関数からも出られますので break でも構いません。
~~~~~~~~~~~~~~~
で、while ループの説明どうなった?
これからしますよ。もちろん忘れてなんかいません。
もし while ループがないとして、一度コマンドをしくじったらどうなります?
そのまま関数出ちゃうな
と言うことで、関数のなかにとどまっているために無限ループの形をとっています。