专业编程基础技术教程

网站首页 > 基础教程 正文

一学就废|Python基础碎片,综合案例学习

ccvgpt 2024-12-31 09:44:54 基础教程 2 ℃

本文将通过整合往期的“一学就废”基础碎片,综合运用各项基础知识,开发一个“猜数字游戏升级版”的Python程序,帮助加强基础编码能力。往期参考直达链接(末尾)。

实现功能简介

程序首先生成一个随机的四位数字作为目标数字,玩家需要猜测这个数字。

一学就废|Python基础碎片,综合案例学习

每次猜测后,程序会根据玩家的猜测给出提示,提示包括数字和位置都正确的个数(A)以及数字正确但位置错误的个数(B)。

玩家可以不断猜测,直到猜对为止,同时程序会记录玩家猜测的次数。

游戏结束后,玩家可以选择是否查看自己的猜测历史记录以及一些统计信息,如平均每次猜测花费的时间等。

代码设计

  1. 生成随机的四位目标整形数字。
  2. 利用循环(while 循环)让玩家不断输入猜测的数字,在循环内使用 try...except 处理玩家输入非数字等异常情况。
  3. 编写自定义函数来比较猜测数字和目标数字,返回 A 和 B 的值,函数参数包含固定的目标数字和玩家猜测的数字两个参数。
  4. 根据比较结果给出提示,使用 if...elif...else 判断并输出相应提示信息,利用格式化 F-string 使输出美观。
  5. 使用列表(List)记录玩家每次猜测的数字、猜测时间以及对应的 A 和 B 值。
  6. 猜对后,使用 for 循环遍历猜测历史记录列表并输出,同时计算平均每次猜测花费的时间等统计信息。
  7. 提供玩家是否查看历史记录的选择,使用 if 语句判断玩家选择并执行相应操作。

代码实现

以下是完整代码实现。

import random
import time

# 生成四位随机数字
def generate_target_number():
    """
    该函数生成一个四位随机数字,每位数字不重复且不为0
    """
    digits = list(range(1, 10))  # 生成1到9的数字列表
    random.shuffle(digits)  # 打乱数字列表顺序
    target_number = ""
    for i in range(4):
        target_number += str(digits[i])  # 取前四位组成目标数字字符串
    return target_number

# 比较猜测数字和目标数字,返回A和B的值
def compare_numbers(target, guess):
    """
    此函数接收目标数字和玩家猜测的数字,比较后返回数字和位置都正确的个数A以及数字正确但位置错误的个数B
    """
    A = 0
    B = 0
    target_digits = list(target)
    guess_digits = list(guess)
    for i in range(4):
        if target_digits[i] == guess_digits[i]:
            A += 1
            target_digits[i] = 'X'  # 标记已匹配正确位置的数字,避免重复计算
            guess_digits[i] = 'Y'
    for digit in guess_digits:
        if digit in target_digits:
            B += 1
            target_digits[target_digits.index(digit)] = 'X'  # 标记已匹配的数字,避免重复计算
    return A, B

# 主游戏逻辑
def guessing_game():
    target_number = generate_target_number()
    guess_history = []  # 存储猜测历史记录的列表,每个元素是一个元组(猜测数字, 猜测时间, A, B)
    guess_count = 0
    start_time = 0

    while True:
        try:
            guess = input("请输入你的四位猜测数字:")
            if len(guess)!= 4 or not guess.isdigit():  # 检查输入是否为四位数字
                print("请输入四位有效数字!")
                continue
            guess_count += 1
            if guess_count == 1:
                start_time = time.time()  # 记录第一次猜测开始时间
            current_time = time.time()
            A, B = compare_numbers(target_number, guess)
            guess_history.append((guess, current_time - start_time, A, B))  # 将猜测信息存入历史记录列表
            if A == 4:
                print(f"恭喜你,猜对了!你一共猜测了{guess_count}次。")
                break
            else:
                print(f"提示:{A}A{B}B")
        except:
            print("输入有误,请重新输入!")

    # 游戏结束后询问是否查看历史记录
    view_history = input("是否查看猜测历史记录?(y/n):")
    if view_history == 'y':
        print("猜测历史记录如下:")
        for guess_info in guess_history:
            print(f"猜测数字:{guess_info[0]},花费时间:{guess_info[1]:.2f}秒,结果:{guess_info[2]}A{guess_info[3]}B")
        total_time = sum([info[1] for info in guess_history])  # 计算总花费时间
        print(f"平均每次猜测花费时间:{total_time / guess_count:.2f}秒")

