Skip to main content

Python 小游戏 API 及实现:恶魔轮盘赌

Project description

恶魔轮盘赌(重构版)

正常玩法

运行

需要 Python 3.6 或更高版本的 Python。
在终端输入 python -m emlpd

游戏规则介绍

你需要根据游戏界面给你的提示来打败恶魔。要打败恶魔,需要让恶魔的生命值变为 0 或以下,且自己的生命值在 0 以上。
每一回合之初游戏都会告诉你主弹夹内实弹与空弹各有几发。每一轮, 你可以选择朝自己开枪,也可以朝对方开枪。 若朝自己开枪且射出的全部子弹都为空弹且全部未炸膛,则下一轮还是你开枪, 否则轮到对面开枪。
若射出了 1 发实弹,则它会造成 1 点的基础伤害(可能被防御)。
射出的每一发子弹都有一定的概率炸膛(即让子弹作用方相反;可使用道具改变),详见 道具 21:破枪
若某一方的负伤数为 n(0≤_n_≤8,_n_∈N),则对于该方受到的每一点实弹伤害,都有 n/8 的概率导致额外受到 1 点生命值伤害,有 1-n/8 的概率导致负伤数加 1。 负伤数初始为 0。
若某一方的体力为 m(0≤_m_≤32,_m_∈N),负伤数为 n(0≤_n_≤8,_n_∈N),若 m>0,则该方每开一次枪都会减少 1 体力。若 m<32,每一轮该方都有 1/(n+1) 的概率增加 1 体力。当 m<8 时,该方有 1-m/8 的概率晕一轮。
如果某一方晕了 n(_n_∈N₊) 轮,那么若原本下一轮应轮到该方开枪, 则下一轮变为仍是另一方开枪,且该方晕的轮数变为 n-1。

游戏周期

开枪 1 次称为 1 轮。

回合

发放 1 次新弹夹称为 1 回合。

周目

更换 1 个新恶魔称为 1 周目。

游戏运行 1 次称为 1 局。

道具说明

道具 0:良枪(一)

若对面使用了破枪,则将你的叠加破枪数减 1,否则将你的叠加良枪(一)数加 1。
详见 道具 21:破枪

道具 1:良枪(二)

若对面使用了破枪,则将你的叠加破枪数减 1,否则将你的叠加良枪(二)数加 1。
详见 道具 21:破枪

道具 2:小刀

若本轮使用了 n(_n_∈N) 个小刀,对本轮射出的每一发实弹都附加 n 点额外伤害。

道具 3:开挂(一)

将主弹夹的最外部的 1 发子弹退出(让其消失),并告诉这发子弹的实空。

道具 4:超级小木锤

让对方晕的轮数加 1。

道具 5:道德的崇高赞许

设当前你的生命值为 m(_m_∈N₊),负伤数为 n(0≤_n_≤8,_n_∈N),当 _m_≤3+n/3 时,你有 100% 的概率加 1 点生命值;当 m>3+n/3 时,你有 pow(2,3+n/3-m) 的概率加 1 点生命值。

道具 6:透视镜

告诉你各弹夹的最外部的 1 发子弹的实空(最上方一条是主弹夹的)。

道具 7:拿来主义

若对方有 n(_n_∈N)个非限量道具,则有 1/(1+n) 的概率随机等可能地获得一个非限量道具,有 1-1/(1+n) 的概率随机等可能地将对方的 1 个非限量道具拿来。两者互为对立事件。

道具 8:你的就是我的

此为 OP 道具。
将对方的道具库与你共用,届时你无法使用你的道具库中的道具。有 30% 的概率共用 1 回合,50% 的概率共用 2 回合,20% 的概率共用 3 回合。三者互斥。

道具 9:防弹dàn衣

