Python学习笔记17 -- 猜数字小游戏2

目录

一、功能函数

[1、说明函数 -- 对游戏玩法及设置进行说明](#1、说明函数 -- 对游戏玩法及设置进行说明)

[2、答案函数 -- 生成答案](#2、答案函数 -- 生成答案)

[3、猜测函数 -- 让玩家进行猜测](#3、猜测函数 -- 让玩家进行猜测)

[4、对照函数 -- 将答案和猜测进行对照](#4、对照函数 -- 将答案和猜测进行对照)

[4.1 A函数](#4.1 A函数)

[4.2 B函数](#4.2 B函数)

[5、结果函数 -- 判断得到结果或继续猜测](#5、结果函数 -- 判断得到结果或继续猜测)

[6、时间函数 -- 判断一局游戏所用时间](#6、时间函数 -- 判断一局游戏所用时间)

[7、打印函数 -- 显示每局的成绩](#7、打印函数 -- 显示每局的成绩)

[8、下局函数 -- 是否进行下一局游戏](#8、下局函数 -- 是否进行下一局游戏)

[9、测试函数 -- 测试对照函数的正确性](#9、测试函数 -- 测试对照函数的正确性)

[二、主程序 -- 两个while循环](#二、主程序 -- 两个while循环)


一、功能函数

1、说明函数 -- 对游戏玩法及设置进行说明

python 复制代码
def notification():
    """
    write some information about the game -- tell the player how to play
    :return: none
    """
    print("Guess the number from 1000 to 9999~")
    print("A means the number of the data and its location which are correct")
    print("B means the number of the data is correct but the location is wrong")
    print("for example, the right answer is 1234, your guess is 1245, then it will show 2A1B")
    print(("Give you another example:9527 and 9572 : 2A2B"))
    print("Let's begin the game! \n")

2、答案函数 -- 生成答案

python 复制代码
def generate_answer():
    """
    create a random answer from 1000 to 9999
    :return: the answer of the game
    """
    return random.randint(1000,9999)

3、猜测函数 -- 让玩家进行猜测

python 复制代码
def make_guess():
    """
    input the guess
    :return: the player's guess answer
    """
    return int(input('Plz input your guess:'))

4、对照函数 -- 将答案和猜测进行对照

python 复制代码
def check_guess(answer, guess):
    """
    Get the result -- how many numbers and locations are right
    :param answer: The right answer which was created by the function of generate_answer
    :param guess: The input of player
    :return: (number)A(number)B -- for example -- 4A0B -- you got the right answer
            A means both the number and location are correct
            B means only the number is correct(despite the A)
    """
    a_num = check_a(answer, guess)
    b_num = check_b(answer, guess)
    result = f'{a_num}A, {b_num}B'
    print(result)
    return result

4.1 A函数

python 复制代码
def check_a(answer, guess):
    """
    check the right number and location -- for example, 9527 guess 9572, return 2
    :param answer: The right answer which was created by the function of generate_answer
    :param guess: The input of player
    :return: the number of A
    """
    count = 0
    ansStr = str(answer)
    gueStr = str(guess)

    for index, char in enumerate(gueStr):
        if (ansStr[index] == char):
            count += 1

    return count

4.2 B函数

一开始想直接用if char in ansstr指令,但想到有9527和9522得到1b的情况。 ---

因此引入了aIndex变量,使用guestr.index(char) not in aIndex作为额外补充条件,但出现了答案为1333和猜测3833出现3B的情况。 --

经过检查发现,index函数只能查到字符串中某字符出现的第一个位置,相当于,无论是第一个3还是第二个3还是第三个三,使用guestr.index(char)指令只能获得第一个3所在的位置,因此,三个三使程序运行了三次第一个三不在aindex位置的代码。

为了解决这种情况,想到在一开始检测A的情况时,就将答案和猜测中A的位置上的数字替换成别的字母,这样在检测B的个数时,免受A位置的干扰。为了防止1333和3833出现3b的情况,在第一个3出现的时候,就先计算一次,再将这个3替换成别的字母,这样,在第二个3出现的时候,由于第一个三已经被替换成了字母,使用index函数时,第二个3的位置就可以被检测到。

python 复制代码
def check_b(answer, guess):
    """
    check the number:
    if the number is correct but the location is wrong, then the num of b add 1
    only can be compared with those not belong to A
    :param answer: The right answer which was created by the function of generate_answer
    :param guess: The input of player
    :return: the number of B
    """
    count = 0

    ansStr = str(answer)
    gueStr = str(guess)

    aIndex = [] # save the index of A
    repeat = []
    for index, char in enumerate(ansStr):
        if (gueStr[index] == char):
            """
            remove the number of A
            """
            aIndex.append(index)
            gueStr = gueStr[:index] + str.replace(gueStr[index], char, 'a') + gueStr[index + 1:]
            ansStr = ansStr[:index] + str.replace(ansStr[index], char, 'b') + ansStr[index + 1:]

    for char in ansStr:
        """
        if the number is in the B -- 
            if the index of the number is not in A's index
            the number of B add 1
            and replace the number to "a" 
            (because the function 'index' always count the location of the first char)
        """
        if(char in gueStr):
            gIndex = gueStr.index(char)
            count += 1
            gueStr = gueStr[:gIndex] + str.replace(gueStr[gIndex],char, 'a') + gueStr[gIndex+1 : ]

    return count

5、结果函数 -- 判断得到结果或继续猜测

python 复制代码
def process_result(guess_count,guess,result):
    """
    Handle the result:
        if win(4A0B), return True, or return False
    :param guess_count: the guess chances the player has used
    :param guess: the answer of the player(guess)
    :param result: (number)A(number)B
    :return: True or False
    """
    print(f'Round {guess_count}, Your guess is: {guess}, And the result is: {result}')
    if result == '4A, 0B':
        print('Yeah, you win!!!~~~~')
        return True
    else:
        print('Try again!')
        return False

6、时间函数 -- 判断一局游戏所用时间

python 复制代码
def checkTime(begin_time):
    """
    Record the time of guessing -- from beginning until the right answer
    :param begin_time: when the player began a new game
    :return: the time the player used in one game (seconds)
    """
    finish_time = time.time()
    Time = finish_time - begin_time

    return Time

7、打印函数 -- 显示每局的成绩

python 复制代码
def show_score(score):
    """
    print the score(the round of the game, how many chances the player used to guess the right answer, and the total time)
    :param score: the score the player got
    :return: none, just for printing the score
    """
    print('===========================================')
    print('ROUND'.ljust(10), 'CHANCE'.ljust(10), 'TIME'.ljust(10))
    for sc in score:
        cycle = str(sc[0]).ljust(10)
        guess = str(sc[1]).ljust(10)
        time = str(sc[2]).ljust(10)
        print(cycle,guess,time)

8、下局函数 -- 是否进行下一局游戏

python 复制代码
def should_continue():
    """
    ask for continue -- if y or Y, then begin a new game, or end the running
    :return: True or False
    """
    con = input("Do you wanna start a new game? if yes, input y or Y")
    if(con == 'y' or con == 'Y'):
        print("Thank u for another game, hope you can enjoy!")
        return True
    else:
        print('Thank u for playing, have a nice day! Goodbye~~~~')
        return False

9、测试函数 -- 测试对照函数的正确性

python 复制代码
if __name__ == '__main__':
    """
    only when testing the gueFun, the function will run
    for checking if the logic is correct
    """
    # auto judgement == a number
    assert (check_a(9527, 9522) == 3)
    assert (check_a(9572, 9527) == 2)
    assert (check_a(9527, 9342) == 1)
    assert (check_a(1234, 5678) == 0)
    assert (check_a(1111, 1211) == 3)
    assert (check_b(1234, 4321) == 4)
    assert (check_b(9527, 5923) == 2)
    assert (check_b(9527, 9522) == 0)
    assert (check_b(1333, 3833) == 1)
    assert (check_b(1111, 1311) == 0)
    assert (check_b(9269, 6266) == 0)


# if wanna know the functions' function, then use this:
# print(bmi.__doc__)

二、主程序 -- 两个while循环

第一个while循环控制是否进行下一局游戏

包括对一局游戏的变量初始化,记录开始时间,及在游戏结束后打印战绩

第二个while循环控制一局游戏的全部操作

生成随机答案,输入猜测,判断猜测是否正确,给出提示,生成结果

相关推荐
m0_583105908 分钟前
基于flask的闪现、g对象、蓝图
后端·python·flask
eclipsercp10 分钟前
《每天5分钟用Flask搭建一个管理系统》 第6章:数据库集成
数据库·python·flask
小oo呆11 分钟前
【PythonWeb开发】Flask自定义模板路径和静态资源路径
python·flask
Purepisces14 分钟前
深度学习笔记: 最详尽解释预测系统的分类指标(精确率、召回率和 F1 值)
人工智能·笔记·python·深度学习·机器学习·分类
铁匠匠匠22 分钟前
django学习入门系列之第三点《案例 小米商城二级菜单》
前端·css·经验分享·python·学习·django·前端框架
jiayoushijie-泽宣38 分钟前
深入浅出3D感知中的优化与基于学习的技术 (第二章) 原创教程
人工智能·学习·算法·机器学习·3d·机器人
Ephemeroptera40 分钟前
IT专业入门,高考假期预习指南
java·c语言·网络·python·高考
2301_7951685841 分钟前
昇思25天学习打卡营第6天|简单的深度学习模型实战 - 函数式自动微分
人工智能·深度学习·学习
javaer炒粉1 小时前
Es结合springboot(笔记回忆)
spring boot·笔记·elasticsearch
jqrbcts1 小时前
关于发那科机器人系统升级方法
开发语言·人工智能·python·机器人·c#