返回顶部
首页 > 资讯 > 后端开发 > Python >用Python简单模拟《原神》抽卡系统
  • 769
分享到

用Python简单模拟《原神》抽卡系统

python游戏开发语言 2023-09-30 06:09:03 769人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

用python简单模拟《原神》抽卡系统[抽卡模拟器] 简介代码思想保底机制概率概率公式 代码构建导入软件包random和os初始化概率增加概率保底机制创建文件夹抽卡次数读取出金之后的判断1

python简单模拟《原神》抽卡系统[抽卡模拟器]

欢迎
这是我第一次发布文章,就爱闲的没事整点活玩,写的不好还请见谅
使用的语言是Python,因为实在是太方便了o(TヘTo)
对了,要是懒得看代码思想直接跳到完整代码就彳亍

简介

想必大家都听说过原神吧,是米哈游开发的大世界探索游戏。大学一放假就太闲了,于是就用python写了个模拟原神抽卡的程序,其实星铁也适用这个机制
大家可以用它来试试运气,我在测试的时候一次出了三金,两个纳西妲一个琴(炫耀)[为什么我游戏中就没这运气,天天大保底,气死了]
好的,那么废话不多说,我们先说一下原理

代码思想

根据我从网上和官方给出的概率浏览获得的信息:

  • 保底机制

    180抽大保底,90抽小保底

  • 概率

    五星中奖概率为0.6%
    四星角色概率为2.55%
    其余的三星概率是96.85%
    大保底小报底各占50%
    五星概率会从第74抽开始逐渐提高6%

  • 概率公式

    概率抽卡次数i
    0.006(i<=73)
    0.006 + 0.06(i - 73)(74<=i<=89)
    1(i=90)

代码构建

导入软件包random和os

毕竟是抽卡,怎么能少了random
然后这个os是新建文件夹用的
用来保存你的抽卡记录,还有创建你的卡池

import osimport random

初始化概率

其实简单说说就是,先加入9685个蓝色,然后加入255个紫色,再加入6个金色,然后打乱

# 初始化抽卡的概率def rate_initialization():    rate_list.extend(['蓝' for temp in range(9685)])  # 蓝色概率是96.85%    rate_list.extend(['紫' for temp in range(255)])  # 紫色概率是2.55%    rate_list.extend(['金' for temp in range(60)])  # 金色概率是0.6%    random.shuffle(rate_list)  # 打乱这个列表

增加概率

其实就是74抽之后,每次把60个蓝色去掉,然后随机插入60个金色
啊,这个踹他的原因就是怕一开始初始化蓝色数量不够,其实没啥用,可以删掉

# 74抽之后增加概率def rate_add():    try:        for _ in range(60):            rate_list.remove('蓝')            rate_list.insert(random.randint(0, len(rate_list) - 1), '金')    except ValueError:        print('程序异常,概率增加异常')        exit()

保底机制

有点小长,说简单点其实就是检测是否有保底这个文本文档,如果有就读一下,没有就创建并写入false表示是小报底,true是大保底。如果是false就在up和常驻中随机抽取,抽到up还是false,抽到常驻变成true,就这么个原理

# 大保底还是小保底def guarantees():    try:        with open('recording\\isGuarantees.txt', 'r', encoding='utf-8') as file:            if file.read() == 'true':                certainly = True            else:                certainly = False    except BaseException:        with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:            file.write('false')        with open('recording\\isGuarantees.txt', 'r', encoding='utf-8') as file:            if file.read() == 'true':                certainly = True            else:                certainly = False    if certainly:        with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:            file.write('false')        return True    else:        res = random.choice(['up', 'resident'])        if res == 'up':            with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:                file.write('false')            return True        else:            with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:                file.write('true')            return False

创建文件夹

其实注释都说了,不存在就新建一个,存在就拉倒

# 创建一个文件夹在同一个目录下def mkdir(path):    folder = os.path.exists(path)    if not folder:  # 判断文件夹是否存在        os.makedirs(path)  # 不存在就新建一个

抽卡次数读取

这个其实和上面的保底一样的,找不到文件就新建一个,然后初始化为0

# 抽卡次数读取def read_times():    try:        with open('recording\\times.txt', 'r', encoding='utf-8') as file:            number = int(file.read())            return number    except BaseException:        with open('recording\\times.txt', 'w+', encoding='utf-8') as file:            file.write('0')        return 0