将一件耐久指数为 3 的防弹衣加在最外层。在你有至少 1 件防弹衣时, 当一发子弹射到你,设本轮的额外伤害为 n(_n_∈N),最外层防弹衣会先减少 randint(1,⌈√(n+1)⌉) 点耐久指数。随后,设最外层防弹衣耐久指数为 m(_m_∈Z),若 m<0,则该防弹衣有 1-pow(2,m) 的概率消失。
若有 1 件防弹衣消失,你的破防潜能会加 1;若防弹衣消失后你没有穿上的防弹衣, 那么你的每一点破防潜能都有 15% 的概率转变为破防回合数,有 85% 的概率无事发生。 若破防回合数大于 0,则接下来的回合你将不能使用任何道具, 并且会随机朝自己或对方开枪,每过 1 回合破防回合数减 1。

道具 10:反甲

未实装

道具 11:骰tóu子

m=randint(1,6)+randint(1,6)+randint(1,6)。当 m=3 时,你会破防 2 回合;当 m=4 时,你会减 2 点生命值,并告诉你;当 m=5 时, 主弹夹从外至里从第 3 发子弹开始的空实状态会随机变化;当 m=6 时,你会减 1 点生命值,并告诉你;当 m=7 时,你的一个非限量道具会消失;当 m=9 时,你会加 1 点体力直至加满;当 m=10 时,你会加 1 点生命值,并告诉你;当 m=11 时,你会加 2 点体力直至加满;当 m=12 时,你本轮额外伤害会加 2 点,并有 50% 的概率告诉你;当 m=13 时,对面会减 1 点生命值,并告诉你;当 m=14 时,对面有 1/3 的概率多晕 1 轮,2/3 的概率多晕 2 轮,两者互为对立事件;当 m=15 时,对面会减 2 点生命值,并告诉你;当 m=18 时, 对面的生命值会变为原来的 1/8(向下取整),并告诉你。

道具 12:槽位延期

设你现在有 n(_n_∈N)个临时槽位。当 n=0 时,不会使用道具;当 n>0 时, 对于每个临时槽位,都有 100% 的概率延期 1 回合。

道具 13:镜子

此为 OP 道具。
对于生命值、负伤数、体力、道具库、叠加良枪(一)、叠加良枪(二)、本轮额外伤害、 防弹衣、叠加接弹套、 叠加双发射手、叠加连发射手、叠加破枪、叠加绷带,有 50% 的概率,你的变为对方的,并告诉“你变成了恶魔的样子”;50% 的概率,对方的变为你的,并告诉“恶魔变成了你的样子”。两者互为对立事件。 并将双方晕的轮数变为 0。

道具 14:接弹dàn套

会将你的叠加接弹套数加 1。设你现在有 n(_n_∈N₊)个叠加接弹套,对面的额外伤害为 m(_m_∈N),若对面射来 1 发实弹,你有 (1-0.8)/(1+m) 的概率接住之(免受该实弹的伤害并告诉你“你接住了一颗子弹”) 并将其放在主弹夹的末尾,且叠加接弹套数变为 0;若对面射来 1 发空弹,你有 0.8/(1+m) 的概率接住之(告诉你“你接住了一颗子弹”)并将其放在主弹夹的末尾, 且叠加接弹套数减 1。

道具 15:填实

设现在主弹夹有 n(_n_∈N₊)发子弹,则对于主弹夹内的每发空弹都有 1/n 的概率变为实弹。若至少有 1 发空弹变为实弹,则会提示“弹夹有变动”。

道具 16:重整弹药

将主弹夹内的所有子弹暂时拿出,并一发发放回主弹夹。你可以指定每发子弹放在何处, 但放回的是实弹还是空弹只有放入后才会显示。例如下面的情况:0实1空2实3实4空5, 输入 0 会将一发子弹放入主弹夹最外处;输入 5 会将一发子弹放入主弹夹最里处; 输入 3 会将一发子弹放入例中两发连续实弹的位置。所有子弹放入后会提示 “你重整了一下弹药”。

道具 17:双发射手

会将你的叠加双发射手数加 1。
详见 道具 18:连发射手

道具 18:连发射手

