捋的规则 狼人杀真的是社恐克星

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/10/8 上午3:28
# @Author : Mini-Right
# @Email : www@anyu.wang
# @File : 狼人杀优化.py
# @Software : PyCharm
# @Description : 白狼王骑士
from datetime import datetime, timedelta
from enum import Enum
class WerewolfRoles(Enum):
WEREWOLF = '狼'
VILLAGER = '民'
SEER = '预言家'
KNIGHT = '骑士'
GUARDIAN = '守卫'
WHITE_WEREWOLF = '白狼王'
class WerewolfKilling(object):
def __init__(self, seat_map: dict):
self.seat_map = seat_map
self.seer = None
self.cards = []
self.first_kill = None
self.check = []
self.cavalier = None
self.destructs = []
self.kills = []
self.remain = None
self.end_time_minute = None
def calc_cards(self):
"""
第一位 神 预言家
第二位 民 预言家下的民
第三位 狼 预言家下的狼
预言家在小号则顺时针转盘计算
如果预言家是1号 则卡神换成骑士
"""
seer_position_updated = [key for key, value in self.seat_map.items() if value == WerewolfRoles.SEER.value][0]
next_positions = list(self.seat_map.keys())[list(self.seat_map.keys()).index(seer_position_updated) + 1:] + list(self.seat_map.keys())[:list(self.seat_map.keys()).index(seer_position_updated) + 1]
next_werewolf_updated = next((pos for pos in next_positions if self.seat_map[pos] == WerewolfRoles.WEREWOLF.value), None)
next_villager_updated = next((pos for pos in next_positions if self.seat_map[pos] == WerewolfRoles.VILLAGER.value), None)
self.seer = next((number for number, role in self.seat_map.items() if role == WerewolfRoles.SEER.value), None)
# 如果预言家是1号 则卡神换成骑士
if self.seer == 1:
seer = next((number for number, role in self.seat_map.items() if role == WerewolfRoles.KNIGHT.value), None)
self.cards = [self.seer, next_villager_updated, next_werewolf_updated]
print('卡', self.cards)
def calc_first_kill(self):
"""
首刀 守卫
"""
self.first_kill = next((number for number, role in self.seat_map.items() if role == WerewolfRoles.GUARDIAN.value), None)
print('首刀', self.first_kill)
def calc_check(self):
"""
第一位 特殊狼
第二位 卡狼下面的狼
第三位 卡狼(预言家下的狼)
"""
check_one = next((number for number, role in self.seat_map.items() if role == WerewolfRoles.WHITE_WEREWOLF.value), None)
check_two = next((number for number, role in self.seat_map.items() if number > self.cards[2] and role == WerewolfRoles.WEREWOLF.value), None)
if check_two is None:
check_two = next((number for number, role in self.seat_map.items() if role == WerewolfRoles.WEREWOLF.value), None)
check_three = self.cards[2]
self.check = [check_one, check_two, check_three]
print('验', self.check)
def calc_cavalier(self):
"""
决斗 特殊狼
"""
self.cavalier = next((number for number, role in self.seat_map.items() if role == WerewolfRoles.WHITE_WEREWOLF.value), None)
print('骑戳', self.cavalier)
def calc_destructs(self):
"""
卡狼下的狼顺序自爆
如果小狼是1号 则最先自爆
"""
if self.seat_map.get(1) == WerewolfRoles.WEREWOLF.value:
self.destructs.append(1)
for number, role in self.seat_map.items():
if role == WerewolfRoles.WEREWOLF.value and number != self.cards[2] and number not in self.destructs:
self.destructs.append(number)
print('爆', self.destructs)
def calc_kills(self):
"""
第一位 第一位不卡民
第二位 骑士
第三位 第二位不卡民
如果预言家是1号 第二位变成预言家
:return:
"""
kill_one = next((number for number, role in self.seat_map.items() if role == WerewolfRoles.VILLAGER.value and number != self.cards[1]), None)
kill_two = next((number for number, role in self.seat_map.items() if role == WerewolfRoles.SEER.value and self.seer == 1), None)
if not kill_two:
kill_two = next((number for number, role in self.seat_map.items() if role == WerewolfRoles.KNIGHT.value), None)
kill_three = next((number for number, role in self.seat_map.items() if role == WerewolfRoles.VILLAGER.value and number != self.cards[1] and number != kill_one), None)
self.kills = [kill_one, kill_two, kill_three]
print('刀', self.kills)
def calc_remain(self):
"""
推 剩下的非卡民
:return:
"""
self.remain = next(
(
number for number, role in self.seat_map.items()
if role == WerewolfRoles.VILLAGER.value and number != self.cards[1] and number not in self.kills),
None
)
print('推', self.remain)
def calc_end_time(self):
"""
结束时间 当前时间后25分钟
:return:
"""
current_time = datetime.now()
end_time = current_time + timedelta(minutes=25)
self.end_time_minute = end_time.minute
print('结束时间', self.end_time_minute)
@staticmethod
def template():
return """
💠小右骑士车💠
{end_time_minute}下课 {cards} 狼卡
首夜:刀{first_kill}
预验:{check}
白天:骑戳{cavalier}
顺爆:{destructs}.推{remain}
第②夜狼刀:{kills}
"""
def generate(self):
self.calc_cards()
self.calc_first_kill()
self.calc_check()
self.calc_cavalier()
self.calc_destructs()
self.calc_kills()
self.calc_remain()
self.calc_end_time()
calc_info = {
'cards': self.cards,
'first_kill': self.first_kill,
'check': self.check,
'cavalier': self.cavalier,
'destructs': self.destructs,
'kills': self.kills,
'remain': self.remain,
'end_time_minute': self.end_time_minute,
}
for k, v in calc_info.items():
if isinstance(v, list):
calc_info[k] = '.'.join([str(_) for _ in v])
text = self.template().format(**calc_info)
print(text)
return text
if __name__ == '__main__':
seat_map = {
1: '预言家',
2: '女巫',
3: '守卫',
4: '狼',
5: '狼',
6: '狼',
7: '骑士',
8: '白狼王',
9: '民',
10: '民',
11: '民',
12: '民',
}
WerewolfKilling(seat_map).generate()