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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

Q&A

解決済

3回答

3588閲覧

Pythonで「数あてゲーム」の逆(コンピュータが数をあてる)のゲームの作り方

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

1グッド

2クリップ

投稿2020/06/19 03:09

PythonでFigure Gussing gameという、パイソンがランダムに決めた数字をあてるゲームがあります。
1~100までで50といれると「高すぎる」20といれると「低すぎる」といったかたちで正解にたどりつくと終わるといった感じのものです。
今回、その逆を作らなくてはなりません。要は人間が正解の数字をきめて、コンピュータが当てることになります。
決まりごとは以下のとおりです。

  • コンピュータは乱数を使わない
  • 人間は数字を入力しない。(YesならY、高すぎならhを入力するという形です)
  • コンピュータからなにか返ってくると人間がなんらか入力する
  • ランダムライブラリからはなにもインポートしない

といったことになります。
パイソンの数字をあてるゲームとは全くちがうので、今あるコードを一部改良という問題ではないようです。
初心者レベルで習っているコードだけでこれをどうやればいいのか、まったく見当がつかず困っています。
何回かやって平均をとるなどの部分ははしおっても構わないと思うので、こちらが想定した数字に対し、コンピュータが答える部分は何をどうつかってやり取りすればよいのか、どなたかご教示ください!
参考までにPythonの決めた数をあてるゲームのコードは以下のとおりです。
ここまでしなくてもこの逆のようなものを作成しなくてはなりません。
よろしくお願いします。

from random import randrange def getGuess(low, high): while True: n = input("Please enter your guess. ") num = eval(n) if low<= num <= high: return num print("Your guess must be between",low,"and",high) def playOnce(low, high): countGuesses = 0 print("I will choose a number between",low,"and",high) print("You will try to guess it.") hidden = randrange(low,high+ 1) while True: guess = getGuess(low, high) countGuesses += 1 if guess == hidden: print("That's it! You got it in",countGuesses,"tries.") return countGuesses if guess < hidden: print("Too low.") else: print("Too high.") def playGuessingGame(low,high): totalGuesses = 0 ## accumulator gameCount = 0 ## counter while True: print("Let's play a guessing game") totalGuesses += playOnce(low, high) gameCount += 1 again = input("Do you want to play again? Enter y for yes, n for no. ") if again != 'y': averageGuesses = totalGuesses / gameCount print("You averaged", averageGuesses,"guesses per game.") break playGuessingGame(1,100)ード
DrqYuto👍を押しています

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

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

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

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

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

tiitoi

2020/06/19 03:30

予測値 < 正解 の場合はなにを入力するのでしょうか?
退会済みユーザー

退会済みユーザー

2020/06/19 03:35

lowのlを入力するということになると思います。 よろしくお願いします
fana

2020/06/19 04:04

人間が嘘をつく(あるいは,入力を誤る)場合への対処はどうするのでしょう?
退会済みユーザー

退会済みユーザー

2020/06/19 04:38

あまり複雑にするのは難しいので、それはない前提で今回はいいと考えています
guest

回答3

0

ベストアンサー

先にどのようなアルゴリズムで解くか調査して、紙でいいので、ロジックを考えましょう。
コードを書き始めるのはそれからです。

アルゴリズムを勉強するなら二分探索から始めよう! 『なっとく!アルゴリズム』より (2/2):CodeZine(コードジン)

python

1lower, upper = 0, 100 2num = int(input("数字を入力してください")) 3assert lower <= num <= upper, f"[{lower}, {upper}] の範囲の整数を入力してください" 4 5while True: 6 pred = (lower + upper) // 2 7 ret = input(f"正解は{pred}ですか? y: はい, l: {pred}より小さい h: {pred}より大きい").lower() 8 assert ret in ["y", "l", "h"] 9 10 if ret == "y": 11 break 12 elif ret == "l": 13 upper = pred 14 else: 15 lower = pred

投稿2020/06/19 05:17

tiitoi

総合スコア21956

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

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

退会済みユーザー

退会済みユーザー

2020/06/19 05:30

ありがとうございます。 なんとなくどうやって動くようにすればいいのかの感じはつかめた気がします。 ここでは最初にたとえば40をいれても正解は50ですか?ときいてくるので、ここに入力した値が入るようにして、これより大きいか小さいか正解かを聞くようにすればいいのだろうとは思います。 ループの中で数字入力をすればいいのですよね?
tiitoi

2020/06/19 05:33 編集

最初にどこからスタートしても問答を繰り返していけば、いずれ答えにたどり着きます。 なので、上のコードだと最初が50スタートですが、別に0~100のどれから始めても問題ありません。 > ループの中で数字入力をすればいいのですよね? ループの中ではあってるか、推測した値より大きいか、または小さいかの3択を答えます
退会済みユーザー

退会済みユーザー

2020/06/27 07:56

模範解答によるとやはり二分探索をつかってやっていました。 今回は自身では時間切れになってしまったのですが、今後の参考にさせていただきます。 遅くなりましたがありがとうございました。
guest

0

愚直なアルゴリズムですが

初期値:high=100, low=0 while True:  コンピュータの推測値guess=int((high+low)/2)  print(guess)  #表示されたguessとユーザーがあらかじめ用意していた答えの数値を、*ユーザーが頭の中で正しく比較評価した上で、下記h, l ,sのいずれかを正直に入力する*。(一応h, l, s以外の文字が入力された場合も対応している)  input(正解y or 高すぎh or低すぎl)  if 入力値がh => high=guess  elif l => low=guess  elif y => break(whileループから抜ける)  else もう一度input #ユーザーの入力誤りがない前提ならばここは省略してもよい  (whileループ繰り返し) print(正解)

というように範囲を狭めていくアプローチがあると思います。
(上記は厳密ではなく、端数処理について検証していないため正解にたどり着けないパターンがあるかもしれません。詳細は他の方が言われているようにように二分探索アルゴリズムのスクリプトを参照してください)

投稿2020/06/19 03:36

編集2020/06/19 07:41
patapi

総合スコア687

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

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

退会済みユーザー

退会済みユーザー

2020/06/19 05:10

早速ありがとうございます。 申し訳ないのですが、(日本語のコメントなどは消して)コードを試してみましたところif h =>のところでエラーになります。その前のインプットの部分を変数を取り込むみたいに直さないとだめなのでしょうか。 愚直なとおっしゃいますが、それも分からずすみません。
guest

0

二分探索なら、0〜65536中から16回で検索できます。

二分探索法 (Pythonによるアルゴリズムとデータ構造)

投稿2020/06/19 03:30

cateye

総合スコア6851

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

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

cateye

2020/06/19 03:51 編集

0〜100なら、(人間が忘却しない限り)7回以下で判別可能ですね。 ・最初に50と言う  lなら75  hなら25 ・・・と、前半(後半)の半分に絞り込む・・・
退会済みユーザー

退会済みユーザー

2020/06/19 04:59

おっしゃっていることはよくわかります。 ただ、それをどうコード化するかいろいろやってみますがうまくできずに困っています。 参考サイトもみてみましたが、これをどう応用するのかがよくわかりません 当方3週間まえよりはじめた初心者でして基礎知識もないため、すみません。 どういう風にコードをかくか、お教えいただけませんでしょうか。 すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問