会将你的叠加连发射手数加 1。
设你现在有 m(_m_∈N)个叠加双发射手,n(_n_∈N)个叠加连发射手,主弹夹子弹数为 r(_r_∈N₊),若朝对方开枪,则至少会射出 min(r,1+m) 发子弹,并有 1-2⁻ 的概率多射出 1 发子弹(若弹夹内还有子弹)。换而言之,当 n>0 时,你有 min(1,pow(1-2⁻,r-1-m)) 的概率清空弹夹。设主弹夹射出了 s(_s_∈N₊) 发子弹,若 s>n,则叠加连发射手数变为 0;若 s_≤_n, 则叠加连发射手数减 s。每多射出 1 发子弹(由叠加双发射手),叠加双发射手数减 1。

道具 19:硬币

此为 OP 道具。
有 50% 的概率会给你一个未发尽的 OP 道具(不计入发放总数),50% 的概率会将你的生命值减半(减半后向下取整)。两者互为对立事件。

道具 20:燃烧弹

未实装

道具 21:破枪

将对面的叠加破枪数加 1。
设当前炸膛指数为 h(_h_∈N),你的叠加良枪(一)数为 m(_m_∈N),叠加良枪(二)数为 n(_n_∈N),叠加破枪数为 r(_r_∈N)。若朝自己开枪,当 r>0 时,对于射出的每发子弹有 100% 的概率炸膛;当 r=0 且 m>0 时,对于射出的每发子弹有 0% 的概率炸膛;否则,对于射出的每发子弹有 (1-pow(1023/1024,h+200))² 的概率炸膛。若朝对方开枪,当 r>0 时, 对于射出的每发子弹有 100% 的概率炸膛;当 r=0 且 n>0 时,对于射出的每发子弹有 0% 的概率炸膛;否则,对于射出的每发子弹有 (1-pow(1023/1024,h+200))² 的概率炸膛。每射出 1 发子弹(无论炸膛与否),炸膛指数加 1。

道具 22:取出子弹

在主弹夹内取出 1 发由你指定位置的子弹并将其变为道具实弹空弹,并告诉你。

道具 23:空弹

在主弹夹内放入 1 发由你指定位置的空弹,并告诉你。

道具 24:实弹

在主弹夹内放入 1 发由你指定位置的实弹,并告诉你。

道具 25:神秘子弹

在主弹夹内放入 1 发由你指定位置的神秘子弹,并告诉你。
所谓“神秘子弹”,是指该子弹的实空未知,且有 50% 概率影响紧挨该子弹里部的 1 发子弹的实空(若有)。

道具 26:绷带

2 回合后让你的负伤数减 1。若当前正在使用的绷带数大于等于负伤数,则不会使用。

道具 27:医疗包

若你的生命值小于 2,则会回复 5 点生命值;若你的生命值小于 5,则会回复 4 点生命值;若你的生命值小于 9,则会回复 3 点生命值;若你的生命值小于 14,则会回复 2 点生命值;若你的生命值大于等于 14,则会回复 1 点生命值。 此外,若你的负伤数等于 0,则会回复 2 点生命值;若你的负伤数小于 4,则会回复 1 点生命值。根据生命值回复的生命值会告诉你,而根据负伤数回复的生命值不会告诉你。

道具 28:开挂(二)

立即发放一批新弹夹(不保留现有弹夹)。

道具 29:双枪会给出答案

此为 OP 道具。
添加 1 异或 2 个额外弹夹。添加伊始是复制已有弹夹到新额外弹夹。不会提示。

道具 30:所有或一无所有

此为 OP 道具。
有 50% 的概率将双方的道具库、防弹衣清空,额外伤害归零。

道具 31:超级大木锤

此为 OP 道具。
设当前主弹夹内有 n(_n_∈N₊)发子弹,让对方晕的轮数加 n

道具 32:不死不休

此为 OP 道具。
发起一个擂台战,你和对方需要以一定的生命值作为赌注(整数,最小为 1,最大为当前生命值),对方不能拒绝。在擂台战过程中,会发放一批无限子弹弹夹, 且你和对方的赌注将作为擂台战的初始生命值。不会发放任何道具。一方生命值到 0 以下时,另一方赢得擂台战并随后获得双方赌注生命值之和,擂台战结束。

