Python入门教程丨1.2 别再HelloWorld了,来写个简单的抽卡模拟器!(含pip使用)

382 阅读9分钟

1. 第一段代码

既然环境已经搭建好了,那我们趁热打铁,赶快来写段代码试试吧!

知道的小伙伴都知道,按照传统,学习编程的第一段代码就是输出"hello world!"


1.1 命令行实现

这是很简单的,直接用命令行就能实现。

我们打开命令行端口,输入Pyhton或者Python3即可进入Python

当显示出python版本号和>>>这三个尖括号时就说明可以运行python代码了!

我们输入print("hello world!")后回车,第一段代码就运行成功了!

聪明的小伙伴会发现了,这种方式只适合输入一行一行的代码,那么有没有办法一次性写一堆呢?


1.2 编写脚本文件

当然有!我们以pycharm为例,我们先新建一个 helloworld.py文件,然后写下这两行代码:

print("hello world!")
print("你好啊,我是第二行代码")

然后右键,运行,或者点击上方的绿色小箭头

运行后可以看到,代码输出了以下内容!


2.如何实现抽卡模拟器?

2.1 先来次单抽

好了,热身阶段完毕!我们已经了解到了 Python 运行的两种方式,命令行和编写脚本,接着我们来看个例子!

我们先从最基础的功能开始,模拟一个简单的单抽,从奖池中随机抽取一个奖品。

代码示例:

import random

# 定义奖池
roles = ["流萤", "钟离", "胡桃", "5元外卖优惠券","v你50","篮球"]

# 单抽功能
def draw_once():
    return random.choice(roles)

# 抽卡!
print("欢迎使用抽卡模拟器!")
result = draw_once()
print(f"恭喜抽到奖品:{result}")

运行结果:

欢迎使用抽卡模拟器!
恭喜抽到奖品:篮球

在这个例子中,我们运用了random这个随机数模块,这是我们模拟概率的核心工具。

Python 之所以如此受欢迎,很大程度上是因为它拥有丰富的“工具箱”——模块(第三方库)

你可以理解为Python 可以从“应用商店”下载很多已经广泛使用的代码,来实现不同的功能。

比如 requests 库来实现对网页的访问,os 模块帮你操作文件系统。

而当自带的工具箱不够用时,我们可以通过 pip 安装更多工具,这就像从网上下载一款新软件。


2.2 用好 pip,不再重复造轮子

pip 是Python的包管理工具,全称是 “Pip Installs Packages”,类似于应用商店,可以帮你安装各种第三方库,比如绘图的 matplotlib,处理数据的 pandas 等。

当你需要安装某个库文件时,仅需要执行下面的代码

pip install 库名

比如想爬取某个网页,就可以安装 requests 库

pip install requests

注:若 pip 无法使用,请检查是否正确安装,或使用 pip3

2.2.1 更换 pip 源

由于 pip 默认从国外的源地址下载库,受网络环境影响,可能导致下载缓慢。

那么我们就可以通过切换下载源来解决!

国内拥有 pip 的镜像源,比如阿里云、清华大学等,更换源可以临时使用,也可以永久配置。

如果你只是偶尔需要更换源,可以在安装库时通过 -i 参数指定镜像地址。

#临时更换为清华源
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple 

如果你希望每次使用 pip 时都自动使用国内镜像源,可以通过修改 pip 的配置文件来实现。

2.2.2 永久修改下载源
Windows 的配置文件路径通常为:

C:\Users<你的用户名>\AppData\Roaming\pip\pip.ini

macOS 和 Linux配置文件路径通常为:

~/.pip/pip.conf

在配置文件中添加以下内容,即可设置镜像源地址为清华大学源

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

以下是一些国内常用的镜像源地址,你可以随意选择一个:
• 阿里云: mirrors.aliyun.com/pypi/simple…
• 清华大学: pypi.tuna.tsinghua.edu.cn/simple
• 中国科技大学: pypi.mirrors.ustc.edu.cn/simple/
• 豆瓣: pypi.douban.com/simple/


