数当てゲームを作ってみよう

 ここまでで、プログラミングする際の一番基本となる部分の説明が終了です。そこで一旦、『数当てゲーム』というものを作って復習したいと思います。

 乱数を発生させる

 先に復習って書いておきながら、いきなり新しいを説明します。済みません。本当は.Net Frameworkの内容でフライングなのですが、使ってみましょう。

# coding: shift-jis

from System import *
rnd = Random()
answer = rnd.Next(100) + 1
print answer

raw_input()

出力画面:
 16
 始めの上の"from System import *"は.Net Frameworkを使うための準備です。"Random()"はNet Frameworkのコマンドの一つで、乱数発生オブジェクトを生成します。わかりやすく言うと.NetFramework中のRandom()を使って、乱数発生機:rndを作成しました。rndの使い方は"rnd.Next(100)"というメゾットを実行すると0〜99の数字を適当に発生させます。したがって、変数answerは1〜100のどれかの数字になります。
 これ当てるゲームを作ります。

 入力部分を作る。

 先のコードにユーザーが答えを入力する部分を加えます。

# coding: shift-jis

from System import *
rnd = Random()
answer = rnd.Next(100) + 1
print answer

moji = raw_input()
number = int(moji)

if number == answer :
  print "当たり!!"
else :
  print "はずれ"

raw_input()

出力画面:
 43
 43
 当たり!!
出力画面:
 80
 43
 はずれ
 初めに出てくる数字が答えです。答えと同じ数字を入力して当たりと判断できるか、違った数字を入力してはずれ判断できるかの確認です。
 入力を扱うコードをみるといつも使っているraw_input()があります。
このコマンドはユーザーがEnterキーを押すまでに入力した文字を覚えていて、mojiに渡しています。mojiという名前にしたのはデータの型が文字列だからです。
 文字列mojiを数値であるanswerと合っているか比べることができないため、int()を使って数値に変換します。そしてanswerとnumberが同じならば、当たり。そうでなければ、はずれと表示しています。

 では次、第6感が働かなければ、100あるうちの1つなんて当てることは不可能です。なので、ヒントを出しながら、何回目で当たるか数えてみましょう。

# coding: shift-jis

from System import *
rnd = Random()
answer = rnd.Next(100) + 1
print answer

count = 0 #答えた回数を数える変数の初期化
number = 0

while number <> answer :
  moji = raw_input()
  number = int(moji)
  
  count += 1 #答えた数を増やしていきます
  
  if number > answer :
    print "大き過ぎます。"
  elif number < answwer :
    print "小さ過ぎます。"

print str(count)+"回目で正解しました。"
raw_input()

 あれ?なぜか動きません。こういう時は新しく入力した部分の行頭に"#"をつけてコメントにしてしまいます。例えばこんな感じ、

# coding: shift-jis

from System import *
rnd = Random()
answer = rnd.Next(100) + 1
print answer

count = 0 #答えた回数を数える変数の初期化
number = 0

#while number <> answer :
#  moji = raw_input()
#  number = int(moji)
#  
#  count += 1 #答えた数を増やしていきます
#  
#  if number > answer :
#    print "大き過ぎます。"
#  elif number < answwer :
#    print "小さ過ぎます。"

print str(count)+"回目で正解しました。"
raw_input()

出力画面:
 56
 0回目で正解しました。

 今度は一応動きました。ということは今回コメントにした部分のどこかが悪いわけです。次は#をつけた部分を半分にします。

# coding: shift-jis

from System import *
rnd = Random()
answer = rnd.Next(100) + 1
print answer

count = 0 #答えた回数を数える変数の初期化
number = 0

while number <> answer :
  moji = raw_input()
  number = int(moji)
  
  count += 1 #答えた数を増やしていきます
  
#  if number > answer :
#    print "大き過ぎます。"
#  elif number < answwer :
#    print "小さ過ぎます。"

print str(count)+"回目で正解しました。"
raw_input()

出力画面:
 72
 70
 76
 72
 3回目で正解しました。

 今度もうまくいきました。ということは残りの4行のどこかに間違いがあります。