道具 33:枪筒维修

让炸膛指数变为原来的 2/3(向下取整),并告诉你“你维修了一下枪筒”。若炸膛指数小于等于 0,则不会使用。

道具 34:空实分离

将各弹夹内所有实弹移到最顶部,所有空弹移到最底部,并提示“弹夹进行了空实分离”。

道具 35:弹夹合并

将各额外弹夹(0→1→2 次序)内子弹按原有顺序依次移入主弹夹末尾,并提示“你合并了一下弹夹”。 若当前无额外弹夹或所有额外弹夹内均无子弹,则不会使用。

游戏模式介绍

1. 普通模式

只有 1 个周目。
你和恶魔的初始生命值分别为 1 和 10。
会发放除 ID10 的所有道具。
双方各有 8 个永久槽位。

2. 无限模式(一)

只有 1 个周目。
你和恶魔的初始生命值分别为 2 和 (2⁶⁴-1)。
会发放除 ID10、ID11、ID13 的所有道具。
双方各有 9 个永久槽位。

3. 小刀狂欢

只有 1 个周目。
你和恶魔的初始生命值分别为 1 和 10。
只会发放 ID2、ID3 道具。
双方各有 100 个永久槽位。
不会发放临时槽位。

4. 骰子王国

只有 1 个周目。
你和恶魔的初始生命值分别为 50 和 randint(50,90)。
只会发放 ID11 道具。
双方各有 100 个永久槽位。
不会发放临时槽位。

5. 无限模式(二)

有无穷多个周目。
你的初始生命值为 2。设当前为第 n(_n_∈N₊)周目,恶魔的初始生命值为 (n+9)。
会发放除 ID10 的所有道具。
双方各有 9 个永久槽位。

6. 连射派对

只有 1 个周目。
你和恶魔的初始生命值分别为 40 和 200。
只会发放 ID0、ID1、ID2、ID9、ID15、ID17、ID18、ID21、ID27、ID28、ID29、ID34、ID35 道具。
双方各有 12 个永久槽位。

7. 炸膛测试

只有 1 个周目。
你和恶魔的初始生命值分别为 10 和 50。
只会发放 ID5、ID9、ID21 道具。
双方各有 6 个永久槽位。

8. 赤手空“枪”

只有 1 个周目。
你和恶魔的初始生命值分别为 18 和 50。
不会发放任何道具。
双方各有 0 个永久槽位。
不会发放临时槽位。

自定义游戏模式

预设的游戏模式在 emlpd.gameinst 中,由 GAMEMODE_SET 定义。这是 GAMEMODE_SET 的默认设置:

from typing import Dict, Iterable, Optional, Tuple, Union
from emlpd.gameapi import Game

class NormalGame(Game): ...

normal_mode: NormalGame = ...
infinite_mode: NormalGame = ...
xiaodao_party: NormalGame = ...
dice_kingdom: NormalGame = ...
class InfiniteMode2: ...
combo_party: NormalGame = ...
exploded_test: NormalGame = ...
onlybyhand: NormalGame = ...

GAMEMODE_SET: Dict[int, Union[
    Tuple[Iterable[Game], int, float],
    Tuple[Iterable[Game], int, float, str, Optional[str]]
]] = {
    1: ((normal_mode,), 2, 2.5, "普通模式", "新手入门首选"),
    2: ((infinite_mode,), 2, 2.5, "无限模式(一)", "陪你到天荒地老"),
    3: ((xiaodao_party,), 3, 3., "小刀狂欢", "哪发是实弹?"),
    4: ((dice_kingdom,), 4, 2.25, "骰子王国", "最考验运气的一集"),
    5: (InfiniteMode2(), 2, 2.5, "无限模式(二)",
        "霓为衣兮风为马,云之君兮纷纷而来下"),
    6: ((combo_party,), 3, 2.5, "连射派对", "火力全开"),
    7: ((exploded_test,), 2, 1.75, "炸膛测试", "枪在哪边好使?"),
    8: ((onlybyhand,), 1, 2.5, "赤手空“枪”", "没有道具了")
}