出金之后的判断

这就是为什么上面的保底返回的是True和False,出了就append一个up角色,歪了就append一个常驻的角色上去

# 出金了def Gold():    rate_initialization()    record_times(0)    if guarantees():        res_list.append(up)        return '出货了!!!!!'    else:        res_list.append(random.choice(fiveStar))        return '哇!金色传。。。歪了。。。'

10抽必出紫

第十抽必是紫色,如果不满10抽出了紫色,那么记录则会清零,这是记录和读取的函数

# 记录紫色保底,10抽必出紫色def record_rare(number):    with open('recording\\rare.txt', 'w+', encoding='utf-8') as file:        file.write(str(number))
# 读取紫色保底def read_rare():    try:        with open('recording\\rare.txt', 'r', encoding='utf-8') as file:            return int(file.read())    except BaseException:        with open('recording\\rare.txt', 'w+', encoding='utf-8') as file:            file.write('0')            return 0

主体部分

其实就是把刚刚的方法或者叫函数也行,统合到了一起初始化卡池,读取,打乱,因为每次抽卡都会有一个动画告诉你是蓝天白云还是出货了,还是只有紫色,所以加了一个描述的打印输出。然后每次出金色都会重置概率,重新初始化,其余的就是照着我写的代码思想写的,其实也不是很难

mkdir('卡池')mkdir('recording')while True:    try:        with open('卡池\\up.txt', 'r', encoding='utf-8') as tempFile:            up = tempFile.read()        with open('卡池\\fiveStar.txt', 'r', encoding='utf-8') as tempFile:            fiveStar = tempFile.read().split(sep=' ')        with open('卡池\\fourStar.txt', 'r', encoding='utf-8') as tempFile:            fourStar = tempFile.read().split(sep=' ')        with open('卡池\\threeStar.txt', 'r', encoding='utf-8') as tempFile:            threeStar = tempFile.read().split(sep=' ')        break    except BaseException:        print('你好,欢迎使用本模拟器,我在上面帮你创建了几文件夹,在里面填入卡池的东西就好了,用空格隔开')        with open('卡池\\up.txt', 'w+', encoding='utf-8'):            pass        with open('卡池\\fiveStar.txt', 'w+', encoding='utf-8'):            pass        with open('卡池\\fourStar.txt', 'w+', encoding='utf-8'):            pass        with open('卡池\\threeStar.txt', 'w+', encoding='utf-8'):            pass        input('填好了就回个车')rate_list = list()rate_initialization()while True:    try:        wish = int(input('1、单抽 2、十连抽 3、退出\n请输入:'))    except ValueError:        print('你这输入的啥玩意')        continue    if wish == 1:        count = 1    elif wish == 2:        count = 10    elif wish == 3:        break    else:        print('奇奇怪怪的数字')        continue    res_list = []    result_report = '蓝天白云'    temp_list = [random.choice(rate_list) for _ in range(count)]    flag = False    for character_rank in temp_list:        if 73 <= read_times() <= 88:            rate_add()        elif read_times() >= 89:            result_report = gold()            continue        record_times(read_times() + 1)        if character_rank == '蓝':            record_rare(read_rare() + 1)            if read_rare() >= 10:                if not flag:                    result_report = '出了个紫色'                record_rare(0)                res_list.append(random.choice(fourStar))                continue            res_list.append(random.choice(threeStar))        elif character_rank == '紫':            if not flag:                result_report = '出了个紫色'            record_rare(0)            res_list.append(random.choice(fourStar))        elif character_rank == '金':            flag = True            result_report = gold()    print(result_report)    print(' '.join(res_list))    # recode_gacha()    print('==================================================')

接下来是完整代码

完整代码