修改配置文件后,可以用以下命令查看 pip 是否使用了新的源:

pip config list

如果显示类似以下内容,则说明配置成功:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

2.3 完善抽卡系统,添加稀有度和概率

真实的抽卡中,奖励并不是平等的——稀有奖励出现的概率通常更低。

我们可以用一个概率分布来模拟这个机制。

代码示例:

import random
#定义奖池和稀有度
roles = {
    "五星": ["v你50", "钟离","篮球"],
    "四星": ["黑塔", "5元外卖优惠券"],
    "三星": ["硬币一枚", "生锈的剑", "派蒙表情包"]
}
#定义稀有度概率
probabilities = {"五星": 0.02, "四星": 0.10, "三星": 0.88}
#单抽
def draw_once():
    rand = random.random()  # 生成 0 到 1 的随机数
    if rand < probabilities["五星"]:
        rarity = "五星"
    elif rand < probabilities["五星"] + probabilities["四星"]:
        rarity = "四星"
    else:
        rarity = "三星"
    return rarity, random.choice(roles[rarity])
#抽卡
rarity, result = draw_once()
print(f"恭喜抽到 [{rarity}] 奖品:{result}")

运行结果:

在这个例子中,我们遇到了字典列表的数据类型:

roles = {
    "五星": ["v你50", "钟离","篮球"],
    "四星": ["黑塔", "5元外卖优惠券"],
    "三星": ["硬币一枚", "生锈的剑", "派蒙表情包"]
}

使用了条件判断if,用来判断随机数所在的范围。

还使用了def来定义一个函数,用来封装一个具体的功能,在这里我们先了解其功能即可,后续会详细讲解。

2.4 加入十连抽与保底机制

为了让抽卡体验更贴近实际,我们增加十连抽功能,并添加“至少保底一个五星奖励”的逻辑。

代码示例

# 十连抽功能
def draw_ten():
    results = [draw_once() for _ in range(10)]  # 循环调用单抽10次
    return results

# 模拟十连抽
print("试试手气")
choice = input("请选择操作:1. 单抽  2. 十连抽\n")

if choice == "1":
    rarity, prize = draw_once()
    print(f"恭喜你获得 [{rarity}] 奖品:{prize}")
elif choice == "2":
    results = draw_ten()
    print("恭喜你获得:")
    for rarity, prize in results:
        print(f"[{rarity}] {prize}")
else:
    print("无效选择,请重新运行!")

在上一个例子中,我们将单次抽卡的操作定义为了一个函数draw_once()

这其实就类似于我们数学上的函数 f(x),不过数学上是给定变量x可以计算一个结果。

在编程中给定的不只是数字,结果也可能是一串操作。

我们把这种功能复用的操作叫作**封装**,这是编程中非常重要的思想,也是提高效率的关键。

因此在这个例子中,我们只需要调用十次单抽,即可实现“十连抽”

接下来我们实现保底机制


代码示例

# 初始化抽卡数据
draw_count = 0
five_star_guarantee = 90  # 每90次保底出五星
statistics = {"五星": 0, "四星": 0, "三星": 0}

# 单抽功能(加入保底)
def draw_once():
    global draw_count, five_star_guarantee
    draw_count += 1
    # 如果达到保底次数,强制出五星
    if draw_count >= five_star_guarantee:
        rarity = "五星"
        draw_count = 0  # 出现五星时,重置计数器
    else:
        rand = random.random()
        if rand < probabilities["五星"]:
            rarity = "五星"
            draw_count = 0  # 出现五星时,重置计数器
        elif rand < probabilities["五星"] + probabilities["四星"]:
            rarity = "四星"
        else:
            rarity = "三星"

    prize = random.choice(prizes[rarity])
    statistics[rarity] += 1  # 更新统计
    return rarity, prize

# 模拟十连抽
results = [draw_once() for _ in range(10)]
print("十连抽结果:")
for rarity, prize in results:
    print(f"[{rarity}] {prize}")

