数当てゲーム

PCが生成した一つの値を上か下かのヒントを頼りに当てるゲームだ。
生成される数値は1~100の範囲でランダム。5回以内に当てられないと失敗となる。

まずは、実行例から見てみよう。

成功例

1~100の数字の中から一つ選んだよ。
その数字を 5 回以内に当ててね。
1 回目、いくつかな?
32
もっと下だよ
2 回目、いくつかな?
16
もっと下だよ
3 回目、いくつかな?
8
もっと上だよ
4 回目、いくつかな?
12
当たり!!

失敗例

1~100の数字の中から一つ選んだよ。
その数字を 5 回以内に当ててね。
1 回目、いくつかな?
52
もっと上だよ
2 回目、いくつかな?
74
もっと上だよ
3 回目、いくつかな?
86
もっと下だよ
4 回目、いくつかな?
80
もっと上だよ
5 回目、いくつかな?
83
残念~正解は 84 でした。

乱数

ゲーム作りなどでは乱数はかかせない。
まずはPythonでの乱数の生成方法を見てみよう。

import random

num = random.randint(5,10)

まずはrandomモジュールをimportする。
このようにimportして機能を追加していくことができる。
今回はrandomモジュールをインポートして乱数を生成できるようにした。


num = random.randint(5,10)

インポートしたrandomモジュールにあるrandint()命令を使うには.(ドット)で連結する。
引数に5,10と渡せば5以上10以下の整数を一つ生成する。
今回は1~100の値をひとつ生成したいので


num = random.randint(1,100)

としてあげれば良さそうだ。

作成

それではさっそくコーディングしていこう。

import random

ans=random.randint(1,100)
max_count=5
print('1~100の数字の中から一つ選んだよ。')
print('その数字を',max_count,'回以内に当ててね。')

変数ansに正解の数を格納している。
5回という部分は直接コーディングしてしまってもよいが、今回は変数にした。
こうしておくと、もし7回とかに変更したい時に変更箇所が1箇所ですむ。こういった工夫は大事だ。

ここまではOK。さて続きをどうするか・・・
あきらかに繰り返し処理を行っているのでforかwhileが必要そうだ。

まわす最大回数がわかっているので今回はfor文でいこう。

import random

ans=random.randint(1,100)
max_count=5
print('1~100の数字の中から一つ選んだよ。')
print('その数字を',max_count,'回以内に当ててね。')

for i in range(1,max_count+1):

1,2,3,4,5と取り出したいのでrange(1,max_count+1)となる。
(ここがわからない人は前回を参照)
これで5回まわるループはできた。
スイートの部分をどうするか。
まずは実行例に合わせて文言を出力し、ユーザーから答えを受け取ろう。

import random

ans=random.randint(1,100)
max_count=5
print('1~100の数字の中から一つ選んだよ。')
print('その数字を',max_count,'回以内に当ててね。')

for i in range(1,max_count+1):
    print(i,'回目、いくつかな?')
    num=int(input())

これでユーザーの答えが変数numに入った。
正解かどうかを判定していこう。

import random

ans=random.randint(1,100)
max_count=5
print('1~100の数字の中から一つ選んだよ。')
print('その数字を',max_count,'回以内に当ててね。')

for i in range(1,max_count+1):
    print(i,'回目、いくつかな?')
    num=int(input())
    if num==ans:
        print('当たり!!')
        break
    elif num > ans:
        print('もっと下だよ')
    else:
        print('もっと上だよ')

numとansが等しい時が当たりだ。
当たりと出力し、もうこれ以上ループ処理が必要ないのでbreakを使ってループを抜ける。
このようにwhileやfor文の中でbreakを使うとループの途中であってもループ処理を抜けることができる。

当たりでなかったということは、もっと上かもっと下のどちらかだ。elifとelseを使って場合分けする。

実はこれでほとんど終了だが、5回で当てられなかった時の処理を入れていこう。

import random

ans=random.randint(1,100)
max_count=5
print('1~100の数字の中から一つ選んだよ。')
print('その数字を',max_count,'回以内に当ててね。')

for i in range(1,max_count+1):
    print(i,'回目、いくつかな?')
    num=int(input())
    if num==ans:
        print('当たり!!')
        break
    elif num > ans:
        print('もっと下だよ')
    else:
        print('もっと上だよ')
else:
    print('残念~正解は',ans,'でした。')

for ~ else

失敗はどういうときだろう?。5回やっても当てられなかった時。つまりこのfor文がbreakすることなしに5回まわりきった時が失敗だ。

Pythonではこのbreakすることなしにループがまわりきった時の処理をelseに書くことができる。
今回はそれを使って失敗時の出力をしている。

pass

これで完成と言ってもいいのだがほんの少しだけ気に入らない挙動がある。それは5回目が失敗した時の出力だ。

5 回目、いくつかな?
83
もっと上だよ
残念~正解は 84 でした。

次の行で正解を言うのに、この
もっと上だよ
というヒントは必要だろうか?
否!最後はヒントが出ないようにしよう。

import random

ans=random.randint(1,100)
max_count=5
print('1~100の数字の中から一つ選んだよ。')
print('その数字を',max_count,'回以内に当ててね。')

for i in range(1,max_count+1):
    print(i,'回目、いくつかな?')
    num=int(input())
    if num==ans:
        print('当たり!!')
        break
    elif i==max_count:
        pass
    elif num > ans:
        print('もっと下だよ')
    else:
        print('もっと上だよ')
else:
    print('残念~正解は',ans,'でした。')

if文で当たりかどうか判定した後に

elif i==max_count:
  pass

この分岐を追加した。
こうすることで、当たりではなく、もしそれが最後の回だったらここを通らせることができる。
けど、とくにやりたい処理はない。
こう言う場合には
pass
と書くことができる。
passは何もしない文であり、文法上なにかを書く必要があるが何も実行することがないときに使う。

これで5回目に当てられなかった場合
ヒントを表示することなく、残念〜に推移するようになった。

これで完成だ。もし1回で当てた時には演出を加えるなど工夫してみるのもいいだろう。