if __name__ == "__main__":
    guessing_game()

代码详细讲解

1.数据类型相关部分

generate_target_number 函数中,digits 是一个列表(List),存储了从 1 到 9 的数字,通过 random.shuffle 方法打乱顺序,然后取前四位组成目标数字字符串(String)。

guess_history 是一个列表,其中每个元素是一个元组(Tuple),包含了玩家猜测的数字、猜测花费的时间(数字类型,通过 time.time 函数得到的时间差)、A 的值和 B 的值。这样的数据结构方便存储和管理玩家的猜测历史信息。

在 compare_numbers 函数中,target_digits 和 guess_digits 是列表,将目标数字和猜测数字转换为列表形式,方便逐个比较数字。

2.格式化 F-string 部分

在游戏结束后输出猜测历史记录时,print(f"猜测数字:{guess_info[0]},花费时间:{guess_info[1]:.2f}秒,结果:{guess_info[2]}A{guess_info[3]}B") 运用了 F-string 格式化输出,其中 :.2f 用于格式化浮点数,保留两位小数,使输出的时间信息更加规范美观。

3.range() 函数运用

在 generate_target_number 函数中,for i in range(4): 用于控制循环四次,从打乱后的数字列表中取出四位数字组成目标数字,这里体现了 range 函数用于指定循环次数的作用。

4.自定义函数运用

generate_target_number 函数没有参数,它的功能是生成一个特定规则的四位目标数字并返回。

compare_numbers 函数有两个参数 target 和 guess,分别代表目标数字和玩家猜测的数字,通过内部的逻辑比较计算并返回 A 和 B 的值,体现了自定义函数接收参数并处理返回结果的特点。

5.map 函数和 reduce 函数运用

案例中未直接使用 map 函数,但如果后续要对猜测历史记录中的某些数据进行批量转换操作,比如将所有猜测时间转换为分钟为单位,可以使用 map 函数。例如:list(map(lambda x: x[1] / 60, guess_history)) (这里只是示例,未在实际代码中添加)。

同样未直接使用 reduce 函数,如果要计算所有猜测时间的总和(除了使用 sum 函数的方式),可以使用 reduce 函数。例如:reduce(lambda x, y: x + y[1], guess_history, 0) (这里只是示例,未在实际代码中添加)。

6.控制语法运用

if len(guess)!= 4 or not guess.isdigit(): 使用 if 语句判断玩家输入是否为四位有效数字,如果不满足条件则提示玩家重新输入,保证游戏输入的合法性。

if A == 4: 使用 if 语句判断玩家是否猜对数字,如果猜对则结束游戏循环并输出相关信息。

for guess_info in guess_history: 使用 for 循环遍历猜测历史记录列表,方便输出每条猜测记录的详细信息。

while True: 使用 while 循环让玩家不断进行猜测,直到猜对为止,循环内部通过 try...except 处理异常确保程序稳定运行。

7.异常处理

在 while 循环中的 try...except 结构,try 块内是获取玩家输入猜测数字以及后续相关操作,如果玩家输入非数字或者输入的数字格式不正确等情况,就会抛出异常,被 except 块捕获,然后输出提示信息告知玩家输入有误,让玩家重新输入,这样可以有效避免因用户错误输入导致程序崩溃。

通过以上综合案例的开发讲解,对Python基础的数据类型,控制语句,基础函数应用,异常处理等有了更进一步的理解和认识,为学习Python进阶知识打好基础,建议大家动手码一遍,加深印象。

往期回顾

一学就废|Python基础碎片,开始Hello World

一学就废|Python基础碎片,控制语句写法

一学就废|Python基础碎片,常用数据类型

一学就废|Python基础碎片,字符串编码

一学就废|Python基础碎片,集合

一学就废|Python基础碎片,列表(List)

一学就废|Python基础碎片,字典(Dictionary)

一学就废|Python基础碎片,格式化F-string

一学就废|Python基础碎片,range()函数

一学就废|Python基础碎片,数组Array

一学就废|Python基础碎片,函数

一学就废|Python基础碎片,map函数

一学就废|Python基础碎片,reduce函数

Tags:

最近发表
标签列表