你需要新建一个 Python 脚本,在其中创建一个 Game 对象(在 emlpd.gameapi 中),然后将其添加到 GAMEMODE_SET 中,例如:

from emlpd.gameapi import Game
from emlpd.gameinst import GAMEMODE_SET, gen_tools_from_generic_tools

my_gamemode: Game = Game( # 参数详情见 Game.__doc__
    2,
    10,
    8,
    0,
    10,
    100,
    90,
    gen_tools_from_generic_tools(
        (0, 1, 21) # 包含预定道具 ID,可为空;见 emlpd.gameinst.GENERIC_TOOLS
    ),
    {
        0: 1,
        1: 1,
        21: 2
    },
    {
        0: 0,
        1: 0,
        21: 0
    },
    {
        0: 2,
        1: 2,
        21: 4
    },
    7,
    False
)

GAMEMODE_SET[
    9 # 游戏模式 ID
] = (
    (my_gamemode,), # 一个包含 Game 的可迭代对象
    1, # 指定每回合各方最多发放的道具数
    2.75, # 指定经验乘数
    "游戏模式名字",
    "游戏模式介绍"
)

import emlpd.__main__ # type: ignore # import 不能省去!

随后运行上述脚本,即可看到:

游戏模式 9 : 游戏模式名字
介绍: 游戏模式介绍

输入 9 即可进入自定义游戏模式。

经典玩法

运行

需要 Python 3.6 或更高版本的 Python。
在终端输入 python -m emlpd.classic

游戏规则介绍

你需要根据游戏界面给你的提示来打败恶魔。要打败恶魔,需要让恶魔的生命值变为 0 或以下,且自己的生命值在 0 以上。
每一回合之初游戏都会告诉你实弹与空弹各有几发。每一轮,你可以选择朝自己开枪, 也可以朝对方开枪。若朝自己开枪且射出的子弹为空弹,则下一轮还是你开枪, 否则轮到对面开枪。
若射出了 1 发实弹,则它会造成 1 点的基础伤害。
如果某一方晕了 n(_n_∈N₊) 轮,那么若原本下一轮应轮到该方开枪, 则下一轮变为仍是另一方开枪,且该方晕的轮数变为 n-1。

游戏周期

开枪 1 次称为 1 轮。

回合

发放 1 次新弹夹称为 1 回合。

游戏运行 1 次称为 1 局。

道具说明

道具 2:小刀

若本轮使用了 n(_n_∈N) 个小刀,对本轮射出的实弹都附加 n 点额外伤害。

道具 3:开挂

将弹夹的最外部的 1 发子弹退出(让其消失),并告诉这发子弹的实空。

道具 4:超级小木锤

让对方晕的轮数加 1。

道具 5:道德的崇高赞许

设当前你的生命值为 m(_m_∈N₊),当 _m_≤3 时,你有 100% 的概率加 1 点生命值;当 m>3 时,你有 pow(2,3-m) 的概率加 1 点生命值。

道具 6:透视镜

告诉你弹夹的最外部的 1 发子弹的实空。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

emlpd-0.4.2b3.tar.gz (61.2 kB view details)

Uploaded Source

File details

Details for the file emlpd-0.4.2b3.tar.gz.

File metadata

  • Download URL: emlpd-0.4.2b3.tar.gz
  • Upload date:
  • Size: 61.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.13.1

File hashes

Hashes for emlpd-0.4.2b3.tar.gz
Algorithm Hash digest
SHA256 9231016c3ad37dc8938604a9932dbd2a9530adc16db4a482537d4fae2f624d03
MD5 8b7b66bb620c0b94be56a9cefc735cd1
BLAKE2b-256 5eaafdaa2d2a6bbcef09feb33672b785410c5bfe1fc8cac1051b10b4b987da48

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page