"""要求:180抽大保底,90抽小保底10抽必出4星90抽必出5星  抽到的时候up和常驻各占50%P = {0.006                       i<=730.006 + 0.06(i - 73)        74<=i<=891                           i=90}五星中奖概率为0.6%四星角色概率为2.55%其余的三星概率是96.85%大保底小报底各占50%"""import osimport random# 初始化抽卡的概率def rate_initialization():    rate_list.extend(['蓝' for temp in range(9685)])    rate_list.extend(['紫' for temp in range(255)])    rate_list.extend(['蓝' for temp in range(60)])    random.shuffle(rate_list)# 74抽之后增加概率def rate_add():    try:        for _ in range(60):            rate_list.remove('蓝')            rate_list.insert(random.randint(0, len(rate_list) - 1), '金')    except ValueError:        print('程序异常,概率增加异常')        exit()# 大保底还是小保底def guarantees():    try:        with open('recording\\isGuarantees.txt', 'r', encoding='utf-8') as file:            if file.read() == 'true':                certainly = True            else:                certainly = False    except BaseException:        with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:            file.write('false')        with open('recording\\isGuarantees.txt', 'r', encoding='utf-8') as file:            if file.read() == 'true':                certainly = True            else:                certainly = False    if certainly:        with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:            file.write('false')        return True    else:        res = random.choice(['up', 'resident'])        if res == 'up':            with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:                file.write('false')            return True        else:            with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:                file.write('true')            return False# 创建一个文件夹在同一个目录下def mkdir(path):    folder = os.path.exists(path)    if not folder:  # 判断文件夹是否存在        os.makedirs(path)  # 不存在就新建一个# 抽卡次数记录def record_times(number):    with open('recording\\times.txt', 'w+', encoding='utf-8') as file:        file.write(str(number))# 抽卡次数读取def read_times():    try:        with open('recording\\times.txt', 'r', encoding='utf-8') as file:            number = int(file.read())            return number    except BaseException:        with open('recording\\times.txt', 'w+', encoding='utf-8') as file:            file.write('0')        return 0# 出金了def gold():    rate_initialization()    record_times(0)    if guarantees():        res_list.append(up)        return '出货了!!!!!'    else:        res_list.append(random.choice(fiveStar))        return '哇!金色传。。。歪了。。。'# 记录紫色保底,10抽必出紫色def record_rare(number):    with open('recording\\rare.txt', 'w+', encoding='utf-8') as file:        file.write(str(number))# 读取紫色保底def read_rare():    try:        with open('recording\\rare.txt', 'r', encoding='utf-8') as file:            return int(file.read())    except BaseException:        with open('recording\\rare.txt', 'w+', encoding='utf-8') as file:            file.write('0')            return 0# 写入抽卡记录def recode_gacha():    with open('抽卡记录.txt', 'r', encoding='utf-8') as file:        record_list = file.read()        if len(record_list) >= 300:            with open('抽卡记录.txt', 'a+', encoding='utf-8') as writeFile:                pass            file.write(' '.join(res_list))        else:            with open('抽卡记录.txt', 'a+', encoding='utf-8') as writeFile:                passmkdir('卡池')mkdir('recording')while True:    try:        with open('卡池\\up.txt', 'r', encoding='utf-8') as tempFile:            up = tempFile.read()        with open('卡池\\fiveStar.txt', 'r', encoding='utf-8') as tempFile:            fiveStar = tempFile.read().split(sep=' ')        with open('卡池\\fourStar.txt', 'r', encoding='utf-8') as tempFile:            fourStar = tempFile.read().split(sep=' ')        with open('卡池\\threeStar.txt', 'r', encoding='utf-8') as tempFile:            threeStar = tempFile.read().split(sep=' ')        break    except BaseException:        print('你好,欢迎使用本模拟器,我在上面帮你创建了几文件夹,在里面填入卡池的东西就好了,用空格隔开')        with open('卡池\\up.txt', 'w+', encoding='utf-8'):            pass        with open('卡池\\fiveStar.txt', 'w+', encoding='utf-8'):            pass        with open('卡池\\fourStar.txt', 'w+', encoding='utf-8'):            pass        with open('卡池\\threeStar.txt', 'w+', encoding='utf-8'):            pass        input('填好了就回个车')rate_list = list()rate_initialization()while True:    try:        wish = int(input('1、单抽 2、十连抽 3、退出\n请输入:'))    except ValueError:        print('你这输入的啥玩意')        continue    if wish == 1:        count = 1    elif wish == 2:        count = 10    elif wish == 3:        break    else:        print('奇奇怪怪的数字')        continue    res_list = []    result_report = '蓝天白云'    temp_list = [random.choice(rate_list) for _ in range(count)]    flag = False    for character_rank in temp_list:        if 73 <= read_times() <= 88:            rate_add()        elif read_times() >= 89:            result_report = gold()            continue        record_times(read_times() + 1)        if character_rank == '蓝':            record_rare(read_rare() + 1)            if read_rare() >= 10:                if not flag:                    result_report = '出了个紫色'                record_rare(0)                res_list.append(random.choice(fourStar))                continue            res_list.append(random.choice(threeStar))        elif character_rank == '紫':            if not flag:                result_report = '出了个紫色'            record_rare(0)            res_list.append(random.choice(fourStar))        elif character_rank == '金':            flag = True            result_report = gold()    print(result_report)    print(' '.join(res_list))    # recode_gacha()    print('==================================================')