# 显示累计统计
print("\n抽奖统计:")
for rarity, count in statistics.items():
    print(f"{rarity}: {count}次")

我们只需要设置一个计数器,每次抽奖时使得抽奖次数加 1,90 次后必出 5 星,不足 90 次出 5 星时重置计数器。

在这个过程中,涉及变量、循环语句、条件判断等多方面内容。

可以说,这个例子学会就可以解决 60%的问题,后续我们也将详细介绍具体的语法内容。

运行结果


下面是这个例子的完整代码

import random
# 定义奖池和稀有度
roles = {
    "五星": ["v你50", "钟离", "篮球"],
    "四星": ["黑塔", "5元外卖优惠券"],
    "三星": ["硬币一枚", "生锈的剑", "派蒙表情包"]
}
# 定义稀有度概率
probabilities = {"五星": 0.02, "四星": 0.10, "三星": 0.88}

# 初始化统计变量
draw_count = 0  # 抽奖次数
five_star_guarantee = 90  # 保底:90次内必出五星
statistics = {"五星": 0, "四星": 0, "三星": 0}  # 统计每个稀有度的中奖次数

# 单抽功能(含保底机制)
def draw_once():
    #全局变量,修改抽卡次数
    global draw_count, five_star_guarantee
    draw_count += 1  # 每次抽奖计数器加1

    # 如果达到保底次数,强制出五星
    if draw_count >= five_star_guarantee:
        rarity = "五星"
        draw_count = 0  # 重置计数器
    else:
        # 按概率随机抽取
        rand = random.random()
        if rand < probabilities["五星"]:
            rarity = "五星"
            draw_count = 0  # 出现五星时,重置计数器
        elif rand < probabilities["五星"] + probabilities["四星"]:
            rarity = "四星"
        else:
            rarity = "三星"

    prize = random.choice(roles[rarity])  # 从对应稀有度中随机选择奖品
    statistics[rarity] += 1  # 更新统计
    return rarity, prize

# 十连抽功能
def draw_ten():
    results = [draw_once() for _ in range(10)]  # 调用单抽10次
    return results

# 主程序
def main():
    print("欢迎使用抽卡模拟器!")
    while True:
        choice = input("请选择操作:1. 单抽  2. 十连抽  3. 查看统计  4. 退出\n")

        if choice == "1":
            rarity, prize = draw_once()
            print(f"恭喜你获得 [{rarity}] 奖品:{prize}")

        elif choice == "2":
            results = draw_ten()
            print("十连抽结果:")
            for rarity, prize in results:
                print(f"[{rarity}] {prize}")

        elif choice == "3":
            print("\n抽奖统计:")
            for rarity, count in statistics.items():
                print(f"{rarity}: {count}次")
            print(f"距离保底还需抽取:{five_star_guarantee - draw_count} 次\n")

        elif choice == "4":
            print("感谢陪伴,下次再见👋🏻!")
            break

        else:
            print("无效输入,请重新选择!")

# 运行主程序
if __name__ == "__main__":
    main()

3.小结

通过这个例子,你已经接触到了以下Python基础知识:

  • 开始运行:两种运行代码的方式
  • 库的使用: 使用强大的第三方库来实现各种功能.
  • 数据结构: 使用字典和列表管理复杂奖池和结果数据。
  • 循环与条件: 实现十连抽和保底逻辑,体验循环的灵活性。
  • 函数的调用: 写一次代码后续重复使用,封装的思想。

对于初学者来说,本例可能有点难度,别担心,只要能搞懂第一个最简单的例子就足够了!

经过后续的学习,掌握这些概念都不在话下!


动手试试吧!

学习总是从模仿开始,发挥你的创造力,修改示例的代码,自己来运行试试!

参考选题:

1. 实现一个随机点名器,所有同学都等概率被选到,且不会连续选到同一人

2. 拼手气红包,模拟微信红包分配,确保每个人分到的金额不低于 0.01 元

觉得有挑战?没关系,先试试而已,体会一下编程的感觉。

从小项目开始,你会逐渐发现它的无限可能性,快动手试试吧!