Differences between revisions 3 and 4
Revision 3 as of 2018-10-10 15:28:21
Size: 3843
Comment:
Revision 4 as of 2018-10-14 03:13:14
Size: 3960
Comment:
Deletions are marked like this. Additions are marked like this.
Line 11: Line 11:
<<TableOfContents>>
[[../EP_005a/Contents|*]]

<<Include(../EP_005a/Contents)>>
[[../EP_005a/Contents|*]]
----

拡張問題(5)

*


概要

[ edit ]

  • 演習(5)

    拡張課題(5a)

    【関数定義】

    数当てゲーム
    (コンピュータが決めた0~99の間の
    整数をヒントから当てるゲーム)

    EP_02_005a_high_and_low.py

*


ヒント

[ edit ]

  • この課題のヒント
    • 基本的には,「Xが入力されるまで,入力を受け付けることを繰り返す」ことになります.
      • そのループに先立って,乱数で0~99の範囲で,正解となる整数を決めます.
      • ループの中では,利用者が入力した数値と,正解との大小比較をします.
        • 正解と入力した数値が等しければ,利用者の勝ちです.
        • 利用者があきらめて,Xを入力すれば,コンピュータの勝ちです.
        • さもなくば,入力した数値が,正解よりも大きい(high)か,小さい(low)かを判断してヒントを表示します.
          • いわゆる,ハイ&ローゲームです.
      • 普通は,あてずっぽうではなくて,二分探索で攻めてきますよね.
        • つまり...
          • 0~99の範囲なので,まずは,真ん中の50を入力してみます.
            • その結果で,候補を半分に,限ることができます.
              • 「大きすぎる」というヒントが得られたら,0~49の範囲に正解があるので,また,その真ん中である24か25くらいを入力してみましょうか.
              • 「小さすぎる」というヒントが得られたら,51~99の範囲に正解があるので,また,その真ん中である74か75くらいを入力してみましょうか.
            • これを繰り返していくと,効率よく候補の範囲を絞り込んでいけそうです
*


実行例

[ edit ]

  • 実行例(1) ... クリックすると拡大します

fig-01

*


プログラム例: 本質的な部分 (授業中に順次公開します)

[ edit ]

  • 解答は基本的に,下記 7 行です.

   1 def judge_high_and_low( x, correct_number ):
   2     if x == correct_number:
   3         return( "正解です" )
   4     elif x > correct_number:
   5         return( "大きすぎます" )
   6     else:
   7         return( "小さすぎます" )
  • でも,単純に,正解なら整数の0, 大きすぎるとき正の数,小さすぎるとき負の数を返すと考えれば,単純に引き算で表現できます.

   1 def judge_high_and_low( x, correct_number ):
   2     return( int( x - correct_number ))
*


高度な話題 (授業中,もしくは授業後に順次公開します)

[ edit ]

  • 高度な話題へのリンク: 授業の流れを阻害しないように別ページにします

    • (後日の回の授業内容にはなる可能性がありますが,この回の授業内容には含めません).
    • に関するものです.


プログラム例: 配布コード (授業中に順次公開します)

*

*

  • 演習(5)

    拡張課題(5a)

    【関数定義】

    数当てゲーム

    EP_02_005a_high_and_low.py

  • 解答は基本的に,下記 7 行です.

   1 def judge_high_and_low( x, correct_number ):
   2     if x == correct_number:
   3         return( "正解です" )
   4     elif x > correct_number:
   5         return( "大きすぎます" )
   6     else:
   7         return( "小さすぎます" )
  • でも,単純に,正解なら整数の0, 大きすぎるとき正の数,小さすぎるとき負の数を返すと考えれば,単純に引き算で表現できます.

   1 def judge_high_and_low( x, correct_number ):
   2     return( int( x - correct_number ))

   1 #!/usr/bin/env python
   2 # -*- coding: utf-8 -*-
   3 # ==============================================================================
   4 # * Copyright (c) 2018 IIJIMA, Tadashi
   5 # *       (IIJIMA Laboratory, Dept. of Science and Technology, Keio University).
   6 # ==============================================================================
   7 # ソフトウェア工学[02] 拡張課題[02]-(000a)  EP_02_000a_.py
   8 # EP(Extended Problem) 02-000a: 
   9 #        2018-10-03 飯島 正 (iijima@ae.keio.ac.jp)
  10 # ==============================================================================
  11 # ----- 乱数を取り扱うrandomモジュールをインポートする -----
  12 import random
  13 # ==============================================================================
  14 # ===== 【関数定義】 正解か,正解よりも大きいか,小さいかを判断する関数 =============================
  15 def judge_high_and_low( x, correct_number ):
  16     if x == correct_number:
  17         return( "正解です" )
  18     elif x > correct_number:
  19         return( "大きすぎます" )
  20     else:
  21         return( "小さすぎます" )
  22 # ==============================================================================
  23 # ===== 【メイン・プログラム】  ==========================================================
  24 # ----- オープニングメッセージ ----------------------------------------------------------
  25 print( "数当てゲーム: " )
  26 print( "  秘密にされた100未満の正の整数(乱数で選ばれている)を当てます." )
  27 print( "  回答として正しい数と思うを入力してください." )
  28 print( "  正解なら,その旨を表示して終了します." )
  29 print( "  不正解なら,入力された数が正解よりも大きいか,小さいかを表示して,再度,入力を促します." )
  30 print( "  降参する場合は,\"X\"を入力してください." )
  31 print()
  32 
  33 # ----- 正解を選択します ------------------------------------------------------------
  34 answer = random.randint( 1, 99 )
  35 
  36 # デバッグ時以外はコメントアウト
  37 print( "正解は:", answer )
  38 
  39 # ----- 数当てゲームを始めます --------------------------------------------------------
  40 while True:
  41     guess = input( "正解と思う100未満の正の整数を入力してください(降参ならX)>>> " )
  42     if guess == "X":
  43         print( "降参ですね.正解は", answer, "でした", sep="" )
  44         break
  45     judge = judge_high_and_low( int( guess ), answer )
  46     print( judge )
  47     if judge == "正解です":
  48         break
  49 # ==============================================================================


SoftEng: Python/Prog/Practice/Extended/02/EP_005a (last edited 2018-10-28 15:20:57 by TadashiIijima)