Differences between revisions 4 and 5
Revision 4 as of 2018-10-14 03:13:14
Size: 3960
Comment:
Revision 5 as of 2018-10-14 23:37:41
Size: 404
Comment:
Deletions are marked like this. Additions are marked like this.
Line 17: Line 17:

 ||<|2>演習(5)||<|2>拡張課題(5a)||<|2>【関数定義】||数当てゲーム||
 ||<|1> [[../EP_005a|EP_02_005a_high_and_low.py|target="_blank"]]||

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

{{{#!highlight python
def judge_high_and_low( x, correct_number ):
    if x == correct_number:
        return( "正解です" )
    elif x > correct_number:
        return( "大きすぎます" )
    else:
        return( "小さすぎます" )
}}}

 * でも,単純に,正解なら整数の0, 大きすぎるとき正の数,小さすぎるとき負の数を返すと考えれば,単純に引き算で表現できます.

{{{#!highlight python
def judge_high_and_low( x, correct_number ):
    return( int( x - correct_number ))
}}}

{{{#!highlight python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ==============================================================================
# * Copyright (c) 2018 IIJIMA, Tadashi
# * (IIJIMA Laboratory, Dept. of Science and Technology, Keio University).
# ==============================================================================
# ソフトウェア工学[02] 拡張課題[02]-(000a) EP_02_000a_.py
# EP(Extended Problem) 02-000a:
# 2018-10-03 飯島 正 (iijima@ae.keio.ac.jp)
# ==============================================================================
# ----- 乱数を取り扱うrandomモジュールをインポートする -----
import random
# ==============================================================================
# ===== 【関数定義】 正解か,正解よりも大きいか,小さいかを判断する関数 =============================
def judge_high_and_low( x, correct_number ):
    if x == correct_number:
        return( "正解です" )
    elif x > correct_number:
        return( "大きすぎます" )
    else:
        return( "小さすぎます" )
# ==============================================================================
# ===== 【メイン・プログラム】  ==========================================================
# ----- オープニングメッセージ ----------------------------------------------------------
print( "数当てゲーム: " )
print( "  秘密にされた100未満の正の整数(乱数で選ばれている)を当てます." )
print( "  回答として正しい数と思うを入力してください." )
print( "  正解なら,その旨を表示して終了します." )
print( "  不正解なら,入力された数が正解よりも大きいか,小さいかを表示して,再度,入力を促します." )
print( "  降参する場合は,\"X\"を入力してください." )
print()

# ----- 正解を選択します ------------------------------------------------------------
answer = random.randint( 1, 99 )

# デバッグ時以外はコメントアウト
print( "正解は:", answer )

# ----- 数当てゲームを始めます --------------------------------------------------------
while True:
    guess = input( "正解と思う100未満の正の整数を入力してください(降参ならX)>>> " )
    if guess == "X":
        print( "降参ですね.正解は", answer, "でした", sep="" )
        break
    judge = judge_high_and_low( int( guess ), answer )
    print( judge )
    if judge == "正解です":
        break
# ==============================================================================

}}}



----

拡張問題(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 ]

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

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


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

*

*

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