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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1133閲覧

Pythonにおけるwhile文を用いたHIT & BLOWがうごかない原因

kaiura

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/01 13:40

前提・実現したいこと

プログラミング初心者の質問です。初質問ですがよろしくお願いします。
Python3を始めて数日、HIT&BLOWというゲームのプログラミングをやってみました。

流れとして、

(1).答えのリストに0から9までの数を3つ要素として加える。
(2).プレイヤーの答えのリストに0から9まで3回入力
(3).各要素を比較し、同一であれば'HIT'、順番が異なるがリストに含まれているのであれば’BLOW’、含まれていなければ'OUT'とし、その数を出力する。
(4).'HIT'(hit_count)が3つになれば終了。そうでなければ(2)に戻って入力からやり直し。

を考えて作ってみました。
結果としてはwhile文に突入せず、最終行の出力に飛んでしまう状況です。

何が原因か教えていただけますでしょうか。

また、inputを0~9の整数のみに制限し、それ以外であればやり直しを求める動作にはif文とwhile文で行うしかないのでしょうか?
それとも、何か簡単に行えるモジュール?があるのでしょうか?

回答をよろしくお願いいたします。

該当のソースコード

import random answers = [random.sample(range(0, 9), 3)] answers_len = len(answers) while hit_count == 3: players_answers = [] for player_input in range(answers_len): players_answers = input('プレイヤーが入力') hit_count = 0 blow_count = 0 out_count = 0 for i in range(answers_len): if answers[i] == players_answers[i]: hit_count += 1 elif players_answers[i] in answers: blow_count += 1 else: out_count += 1 print(hit_count, 'HIT!', blow_count, 'BLOW!', out_count, 'OUT!') print('You won')
Python3

試したこと

while文の中身は正常に作動しました。
hit_count = 0 をwhile文の前においても結果は変わりませんでした。

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

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

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

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

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

guest

回答2

0

ベストアンサー

以前作ったコードが残っていましたのでご参考までに。
※入力するの面倒なので自動入力させてます。

Python3

1import sys 2print(sys.version) 3import random 4 5 6class NumbersGame(): 7 8 def __init__(self, n): 9 self.ans = self._get_rnd(n) 10 11 def get_ans(self): 12 return self.ans 13 14 def _get_rnd(self, n): 15 dec = [i for i in range(1, 10)] 16 r = 0 17 for i in range(n): 18 x = random.choice(dec) 19 r += 10 ** (i + 1) * x 20 dec.remove(x) 21 return int(r / 10) 22 23 def game(self, x): 24 result = '' 25 if self.ans == x: 26 result = 'Hit:' + str(self.ans) 27 else: 28 hit = 0 29 blow = 0 30 x = str(x) 31 a = str(self.ans) 32 for i, c in enumerate(x): 33 if a.find(c) == i: 34 hit += 1 35 else: 36 blow += a.count(c) 37 result = str(hit) + 'hit ' + str(blow) + 'blow' 38 return result 39 40 41g = NumbersGame(4) 42for i in range(1000, 10000): 43 x = g.game(i) 44 print(g.get_ans(), i, x) 45 if 'Hit' in x: 46 break;

投稿2018/10/01 14:11

opyon

総合スコア1009

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

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

kaiura

2018/10/01 23:01

ありがとうございます。 動かして仕組みを考え直して見ます。
guest

0

whileの条件部は『処理を継続する条件』なので、while hit_count != 3:では?

投稿2018/10/01 13:44

LouiS0616

総合スコア35660

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

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

kaiura

2018/10/01 13:50 編集

ありがとうございます。 初歩的な勘違いをしていました。 while文の中身も意図と違う動きをしましたので、やり直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問