【python超初級】python初心者が数当てゲーム作ってみるよ【その1】
今さらながらpythonの勉強を始めました。他の言語を少しばかり触ったことはあるのですが、
pythonを扱うのは初めてなので、練習がてら簡単な数当てゲームを作成してみます。
4桁の異なる数値をランダムに生成して一致するまでに何ターンかかったかを競う有名なゲームです。
正式な名前は「ヒットアンドブロー」とか「マスターマインド」っていうみたいですね。(知らなかった。笑)
ルールは、
・重複のない4桁の数字(0~9)を当てる
・回答すると、その都度、ヒットとブローの数が出る
・ヒットは数字も桁の場所も同じ。ブローは数字はあたっているけど桁の場所が違う
・なるべく回数で答えたほうが良い
という感じです。
コマンドライン上で実行できるシンプルな造りにします。
(というか筆者がレベル的にまだそれしかできないです…)
なお、if文やfor文などの構文の解説は省きます。
それではスタート!!
※注 筆者はpython3.6.1をインストールしています。
【STEP1】答えとなる数値の異なるランダムな4桁の数値を生成する
まずはじめに答えとなる4桁の数値をランダムに生成しておきます。
4桁の数値はそれぞれ異なる数字になるようにしたいと思います。
(そうしないと後々正解の判定が複雑になっていろいろ詰む気がするので。)
「python ランダムな数値」とかでググると、ランダムな数値を求める方法random()関数
というものがあるみたいです。こいつを使ってやればイケますね。
ただし、このrandom()関数を用いるには、randomモジュールをインポートする必要があるみたいです。
randomモジュールの関数にはrandom()、uniform()、randint()などなど、
いろいろな関数が用意されているみたいですが、今回は0~9までの整数値を4つ生成するようにするので、
randint()関数を用いるのがよさそうです。
randint()関数では引数に2つの値を指定し、その間のInt型の(整数型の)値を返してくれます。
今回は0から9までの数値を生成したいので、以下のように記述して画面上に出力してみます。
#randomモジュールをインポートする。これをしないとrandom関数使えない import random #ランダムな4桁の数値を生成する。 print(random.randint(0, 9))
モジュール名.関数名という記述方法ですね。
これで「randomモジュールに定義されているrandint関数を実行するよ」
という動作をしてくれます。
コンソール画面上に何か表示したい場合はprint()関数を用います。5行目のように書くことで
0から9までのランダムな数値を画面上に出力できます。
さて、これを4回繰り返せば4つの数値を生成することができます。その値を配列(pythonではリスト
って呼ぶ方が多いかも)を格納していきたいと思います。繰り返し文のfor文を使ってあげます。
import random #randomモジュールをインポートする。これをしないとrandom関数使えない answer_num_ary = [] for i in range(0,4): #ランダムな4桁の数値を生成し、それを配列answer_num_aryに追加する。 answer_num_ary.append(random.randint(0, 9)) print(answer_num_ary)
これで4つの数字を求めることができますが、一つ問題があります。
それは、「求めた数値が重複する可能性がある」ということです。
最初に求められたランダムな数値が「8」だったとして、2回目に求められる数値もランダムな
ため「8」が生成される可能性もありますね。今回は重複が無いようにしたいので、
このままではマズイです。
このコードに重複判定も加えてあげましょう。4つのランダムな数値が生成されるまで繰り返す
ので、ここではwhile文を使ってあげます。
import random #randomモジュールをインポートする。これをしないとrandom関数使えない answer_num_ary = [] while len(answer_num_ary) < 4: #ランダムな4桁の数値を生成し、answer_num_aryに同じ値があれば #追加しない。同じ値が無ければanswer_num_aryに追加する。 random_num = random.randint(0, 9) append_flg = True #answer_num_aryに追加するかのどうかのフラグ。Trueならば追加しFalseなら追加しない for ary_element in answer_num_ary: if ary_element == random_num: append_flg = False #すでに同じ値があるならappend_flgをFalseにする break if append_flg == True: answer_num_ary.append(random_num) append_flg = True print(answer_num_ary)
5行目でwhile文を使っています。answer_num_aryの中に4つの値が格納されるまで繰り返し処理を行います。
8行目でランダムな値を生成しています。
11行目から14行目でfor文を使い、配列の中の要素と生成したランダムな値を比較し、同じ値があった場合は
追加するかどうかのフラグ(append_flg)をFalseにしています。その場合は値の重複が発生しているため
answer_num_aryには追加されません。重複が無かった時だけappend_flgがTrueとなるので、
15行目、16行目の条件分岐文により追加されます。
19行目で最後にprint関数を使ってanswer_num_aryリストを表示しています。ちゃんと異なる4つの値が
格納されているかどうかを確認するために表示しているだけですので、何度か実行して確認できたら
消してしまってOKです。
さて、これで答えとなる4桁の値を求めることができました。今回はこれで終わりにします。
次回は実際に自分で数字を入力して、その入力した値が4桁の重複がない数値なのかのチェックを
行いたいと思います。