よくみると"elif number <"の後の answwerはanswerですね。直すとちゃんと動きました。このようにプログラミングでは間違い探しをする技術も、重要な技術の一つになります。

出力画面:
 23
 20
 小さ過ぎます。
 25
 大き過ぎます。
 23
 3回目で正解しました。

更に応用させていきます

では正解したとき、もう少し面白いコメントにしてみましょう。

# coding: shift-jis

from System import *
rnd = Random()
answer = rnd.Next(100) + 1
print answer

count = 0 #答えた回数を数える変数の初期化
number = 0

while number <> answer :
  moji = raw_input()
  number = int(moji)
  
  count += 1 #答えた数を増やしていきます
  
  if number > answer :
    print "大き過ぎます。"
  elif number < answwer :
    print "小さ過ぎます。"

print str(count)+"回目で正解しました。"
if count == 1 :
  print "すげー!もしかして超能力者?"
elif count == 2 :
  print "大当たり!て・・・天才です。"
elif count == 3 :
  print "大当たり!秀才かも・・・。"
elif (count == 4 | count == 5) :
  print "当たり!運がよかったかな?"
elif count == 6 :
  print "当たり!普通だなあ"
elif count == 7 :
  print "まあこんな日もあるよ"
elif count > 7 :
  print "もうちょっと頭を使いましょう"

raw_input()

出力画面:
 45
 45
 1回目で正解しました。
 すげー!もしかして超能力者?

 ほぼ完成に近づきましたが、ここでユーザーが入力ミスをして、数字を入力するところを"abc"なんて入力したら、どうなるでしょう。プログラムは途中で止まってしまいますね。入力を失敗した人が悪いということもできますが、プログラムが途中で止まってしまうほど、ユーザーがきょうざめしてしまうことはありません。折角、例外処理を知っているのですから試してみましょう。

# coding: shift-jis

from System import *
rnd = Random()
answer = rnd.Next(100) + 1
print answer

count = 0
number = 0

while number <> answer :
  moji = raw_input()
  try :
    number = int(moji)
  except :
    print "数字を入力してください。"
    continue
  else :
    count += 1

  if number > answer :
    print "大き過ぎます。"
  elif number < answer :
    print "小さ過ぎます。"

print str(count)+"回目で正解しました。"
if count == 1 :
  print "すげー!もしかして超能力者?"
elif count == 2 :
  print "大当たり!て・・・天才です。"
elif count == 3 :
  print "大当たり!秀才かも・・・。"
elif (count == 4 | count == 5) :
  print "当たり!運がよかったかな?"
elif count == 6 :
  print "当たり!普通だなあ"
elif count == 7 :
  print "まあこんな日もあるよ"
elif count > 7 :
  print "もうちょっと頭を使いましょう"

raw_input()

出力画面:
 4
 abc
 数字を入力してください。
 4
 1回目で正解しました。
 すげー!もしかして超能力者?

 最後に、最初から答えがみえていたのではゲームにならないので、答えを隠して設問みたいにして完成です。

# coding: shift-jis

from System import *
rnd = Random()
answer = rnd.Next(100) + 1
# print answer
print "1-100の中で1つ数字を考えました。"

count = 0
number = 0

while number <> answer :
  print "さていくつでしょう。",
  moji = raw_input()
  try :
    number = int(moji)
  except :
    print "数字を入力してください。"
    continue
  else :
    count += 1

  if number > answer :
    print "大き過ぎます。"
  elif number < answer :
    print "小さ過ぎます。"

print str(count)+"回目で正解しました。"
if count == 1 :
  print "すげー!もしかして超能力者?"
elif count == 2 :
  print "大当たり!て・・・天才です。"
elif count == 3 :
  print "大当たり!秀才かも・・・。"
elif (count == 4 | count == 5) :
  print "当たり!運がよかったかな?"
elif count == 6 :
  print "当たり!普通だなあ"
elif count == 7 :
  print "まあこんな日もあるよ"
elif count > 7 :
  print "もうちょっと頭を使いましょう"

raw_input()