使用提醒

记得在卡池放东西

记得要在卡池里放东西,因为这个为了灵活控制卡池,比如新增什么常驻,四星角色,或者三星武器什么的,用的读取文本文档的方式来进行卡池数据的储存的,虽然数据库也可以,但是多少有点大材小用了。
我这里给出一些我写好的用例吧,记得角色和角色,或者是武器和武器之间要用空格隔开,因为我这个是split(sep=’ ')劈分的是空格。我这里写了部分4星和目前5星常驻的角色,三星实在太多了,写不动了,这里我放出来

UP角色

up.txt

就写一个限定角色就行,我写的纳西妲,因为我最喜欢纳西妲了

五星常驻

fiveStar.txt

刻晴 莫娜 七七 迪卢克 琴 迪希雅 提纳里

四星角色

fourStar.txt

安柏 丽莎 凯亚 芭芭拉 雷泽 菲谢尔 班尼特 诺艾尔 菲谢尔 砂糖 迪奥娜 北斗 凝光 香菱 行秋 重云 辛焱 绮罗罗

三星武器

threeStar.txt

这个我没写,我就写了个蓝色,有兴趣的可以自己写一下,反正也是狗粮,我就不写了

重要的事情重复一遍,别忘了往卡池放东西

结束

那么就到这里吧,感谢能读到这,我是喜欢整活的小狐,每天整点活玩就是我的乐趣。想想下次能玩点什么新花样,如果觉得有意思的话,还请点一个小小的赞。目前在忙项目,只能实现简单的逻辑,交互什么的下次一定。有时间再写到Django里。

来源地址:https://blog.csdn.net/Xiao_HuXH/article/details/131046000

--结束END--

本文标题: 用Python简单模拟《原神》抽卡系统

本文链接: https://lsjlt.com/news/421743.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 用Python简单模拟《原神》抽卡系统
    用Python简单模拟《原神》抽卡系统[抽卡模拟器] 简介代码思想保底机制概率概率公式 代码构建导入软件包random和os初始化概率增加概率保底机制创建文件夹抽卡次数读取出金之后的判断1...
    99+
    2023-09-30
    python 游戏 开发语言
  • python 之简单模拟银行系统功能(卡号申请、还款、支付、取现)
    一、简单说明1、源代码文件见附件 Credit.zip2、关于转账功能,因时间问题,转账功能待续4、逻辑图二、代码1、包encryption中的(password.py文件)#!/usr/bin/env&n...
    99+
    2024-04-02
  • 使用Python和OpenSSL简单模拟
    本文使用Python和文件系统模拟保密通信的整个过程 本阶段完成系统初始状态模拟,直接看代码 import os,shutil from Crypto.Cipher import DES3,XOR def xorencode...
    99+
    2023-01-31
    简单 Python OpenSSL
  • 如何在Linux上简单模拟系统负载
    这篇文章主要讲解了“如何在Linux上简单模拟系统负载”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何在Linux上简单模拟系统负载”吧!CPU下面命令会创建 CPU 负荷,方法是通过压缩...
    99+
    2023-06-16
  • 怎么用js实现简单的抽奖系统
    今天小编给大家分享一下怎么用js实现简单的抽奖系统的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。效果图如图所示:字节带闪动,...
    99+
    2023-06-29
  • 利用Python Django实现简单博客系统
    第一节 - 基础 1. 简单的导览图,学会不迷路 对 Django 的评价:借用李清照的《鹧鸪天 桂花》来表达, 暗淡轻黄体性柔。情疏迹远只香留。何须浅碧深红色,自是花中第一流。 梅定妒,菊应羞。画阑开处冠中秋。骚...
    99+
    2022-06-02
    Python Django实现博客系统 Python Django
  • 用Python实现一个简单的用户系统
    目录前言正文总结前言  如标题所说,这是一个非常简单的程序,并不涉及任何高深的学问,更适合一些刚入手Python的新人研究一下基础内容的用法,此案列对于有些编程经验的人来讲...
    99+
    2024-04-02
  • Android自定义View 使用PathMeasure简单模仿系统ProgressBar(四)
    使用PathMeasure简单模仿系统ProgressBar,效果如下: 还蛮像的吧,有的人问了,系统自带的你闲的搞这个干嘛,当然是纯粹为了学习PathMeasure这个类。...
    99+
    2022-06-06
    view progressbar Android
  • 用Python做一个简单的图书管理系统
    目录制定步骤1、进入提示语:2、获取用户输入:扩展:3、完善各指令程序4、优化程序,使代码更简洁扩展:制定步骤 1、进入提示语: 为了制作一个友好的“图书管理系统&rdq...
    99+
    2023-05-17
    Python 管理系统 Python图书管理系统
  • 利用Python编写一个简单的缓存系统
    目录项目展示不用落地的缓存系统系统应该如何实现铺垫python字典基本操作定义一个不用落地的缓存系统数据如何落地将对象保存到磁盘将对象从磁盘中导入到内存中将数据落地和缓存系统结合起来...
    99+
    2023-05-16
    Python实现缓存系统 Python缓存系统 Python缓存
  • 使用原生JAVA编写一个简单的停车场系统
    本篇文章为大家展示了使用原生JAVA编写一个简单的停车场系统,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JAVA项目中正号需要一个停车收费系统,就整理出来给大家分享一下,希望对大家有所帮助。<...
    99+
    2023-05-31
    java 停车场系统 ava
  • Python使用Redis实现作业调度系统(超简单)
    概述 Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。 Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用...
    99+
    2022-06-04
    作业 简单 系统
  • Android系统开发中log的使用方法及简单的原理
    在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录。在Android系统中,提供了简单、便利的LOG机制,开发...
    99+
    2022-06-06
    方法 log Android
  • 利用Python制作一个简单的天气播报系统
    目录前言工具天气数据来源代码实现总结前言 大家好,我是辣条 相信大家都能感觉到最近天气的多变,好几次出门半路天气转变。辣条也深受其扰,直接给我整感冒,就差被隔离起来了,既然天气我没法...
    99+
    2024-04-02
  • 使用Python实现简单的学生成绩管理系统
    目录基本功能:实现效果:制作技巧  1.定义变量2.读取学生成绩信息3.循环等待操作指令并执行4.编写操作指令执行函数(1)显示学生成绩信息函数(2)新建学生成绩...
    99+
    2024-04-02
  • 用代码模拟操作系统进程调度算法(Python)
     引言 近日,在学习完操作系统的进程调度部分后,我萌生了一个有趣的想法:通过编写代码来模拟进程调度算法,以加深自己对这一知识点的理解。于是,我花了一整天的时间投入到了这个突发奇想的实践中。  背景 进程调度是操作系统中的重要概念,它决定...
    99+
    2023-10-26
    python 算法 linux 1024程序员节
  • 简单了解Python下用于监视文件系统的pyinotify包
    什么是inotify: Inotify是一个事件驱动的通知机制,Inotify 提供一个简单的API,使用最小的文件描述符,并且允许细粒度监控。与 inotify 的通信是通过系统调用实现。可用的...
    99+
    2022-06-04
    文件系统 简单 Python
  • 如何用python实现简单的学生成绩管理系统
    这篇文章主要介绍了如何用python实现简单的学生成绩管理系统的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何用python实现简单的学生成绩管理系统文章都会有所收获,下面我们一起来看看吧。需求:代码:imp...
    99+
    2023-06-29
  • 如何用Python写个简单但强大的人脸识别系统
    如何用Python写个简单但强大的人脸识别系统,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。face_recognition是一个强大、简单、易上手的人脸识别开...
    99+
    2023-06-16
  • 怎么利用Python制作一个简单的天气播报系统
    本篇内容介绍了“怎么利用Python制作一个简单的天气播报系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!工具python3.7pycha...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作