40代塾講師の「ほぼ独学プログラミング日誌。」18

記事
学び
『プログラミングで切り開く、新しい未来♪』

こんにちは!
塾講師のdainarです。

いよいよ今日から始まりました!
公立高校の後期選抜試験。

「緊張するのは自信があるから。」

「良い結果を残そうと思うから。

なので”緊張している”自分に自信を持って問題に取り組んでください。

目次 
1. ヒットの判定をしよう!
2. ブローを判定しよう!
3. 重複した判定を除く

ヒットの判定をしよう!

さて、前回までのプログラムで変数aには4桁のランダムな数字が、変数bにはユーザーが入力した4桁の数字が入力されるというところまで完成しましたね。
今回は両者を比べて、ヒットかブローかを判定・表示できるようにしていきます。

まずはヒットの部分から判定を行います。
ヒットは「位置も数も一緒」ということでしたね?
これは変数aと変数bを”0〜3まで4つの要素に対して、それぞれ比較していく”という形になります。(下記ブログラムを参照)

hit&blow1.png

ここまで学習を共にしてきた皆さんならお気づきと思いますが・・・
if以下の文が同じような内容で「4回も」くり返されていますね?
そう!
これはfor構文でも書くことができるんです。
※ちなみに「hit = 0」はヒットした数を数える変数になっています。

hit = 0
for i in range( 4 ) :
if a[ i ] == int( b[ i ] ) :
hit = hit + 1

a[ i ]にはコンピューターが0〜9の間でランダムに選んだ4桁の数字(例 3729) が順番に3→72→9と入り、b[ i ]には人間が入力した数字(例 5728)が同じく5→72→8と入ります。(「==」で左右の値が等しいか判定)
今回は「7」「2」が2つヒットしたのでループ終了後、「hit = 2」となります。

ブローを判定しよう!

次にブローを判定してみましょう。
ブローは「位置は正しくないが、その数字が含まれている」ということでした。
これを判定するには、変数bの各桁の値が変数aの各桁の値と合致するかを確かめる作業となります。

ここで具体的にコンピューターが考えた値(変数a)を「3136」、ユーザーが入力した値(変数b)を「3827」としてみましょう。

blow = 0
for i in range( 4 ) :
if int( b[ 0 ] ) == a[ i ] ) : ——①
blow = blow + 1
break

というプログラムにおいて①の部分では”b[0]がa[0]、a[1]、a[2]、a[3]と合致するかをループで順に調べています”(「3」と「3」、「1」、「3」、「6」)
ブローだと分かったときにbreakして、そこで判定をやめているのは、ブローを重複して数えないためです!
(breakしないと2回目の「3」もブローとしてカウントしてしまう!)

重複した判定を除く

完成までもう少し・・・がんばりましょう!
さて、ヒット&ブローの判定はおおむねOKなのですが1つ「ブローかつヒット」の場合があることを考えなければなりません。

例えばユーザーが入力した値が「6246」だとします。
このとき、b[0]の「6」はa[3]の「6」に合致するのでブローと思いきやa[3]はb[3]にも合致しているので「ヒット」です。
このままだと、ヒットとブローを重複して数えてしまうので除外する必要があります!

そこで、これを除外するためブロー判定のifの条件を次のように変更します。

if ( int( b[ 0 ] ) == a[ i ] ) and ( a[ i ] ! = int( b[ i ] ) ) and ( a[ 0 ] ! = int( b[ 0 ] ) ) :

and 〜が除外する条件となっています。

以下、くり返しで

hit&blow2.png

というプログラムになり、これも長すぎるのでfor構文を使って

hit&blow3.png

というように書き換えています。少し複雑ですね?

for j in range( 4 ) : ——②
for i in range( 4 ) : ——①

の部分では
①で ”「0、1、2、3とユーザーの入力欄の突き合わせ」を、②でそれを4回ループする”という意味です。

さて、ヒットの処理とブローの判定処理が分かりました。
【ヒット&ブロー】ゲームでは、ヒットが4になるまでくり返す、つまり「hit = 4」になったときが「当たり!」になります。


こちらが実際のプログラム

hit&blow4.png

今までに比べてかなり長く、複雑になりましたね💧 お疲れさまでした〜

なお、ここでは動作確認のため、コンピューターが選んだ値(答え)を先に表示するようにしています。
動作確認が終わったら、答えを表示しないようにしてゲームを楽しみましょう♪
※ コメントアウト覚えていますか?・・・ヒント「#」

それでは、また!次回。

※参考図書=『いちばんやさしいPython入門教室』大澤文孝(著) ソーテック社


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す