質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1350閲覧

python ヒット&ブロー たくさん出てくる

ChainsawMeat

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/13 21:00

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
pythonで数当てゲーム、ヒット&ブローを作っています。
結果を出力したいのですが、なぜか同じ結果が必要以上に出てしまいます。
原因が分からないので、教えて欲しいです。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0
ヒット3
ブロー0

該当のソースコード

#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])) isok=False while isok == False: b=input("数を入れてね") if len(b) !=4: print("4桁の数を入力してください") else: kazuok=True for i in range(4): if (b[i]<"0")or(b[i]>"9"): print("数ではありません") kazuok=False break if kazuok: isok=True print(b[0]) print(b[1]) print(b[2]) print(b[3]) hit=0 for i in range(4): if a[i] == int(b[i]): hit=hit+1 blow=0 for j in range(4): for i in range(4): if(int(b[j])==a[i])and(a[i]!=int(b[i]))and(a[j]!=int(b[j])): blow=blow+1 break print("ヒット"+str(hit)) print("ブロー"+str(blow)) if hit==4: print("当たり!") break

試したこと

googleで調べた
なぜこうなるのかを考えた

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2021/09/13 22:53

ヒット&ブローのルールでは、4桁の数字が全部違ってないといけませんよね。
ChainsawMeat

2021/09/14 21:50

ご心配ありがとうございます できる限り勉強してきました
BeatStar

2021/09/18 13:45

まずは『問題文を定義せよ』ですね。 普通、Hit&Blowと言えば伝わりますが、いわゆる『ローカルルール』のような感じで独特の定義があるときがあるので。
guest

回答2

0

ベストアンサー

blow=0 の下にあるループ処理の中に結果を表示する処理が入っているのが原因です。
このため、blowの状態を確認するたびに結果の文字列が表示されてしまっているのです。

結果の表示は、hit数のカウント、blow数のカウントの処理が両方終った後に入れましょう。

投稿2021/09/14 01:55

TakaiY

総合スコア13790

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ChainsawMeat

2021/09/17 22:11 編集

両方、breakを使って終わらせようとしてみましたが 終わらず、また同じ様な結果になってしまいます カウントの処理を両方終わらせるには、どうすればいいでしょうか?
TakaiY

2021/09/18 12:58

breakを使って終らせるのでまありません。 質問にも「インデントについて勉強しなさい」とありますが、インデント=制御の範囲の設定がおかしいのです。 print("ヒット"+str(hit)) print("ブロー"+str(blow)) の処理が上のループの中に入っているのが問題=インデントが適切でない ので、そこを直しましょう。
ChainsawMeat

2021/09/20 06:16

ありがとうございます。 インデントを調節したら、ちゃんと作動しました!
guest

0

答え自体はほぼ他の方の回答です。そのフォロー的なものとして書いておきます。
質問者さんがつまづいている本質的な部分がわかったので。
(そのため、その方の回答を読んでなんとなくわかったので、この回答をBAに選ぶぐらいならその方の回答をBAにしてください)

とりあえず、ご自分のコードを読んでください。

コードを読むコツは、一行レベルで読み、その行が何をしているかを考えながら読むです。

ただし、Pythonはインデントがものをいう言語です

Pythonはインデントの数でブロックを表します。
日本語の文章で表現すると『段落』のようなものでしょうか。

たとえば、

Python

1for i in range( 0, 3 ): 2 print( “Hello” ) 3print ( “Python!” )

はどうなるでしょうか。

結果はHelloを3回繰り返して、最後に一回だけPython! と表示されるはずです。

Hello の方のインデントとPyhton!の方のインデントの数が違うので、
for文の処理はHelloを表示する一行だけになります。

こういうふうにインデントの数で意味が変わってきます。
それを他の人たちが指摘しているのです。

で、話を戻して、ご自分のコードを読んでみてください。

今回問題となっている部分だけを抽出してみましょう。

Python

1# 4回くりかえし、変数jに整数を入れる 2for j in range(4): 3 # 4回繰り返し、変数iに整数を入れる 4 for i in range(4): 5 # 条件に一致すれば 6 if(int(b[j])==a[i])and(a[i]!=int(b[i]))and(a[j]!=int(b[j])): 7 # blowを+1する 8 blow=blow+1 9 # 内側のループから抜ける 10 break 11 12 # ヒット数等を表示 13 print("ヒット"+str(hit)) 14 print("ブロー"+str(blow)) 15 16 # ヒットが4なら 17 if hit==4: 18 # 「当たり!」と表示 19 print("当たり!") 20 # 外側のループからも抜ける 21 break

これを擬似コードというものとして切り出しましょう。
日本語でも英語でもなんでもいいので、自分が読み書きできる言語で書き下しましょう。

1. 以下を4回繰り返す 1.1. 以下を4回繰り返す 1.1.1. 条件に一致すれば 1.1.1.1. Blowを+1する 1.1.1.2. 強制的に(1.1)に移動 1.1.2. ヒット数などを表示 1.1.3. ヒット回数が4回なら 1.1.3.1. 「当たり!」と表示 1.1.3.2. 強制的に(1)に移動

という感じでしょうか。

(1.1.1)で条件に一致した場合は強制的に(1.1)に移動しますが、条件に一致しない場合はそのまま(1.1.2)に行ってしまいます。

そうなると、条件(ブローの条件)を満たさないと、「ヒット○回」とかみたいな表示をされます。

では、どうすればいいでしょうか。

あとは仕様によるので、ここまでとします。(追記されたら続きを書くかもしれませんが)

投稿2021/09/18 14:30

BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問