今回は Python で「21ゲーム」を作ってみます。
これもLINEのオープンチャットからネタをいただきました。
どこかの学校で課題として出されたようで、

どう作ったらいいのか分からないので、教えてください。
というような投稿があったように記憶しています。
Python界隈では有名な まにゃpy さんも、たぶん同じ投稿を見て、こんなツイートをしていました。
私もオープンチャットの中で、いきなりコードを書かずに、まずはフローチャートを書くことを勧めました。
勧めたからには実践しないといけません。
ということで、フローチャートを書く → コーディングの手順でいきたいと思います。
21ゲームのルール
まずはじめに、21ゲームのルールを確認しておきます。
まにゃpyさんのツイートにもありましたが、次のようなルールです。
- 2人で行う
- 交互に1から13までの整数を言う
- 言った数は足していく
- 合計が21を越えた時点の数を言った方が負けとなる
- 5ターン以内に終了しなかったら引き分けとなる
つまりは、



7!



5!



3!



6!



21を越えたのでアウト!
という感じのゲームです。
負けてしまいました。。。
21ゲームのフローチャート
21ゲームのルールも分かったので、フローチャートを書いてみます。
の前に、ゲームの流れを言語化してみます。
- 先攻が数を言う
- 後攻が数を言う
- 合計が21を越えていれば後攻の負け、越えていなければ次のターンへ
- 先攻が数を言う
- 合計が21を越えていれば先攻の負け、越えていなければ後攻へ
- 後攻が数を言う
- 合計が21を越えていれば後攻の負け、越えていなければ次のターンへ
あとは、4〜7を5ターンまで繰り返すだけです。
これをフローチャートにすると下図のように書けます。


簡単なルールのゲームなのでフローチャートもシンプルになりますね。
もしかすると、正式なフローチャートの書き方からは外れているかもしれませんが、Python でコードを書く前段階に書きたい処理を整理する分にはこれで問題ないでしょう。
細かいことを言うと、「1から13までの整数」というルールがあるため、一番初めに先攻が数を言った後は21以上になることはありえませんが、今回はそこはスルーします。
確認環境
本記事に記載していることは次の環境で動作を確認しました。
- Python 3.8.2
- macOS Catalina 10.15.4
21ゲームのコード
フローチャートができたので、あとはコーディングです。
色々な書き方ができそうですが、今回はwhile文を使ってみたいと思います。
import sys
turn_num = 5 # 引き分けになるターン数
min_num = 1 # 入力できる最小の値
max_num = 13 # 入力できる最大の値
game_num = 21 # 負けになる数
turn_now = 1 # 現在のターン数
sum_num = 0 # 入力された値の合計値
def user_input(user):
msg = user + 'の番です。1から13までの整数を1つ入力してください。:'
while True:
input_str = input(msg)
if input_str == 'exit':
print('21ゲームを終了します。')
sys.exit()
try:
input_value = int(input_str)
except ValueError:
print('<エラー>1から13までの整数を1つ入力してください。')
continue
if min_num <= input_value <= max_num:
break
else:
print('<エラー>1から13までの整数を1つ入力してください。')
continue
return input_value
print('21ゲームを開始します。')
print('#-#-#-#-#')
while turn_now <= turn_num:
print(turn_now, 'ターン目です。')
first_input_value = user_input('先攻')
sum_num += first_input_value
if sum_num >= game_num:
print('21を越えました。先攻の負けです。')
sys.exit()
second_input_value = user_input('後攻')
sum_num += second_input_value
if sum_num >= game_num:
print('21を越えました。後攻の負けです。')
sys.exit()
turn_now += 1
print('#-#-#-#-#')
print('5ターンを終えて21を越えなかったので、引き分けです。')
入力された値が1から13までの整数であることのチェックしたかったのと、途中でゲームを終わらせることができるようにしたかったので、入力部分だけ関数にして別で書きましたが、フローチャートの通りに書きました。
数の合計が今どうなっているかは、あえて表示しないようにしました。
試しに1人で遊んでみると、


こんな感じになります。
まとめ
いかがでしたでしょうか?
これだけでは、フローチャートを書く意味は伝わらなかったかもしれません。
21ゲームのような簡単な処理のコードを書く時でも、いきなりコーディングに着手すると、「どうしたらいいんだ?」と詰まったり、凡ミスをしてしまうことはよくあります。
そのため、何かコードを書く時は、遠回りのように思えますが、まずはフローチャートなどで どういう処理にするかを整理する ことをオススメします。
以上です。
コメント