这是一款什么游戏?
你说得对,但是“别押我”是一款由北航BUAA澄韵音游社自主研发的一款冒险游戏。游戏发生在一群社恐玩家组成的幻想世界,在这里被玩家下注选中的高玩将被授予「怨种」,引导自爆之力。你将扮演一位名为「赌狗」的神秘角色,在自由地被音游暴打的过程中邂逅心机max、运气爆棚的音游巨佬,和他们一起梭哈积分,极限翻盘的同时,逐步发掘「all in」的真相。
正经版:“别押我”是一款由北航BUAA澄韵音游社开发的一款音游玩家线下(线上也行)面基策略游戏。一局游戏游玩时长约30min~1h。
在游戏中,所有玩家需一同游玩指定课题曲,在音游中取得更高的分数以获得更多的积分奖励。与此同时,玩家还可以观察场上的局势变化,在适当的时机下注大牛玩家以赢得更高的积分。
游玩时需要什么准备?
需要准备不会友尽的音游朋友(配置要求极高),给设备充好电,擦擦手,撒点痱子粉。准备好在打不到EX的时候断网。
游戏管理员需要能运行python的环境(当然不介意的话手算也可以)
注意:目前该游戏仅支持arcaea与phigros的课题曲抽取
由游戏管理员将有意向的玩家在程序中进行注册(玩家数量至少为2,6~10人效果最佳)。以下用n代表玩家数量
游戏开始时,由玩家集体决定游戏的回合数(5回合及以上最佳)。在完成指定的回合数后,游戏结束,积分最高者获得胜利。
由游戏管理员进行游戏初始化,详情请查看3.脚本使用
每个玩家将会获得初始值为0的积分。
每个回合分为事件抽取、课题抽取、下注、游玩、游玩结算、下注结算、结束阶段,共七个阶段。
由游戏管理员抽取随机事件,若无特殊说明,事件仅在本回合内生效。随机事件详情请查看4.随机事件
由于事件为即时结算,因此事件不支持重新抽取。
由游戏管理员随机抽取一个课题曲目,并让所有玩家确认是否能游玩该课题曲目,确认完毕后所有玩家游玩该曲目。
例如:游戏管理员抽到了dropdead [Present 9],接下来的阶段里所有玩家就要打开Arcaea,选好自己心仪的角色,开始摔死游玩指定曲目。
如果有玩家尚未解锁该曲目,游戏管理员可以重新抽取一个课题。
所有玩家在此阶段选择两种行为中的一种,并告诉游戏管理员:
- 下注,预测在游玩结算阶段后总分最高的玩家,下注分数范围为1至n的闭区间。在积分为负数的情况下也可以进行下注。请仔细阅读游玩结算阶段流程内容
注意,不可以对自己进行下注
- 不下注,需要向管理员说明不下注,否则会出现死锁。
玩家在下注阶段的行为不公开
所有玩家游玩指定的课题并将成绩仅告诉管理员。(线下面基怎么办?link play?那就考验人性了)
玩家的分数公开,游戏管理员对课题游玩的成绩进行结算。本阶段的排名遵循以下规则:
- 当玩家A的课题成绩高于玩家B时,A的排名高于B;
- 当玩家A的课题成绩等于玩家B时,若A的积分低于B,则A的排名高于B;
- 若1与2皆不满足,则按照玩家id字典序排名(概率极小)
对于倒数第$k$名的玩家,其得分为$\max\left{0, k-\left\lfloor n/2\right\rfloor \right}$。例如当有7名玩家时,将玩家按照升序排名,依次获得0, 0, 0, 1, 2, 3, 4分
此外,每个玩家在下注阶段每被下注一次,在本阶段扣1分。
例如:玩家A被玩家B下注了2分,被玩家C下注了1分,此时玩家A被下注了两次,因此在此时扣掉两分。
玩家的下注结果公开,游戏管理员对下注的结果进行结算。
若玩家A在下注阶段对玩家B下注$x$分,当玩家B是此时总分最高的玩家之一时,玩家A获得$x$分;否则玩家A失去$x$分。
若玩家A未进行下注,则玩家A的积分在本阶段不变。
可能有随机事件在此时进行结算。
结束阶段后,若该回合不为最后一回合,则开始新的回合,否则结束游戏。
脚本在python3上进行开发,需要numpy库的支持。
以Arcaea为例,可在bet_game/init_arc.py
下进行游戏的初始化。首先查看regular_quest
:
regular_quests = [
'7', 1.0,
'8', 2.0,
...
'ban', 'dropdead',
'ban', 'fallensquare',
...
]
regular_quest
为一个偶数长度的列表,每两个变量代表一个请求,游戏管理员可根据玩家需要自定义请求。请求分为两类:
-
权重请求:设置难度所代表的权重(默认为1.0)。例如
'8', 2.0,
代表等级8的权重设为2,在随机生成中有更高概率出现 -
禁曲请求:禁掉指定id的课题曲。例如
'ban', 'dropdead',
则代表禁止dropdead出现在课题曲曲池当中。
除了上面两种请求外,管理员也可以通过调用game.enable()
函数指定课题曲的曲包范围和难度范围。例如:
game.enable('core') # 启用Eternal Core曲包
game.enable('rei') # 启用Luminous Sky曲包
game.enable('ftr') # 启用FTR难度
默认所有的曲包和难度都不启用。若需要启用的曲包较多,也可以调用game.enable_all()
和game.disable()
使用,例如:
game.enable_all(en_package=True, en_difficulties=True)
# en_package为真表示启用所有曲包, en_difficulties为真表示启用所有难度
# 此时所有曲包和难度都已启用
game.disable('extend') # 禁用World Extend曲包
game.disable('byd') # 禁用BYD难度
在命令行中输入python
进入python shell
如游玩arcaea课题曲,在命令行中输入from init_arc import *
如游玩phigros课题曲,在命令行中输入from init_phi import *
在命令行中输入add(id)
即可添加玩家。例如添加玩家gausbon
,则在命令行中输入add('gausbon')
。玩家id长度不得超过15
游戏默认回合数为5,若需修改,则在命令行中输入reset(round)
进行修改,例如只需要3回合,则输入reset(3)
将所有玩家添加完成后,输入start()
开始游戏
在命令行中输入event()
即可抽取事件。例如:
>>> event()
-----------------------------------------------
Event: risk aversion
Players who lose bets will not be deducted points
-----------------------------------------------
Plaese start to draw the quest
事件可能会即时生效,因此不支持事件重新抽取
具体课题内容详见4.随机事件
在命令行中输入quest()
即可抽取事件。例如:
>>> quest()
-----------------------------------------------
turn: 1/5
The quest is conflict (siromaru + cranky) [Future 10].
Players are betting.
课题可以重新抽取,重复调用即可
当所有选手确认课题可以游玩时,使用verify()
进行确认
在命令行中输入bet(id1, id2, stake)
选择下注,输入bet(id1, None)
选择不下注。
>>> bet('p11111', None) # p11111选择不下注
>>> bet('p22222', 'p11111', 2) # p22222对p11111下注2分
为节省游戏管理员工作量,玩家id查找支持前缀查找。
例如游戏内有p11111
和p22222
两个玩家,则可以输入p1
代表p11111
玩家,因为所有玩家中仅p11111
的id前缀为p1
。但不可以输入p
代表p11111
玩家,因为两个玩家id的前缀都为p
>>> bet('p2', 'p1', 2) # p22222对p11111下注2分,前缀查找
在所有选手完成下注(或不下注)后,会弹出All players' bet are set
的提示信息,指导游戏管理员进行下一个阶段。
>>> bet('p1',None)
>>> bet('p2',None)
>>> bet('p3','p1',1)
All players' bet are set
同一个玩家的下注操作可以重复进行,后进行的操作会覆盖先进行的操作
>>> bet('p1','p2',1) # p1对2下注2分
>>> bet('p1',None) # p1不下注,覆盖上一条操作此时上一条下注命令作废
在命令行中输入play(id, score)
以下方式录入选手的游玩成绩。游玩阶段玩家id也支持前缀查找,见3.2.3
>>> play('p1', 9950000) # p111111的分数为9950000,前缀查找
在所有选手游玩结束后,会弹出All players' playing score are set
的提示信息,指导游戏管理员进行下一个阶段。
>>> play('p1',0)
>>> play('p2',9950000)
>>> play('p3',9980000)
All players' playing score are set
同一个玩家的游玩操作可以重复进行,后进行的操作会覆盖先进行的操作
>>> play('p1', 9950000) # p111111的分数为9950000,前缀查找
>>> play('p1', 9970000) # p111111的分数为9970000,覆盖上一条操作
在命令行中输入result()
,依次进行游玩、下注结算阶段。
>>> result()
-----------------------------------------------
turn: 1/5
Evaluating scores of SOUNDWiTCH (HATE) [Future 9+].
p1 (0+2-1=1) (result: 9990000) not betting
p2 (0+1=1) (result: 9980000) bets 2 point(s) on p3
p4 (0+0=0) (result: 9970000) not betting
p3 (0+0-1=-1) (result: 0) bets 1 point(s) on p1
-----------------------------------------------
turn: 1/5
Evaluating bet results.
p1 (1)
p3 (0)
p4 (0)
p2 (-1)
游玩结算阶段玩家信息展示格式为id(分数) (result: 游玩分数) 下注情况
例如p1 (0+2-1=1) (result: 9990000) not betting
表示p1的玩家信息。(0+2-1)
中:
-
0
代表结算前的积分 -
+2
代表p1在游玩阶段排名第一,获得2分 -
-1
代表p1被下注了一次(被p3下注),扣掉1分
下注结算阶段后,按照总分进行排名。
当所有回合结束时,程序会进行提醒并输出获胜者id
The game is over. Congrats to the winner:p1!
若想保留玩家重新开始,可以在命令行输入reset(round)
重新进行游戏,也可以通过add(id)
和remove(id)
进行玩家的增减。
为增添游戏的随机性和趣味性,游戏中设计了多种随机事件,尝试着在不同的事件发生时采用不同的策略吧!
-
绝对零分:玩家分数若为负数,则立刻置零
-
福利时间:下注结算阶段,下注成功的玩家可以获得双倍奖励
-
风险规避:下注结算阶段,下注失败的玩家不会扣除积分
-
赢家通吃:游玩结算阶段,仅第一名玩家可以获得$\lceil n/2\rceil$积分,其余不获得积分
-
正态分布:游玩结算阶段,排名为中位数玩家获得$\lfloor n/2\rfloor$积分,此后每向外一名获得积分数量减少1
-
精准扶贫:所有分数最低的玩家立刻获得n积分
-
不必犹豫:游玩结算阶段,成为下注目标的玩家不会被扣除积分
-
交通事故:结束阶段,若x位玩家同时下注到了同一个玩家,则此x位玩家每人扣x-1分
-
人气选手:结束阶段,被下注次数最多的玩家获得2*x分,x为该玩家的被下注次数
-
下次一定:下个回合的事件抽取阶段抽取两个事件(若有冲突,则后一事件覆盖前一事件)
-
你先别急:结束阶段,所有分数最低的玩家获得n积分
-
跟着歌唱:游玩阶段,玩家需进行唱打
-
无事发生:什么也没有发生
同时,对于不同的音乐游戏也有不同的课题。
arcaea课题:
-
越慢越水:游玩阶段,玩家需在2.0以下流速进行游玩
-
极速时刻:游玩阶段,玩家需使用最高速进行游玩
phigros课题:
-
天翻地覆:游玩阶段,玩家需旋转设备180°进行游玩
-
精准打击:游玩阶段,玩家需要上传游玩的accuracy而非分数