Python(九九問題の作成)

from random import randint as rand
from time import time

def RandPos(posNum):
    """シークエンス内のある位置をランダムに取得する関数
       @param  posNum シークエンスの要素数
       @retval シークエンス内のある位置をあらわす数"""
    return rand(0,posNum-1)

def RandNum(maxNum):
    """2~maxNumまでの範囲の数をランダムに取得する関数
       @param maxNum 範囲の最大値
       @retval ランダムな整数"""
    return rand(2,maxNum)

def GetRandNum():
    """RandNum(maxNum)を用いて数をランダムに取得する関数
       @retval ランダムな整数"""
    return RandNum(11)
    
def Make99Question():
    """九九問題を生成する関数
       @retval タプル(作成した問題のリスト,隠す場所の整数)"""
    a,b = GetRandNum(),GetRandNum()
    results = [a, b, a * b]
    pos = RandPos(len(results)) # マジックナンバーを使わすシーケンスの長さで汎用性向上
    return (results,pos)

def get_int(function):
    """<高階関数>入力を求める関数の値を判断する関数
       @param function 入力処理を行う関数
       @return tmpNum 正しい入力値の数"""
    while True:
        s = function()
        if s.isnumeric():
            return int(s)
        else:
            print(f"「{s}」は正の整数ではありません\n正しい入力値をお願いします")

def Input99Question(results,pos):
    """九九の問題を表示し入力値を判断する関数
       @param results 九九問題のリスト
       @param pos     リストで隠す場所の要素番号
       @retval s     入力値の整数"""
    tmps = results.copy()
    tmps[pos] = '?'

    def GetAnswer():
        """入力値を返す関数
      @retval 入力値の文字列"""
        s = input(f"{tmps[0]} * {tmps[1]} = {tmps[2]}:")
        return s

    return get_int(GetAnswer)
    
def Execution99Question():
    """九九の問題を処理する関数
       @retval result 回答に対する真偽値(0:false 1:true)"""
    results,pos = Make99Question()
    ans = Input99Question(results,pos)
    solution = results[pos]
    result = (ans==solution)
    print({False:"不正解…",True:"正解!"}[result])    # Dictionaryで結果を表示
    return result

def Do99Game(num):
    """九九の問題を実行する関数
       @param num 繰り返し回数"""
    startTime = time()
    successNum = 0
    for i in range(num):
        print(f"\n{i+1}問目")
        successNum += Execution99Question()
    endTime = time()
    deltaTime = round(endTime - startTime, 2)
    print(f"\n正解した数:{successNum} / {num}")
    print(f"あなたの正答率は{int(100*successNum/num)}%でした")
    print(f"回答時間は{deltaTime}秒でした")
    print(f"1問あたりの回答時間は{round(deltaTime/num, 2)}秒でした")

def input_num():
    """入力を求める関数"""
    return input("九九問題の出題数を入力してください:")

"""実行処理"""
Do99Game(get_int(input_num))

Pythonでは高階関数で引数に関数を入れて処理することが可能!(C言語では、こんなに簡単に関数を受け渡しすることできないっすねw)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

WordPress

前の記事

Challenge WordPress
Python

次の記事

Python(ジャンケン)