ヒット&ブローゲーム
ランダムな数の生成
#ランダムな数値を生成
#coding=utf-8
import random
a=[ random.randint(0,9),
random.randint(0,9),
random.randint(0,9),
random.randint(0,9)]
#答えの確認
print(str(a[0]) + str(a[1]) + str(a[2]) + str(a[3]))
ここで4個0から9までの整数を作る
数値を入力させる
#数値の判定と訂正のループ
isok = False
while isok ==False:
b= input("数を入れてね>")
if len(b) !=4:
print("4桁の数字を入れてね") #ここで仮に4桁以外の数字を入れると、if文の中身が終了した後に実行できる文はwhileのなかにはないので、
#上位のwhile文はまだ真になっていないから、while文の中を繰り返す。
else:
kazuok=True
for i in range(4):
if (b[i]<"0") or (b[i]>"9"): #もしすべての桁が数字であったなら、if文は判定だけ行った後、中身は実行されないので,次のif文に進む
print("数字ではありません")
kazuok=False
break
if kazuok : #if Trueとかif Falseと言っているのと同じ
isok=True
入力された文字が4桁の数字になるまでループさせる。
kazuokがTrueなら、isokにTrueが代入される。
isokがFalseで無くなった時、while文から抜け出す。
ヒットとブローのカウント
hit = 0 #初期化
for i in range(4):
if a[i] == int(b[i]):
hit = hit + 1
blow = 0 #初期化
for j in range(4): #b[0]からb[3]まで
for i in range(4): #bのそれぞれの要素とa[0]からa[3]までを比較
if (int(b[j]) == a[i]) and (a[i] != int(b[i])) and (a[j] != int(b[j])):
blow = blow + 1
break #breakすると、jの数が一つ進み、for j に戻り、b[j]がb[3]まで終了するとfor文を抜け出す
blowにおけるfor文は2段階構成になっている。
ミスとして、a[i],b[j]の、iとjを間違いがち。
なぜblowのカウント中にあるif文に条件が3つ必要とされているのかは要検証
ヒットとブローの表示
print("ヒット数は" + str(hit)) #hitとblowの文字列変換を行ってから出力
print("ブロー数は" + str(blow))
hitとblowは数値であり、文字列に変換しないと連ねて表示できないので注意
結果の表示
if hit == 4:
print("正解.")
break #hitが4のときのみbreakが実行され、最上位のwhile文から脱出する
正解だった時、つまりヒット数が4となったときのみ実行される。これによってプレイヤーへの入力の要求は終わる。
まとめ
pythonのコードを書く上で、インデントは非常に重要であり、またスペースは誤りを生むので最小限にしたほうがよい。
また、変数名であるa,b,i,jなども間違いやすいので気を付けた方が良い。
コーディングの表記や文法で分からないところがあったら、何度か検証を行ったり考えたりすることで理由を明らかにし、
プログラムにコメントとして分かりやすく書いておくと良いと思った。