fork download
  1. #! /usr/bin/env python3
  2.  
  3. import random, sys
  4.  
  5. # メッセージ分離方式: 表示用メッセージは本体から分けておく(メインテナンスの為)
  6. msg = {'start': 'じゃんけんスタート',
  7. 'prompt': '自分の手を入力してください\n0:グー,1:チョキ,2:パー',
  8. 'win': 'あなたの勝ちです',
  9. 'lose': 'あなたの負けです',
  10. 'continue?': '続けますか?',
  11. 'wrong': '入力が間違っています',
  12. 'y-or-n': 'YesかNoを入力して下さい(y/n)',
  13. 'hand': 'コンピュータの手: {}',
  14. 0: 'グー',
  15. 1: 'チョキ',
  16. 2: 'パー'}
  17.  
  18. # 環境データ
  19. class Env(object):
  20. def __init__(self, lose = 0, win = 0, *hand):
  21. self.lose = lose
  22. self.win = win
  23. self.hand = hand
  24. def __repr__(self):
  25. return f'{self.win}勝{self.lose}敗'
  26.  
  27. # 入力関数(read)
  28. def read(env):
  29. # 使いまわしの為 my_hand に代入
  30. my_hand = input(msg['continue?' if env.win == 5 or env.lose == 5 else 'prompt'])
  31. if my_hand.isalpha() or my_hand in map(str, (0, 1, 2)):
  32. return my_hand
  33. else:
  34. # 想定外の入力の際、例外を投げる
  35. raise ValueError
  36.  
  37. # プログラム本体: 計算処理だけ司り、入力も出力もしない
  38. def result(my_hand, env):
  39. if env.win == 5 or env.lose == 5:
  40. # 使いまわしの為 my_hand に改めて代入
  41. my_hand = my_hand.lower()
  42. if my_hand == 'y' or my_hand == 'yes':
  43. return Env()
  44. elif my_hand == 'n' or my_hand == 'no':
  45. sys.exit()
  46. else:
  47. # 判定結果を二回使いまわしするので変数に代入
  48. hand = random.randint(0, 2)
  49. hand_diff = (int(my_hand) - hand + 3) % 3
  50. return Env(env.lose + 1 if hand_diff == 1 else env.lose,
  51. env.win + 1 if hand_diff == 2 else env.win,
  52. hand)
  53.  
  54. # 出力関数(print)
  55. def display(env):
  56. # コンピュータの手を表示
  57. print(msg['hand'].format(msg[env.hand[0]]))
  58. # 三項演算子的な書き方
  59. print(msg['win'] if env.win == 5
  60. else msg['lose'] if env.lose == 5
  61. else env)
  62. return env
  63.  
  64. # プログラム実行部
  65. if __name__ == '__main__':
  66. print(msg['start'])
  67. env = Env()
  68. while True:
  69. try:
  70. # env の値を更新する必要があるんで代入する
  71. env = display(result(read(env), env))
  72. # 以下、例外処理
  73. except ValueError:
  74. print(msg['wrong'])
  75. except AttributeError:
  76. print(msg['y-or-n'])
  77.  
Runtime error #stdin #stdout #stderr 0.14s 26096KB
stdin
Standard input is empty
stdout
じゃんけんスタート
自分の手を入力してください
0:グー,1:チョキ,2:パー
stderr
Traceback (most recent call last):
  File "./prog.py", line 71, in <module>
  File "./prog.py", line 30, in read
EOFError: EOF when reading a line