fork download
  1. #!/usr/bin/env python3
  2. from random import randint
  3.  
  4. # メッセージ分離方式
  5. メッセージ = {'ようこそ': '単語当てゲームへようこそ!',
  6. '回数': '挑戦回数は{}回です!',
  7. '入力': '1文字、入力してください: ',
  8. '不正解': '不正解!残りの挑戦回数: {}',
  9. '正解': '正解!現在の単語: {}',
  10. 'おめでとう': 'おめでとう!単語は\'{}\'でした!\n{}',
  11. '残念': '残念!正解は\'{}\'でした。\n{}',
  12. '終了': 'ゲーム終了。'}
  13.  
  14. # 単語リスト
  15. 単語リスト = ["banana", "orange", "apple", "kiwi"]
  16.  
  17. # 環境データ
  18. class 環境(object):
  19. __match_args__ = ('問題', '挑戦回数', '状態', '正誤')
  20. def __init__(self, 問題, 挑戦回数, 状態, 正誤):
  21. self.問題 = 問題
  22. self.挑戦回数 = 挑戦回数
  23. self.状態 = 状態
  24. self.正誤 = 正誤
  25. # デバッグ用
  26. def __repr__(self):
  27. return f'{self.問題} {self.挑戦回数} {self.状態} {self.正誤}'
  28.  
  29. # 環境の初期化
  30. def 初期化():
  31. 問題 = 単語リスト[randint(0, len(単語リスト) - 1)]
  32. 文字数 = len(問題)
  33. env = 環境(問題, 文字数, '_' * 文字数, None)
  34. print(メッセージ['回数'].format(env.挑戦回数))
  35. return env
  36.  
  37. # 入力
  38. def 入力():
  39. s = input(メッセージ['入力'])
  40. if s.isdecimal() or len(s) != 1:
  41. return 入力()
  42. else:
  43. return s
  44.  
  45. # 評価
  46.  
  47. ## ユーザー定義例外
  48. class GameOverSuccess(Exception):
  49. def __init__(self, 引数):
  50. self.引数 = 引数
  51. def __str__(self):
  52. return メッセージ['正解'].format(self.引数)
  53.  
  54. class GameOverFail(Exception):
  55. def __init__(self, 引数):
  56. self.引数 = 引数
  57. def __str__(self):
  58. return メッセージ['不正解'].format(self.引数)
  59.  
  60.  
  61. def 評価(x, env):
  62. match env:
  63. case 環境(問題, 挑戦回数, 状態, 正誤) if x in 問題:
  64. 状態 = [i if i == x else j for i, j in zip(問題, 状態)]
  65. if '_' not in 状態:
  66. raise GameOverSuccess(状態)
  67. else:
  68. return 環境(問題, 挑戦回数, 状態, True)
  69. case 環境(問題, 挑戦回数, 状態, 正誤):
  70. 挑戦回数 -= 1
  71. if 挑戦回数 == 0:
  72. raise GameOverFail(挑戦回数)
  73. else:
  74. return 環境(問題, 挑戦回数, 状態, False)
  75.  
  76. # 出力
  77. def 出力(env):
  78. match env:
  79. case 環境(問題, 挑戦回数, 状態, 正誤) if 正誤:
  80. print(メッセージ['正解'].format(状態))
  81. case 環境(問題, 挑戦回数, 状態, 正誤):
  82. print(メッセージ['不正解'].format(挑戦回数))
  83. return env
  84.  
  85. # Read-Eval-Print Loop
  86. def REPL(env):
  87. try:
  88. return REPL(出力(評価(入力(), env)))
  89. except GameOverSuccess as e:
  90. print(e)
  91. print(メッセージ['おめでとう'].format(env.問題,メッセージ['終了']))
  92. except GameOverFail as e:
  93. print(e)
  94. print(メッセージ['残念'].format(env.問題, メッセージ['終了']))
  95.  
  96. if __name__ == '__main__':
  97. print(メッセージ['ようこそ'])
  98. REPL(初期化())
  99.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Traceback (most recent call last):
  File "/usr/lib/python3.9/py_compile.py", line 144, in compile
    code = loader.source_to_code(source_bytes, dfile or file,
  File "<frozen importlib._bootstrap_external>", line 918, in source_to_code
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "./prog.py", line 62
    match env:
          ^
SyntaxError: invalid syntax

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.9/py_compile.py", line 150, in compile
    raise py_exc
py_compile.PyCompileError:   File "./prog.py", line 62
    match env:
          ^
SyntaxError: invalid syntax

stdout
Standard output is empty