摘要:
题目来源于LeetCode的一道竞赛题
(链接:https://leetcode-cn.com/circle/article/EJf9yW/)
1.分析题目:
题目描述 小李的同事们很喜欢玩狼人杀,每次都找他当法官。小李觉得很累,决定写一个程序来跑出狼人杀的结果。 狼人杀是一个桌游。常见局由 12 名玩家和 1 名法官组成。12 名玩家坐成一个圈。每个玩家在游戏开始时随机抽取一张角色卡牌,只能知道自己的身份。 玩家分为两个阵营,狼人和村民。 狼人的胜利条件是 狼人阵营的玩家数 >= 村民阵营的玩家数 村民的胜利条件是 所有狼人出局 游戏过程 游戏分为夜晚和白天。 (夜晚) 拿到狼人身份的玩家睁眼,其他人闭眼。狼人们商量后选择一名玩家击杀; (白天) 所有人睁眼; 法官宣布昨晚出局的玩家,以及熊是否咆哮了; 出局的玩家离开游戏,发动技能(如果有); 法官检查胜利条件,如果任何一个满足则结束游戏; 在场玩家进行一轮发言,并票选最可疑的玩家出局; 被选中的玩家离开游戏,发动技能(如果有); 法官检查胜利条件,如果任何一个满足则结束游戏; 重复 1; 游戏角色 【村民阵营】x8 村民(villager, 下称"vil") x5:没有特殊技能 猎人("hunter") x1:技能是在出局时(被投票或被狼人击杀)可以向所有人亮出底牌选择带走一名玩家 白痴("idiot") x1:技能是在白天被投票出局后自动亮出底牌并且不出局 驯熊人(bear tamer, 下称"bear") x1:(简称熊)每天夜里,如果相邻两名存活玩家有任何一个是狼人,熊会发出咆哮。如果驯熊人已经死亡,则这一局熊不再咆哮。驯熊人如果当晚被杀,熊也不会咆哮。(相邻指向左找第一名存活玩家和向右找第一名存活玩家,当晚被杀的玩家也视为死亡) 【狼人阵营】x4 狼人(werewolf, 下称"ww") x4:可以知道同伴,但不知道好人的具体角色。 对于所有人: 白天可以投票 除了发言的环节,玩家不能发言或者交换信息 模拟器设定 我们用 c 来模拟每名玩家在游戏开始时在他人眼中的可信度。0 < c < 100 。越小则越像狼人 狼人只击杀非狼人,并且在场玩家知晓这点 在投票环节,c 最低的玩家出局。如果有多个目标,则座位号小号出局。 狼人优先击杀熊,其他时候击杀 c 最高的好人(村民阵营),如果有多个目标,则击杀座位号小号。 玩家的 c 变成 0 或者 100 表示已知身份: 铁狼 或者 铁好人 玩家的 c 会根据大家获取到的信息发生改变, 所有人看到的可信度 c 一起更新。注意,改变的时机需要遵守游戏过程: 猎人出局或白痴被投票出局时一定发动技能,使 ta 的 c 变为 100;猎人会射杀 c 最低的玩家,如果有多个目标,则射杀座位号小号 第一天发言时,如果驯熊人依然存活,驯熊人会公布身份,使 ta 的 c 变为 100(在模拟器中狼不会假装自己是熊) 如果熊咆哮了,人们开始怀疑其左右的未知身份玩家,这使他们的 c 变为原来的一半 (向下取整, 如果原来是 1 则不变 ) 如果熊咆哮了且左右的在局一方为铁好人,则另一方成为铁狼;如果其中一方后来被发现是铁好人,人们也会更新另一方的 c 如果熊在场且没有咆哮,则左右的在场玩家成为铁好人 如果驯熊人在第一次发言前死亡,则场上玩家不知道其位置,也无法利用熊的咆哮信息 如果玩家在夜间死亡,则该离场的玩家也被认为是铁好人
(1)首先得要有一个(‘全局’)数组,里面包含游戏中的角色(我是由外界输入,命名a1_all)
def __init(self,*args):
self.a1_all = args
(2)其次要完成角色中的各个功能:
(2.1)判断输赢(黑夜,白天):
(2.2)熊的功能(作为一个新手懒的截图,直接复制代码):
def xiongren(self): import time if 'wolf' in self.a1_all: time.sleep(2) print('熊咆啸了')
(2,3)女巫功能:
def nvwu(self,per): methor = str(input('是否使用解药或者毒药(use_j_or_d_or_n ): ')) if methor == 'j': self.a1_all.append(per) elif methor =='d' : print(self.a1_all) per_one = str(input('请选择谁: ')) self.a1_all.remove(per_one) else: self.baitian()
(2.4)猎人功能:
def lieren(self): print(self.a1_all) per_one = str(input('请选择谁: ')) self.a1_all.remove(per_one)
(3)场景分析(白天,晚上):
def baitian(self): day = 1 print('今天是第{}天'.format(day)) day += 1 import random per_two = random.choice(self.a1_all) print('今天放逐的人{}'.format(per_two)) if 'xiong' in self.a1_all: self.xiongren() else: print('熊没有咆哮') if per_two == 'lieren': self.lieren() self.a1_all.remove(per_two) self.panduan_baitian() print('进入夜晚!!!!',end ='\n') self.heyei()
def heyei(self): print(self.a1_all) methor_one = str(input('要杀谁: ')) if methor_one =='lieren': self.lieren() self.a1_all.remove(methor_one) self.nvwu(methor_one) self.panduan_heyei()
(4)游戏运行
def jiance(self): self.baitian()
langrensha(la()).jiance()
(5)数据怎么来了??? ,别急, ----》Mysql
# coding=gbk """ hbahahahhahahah """ def la(): import pymysql conn = pymysql.connect(host ='localhost', user='root', password='123', database='zhang', charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql1 = "use langrensha;" cursor.execute(sql1) sql = "select * from lang;" cursor.execute(sql) ret1 = cursor.fetchall() # print(ret1) ac = [] for x in ret1: # print(x['xingming']) ac.append(x['xingming']) return ac
(6)ok!!!! 大工完成,看一下运行结果吧
(7)总结自己出错的类别吧,
(7.1)
SyntaxError: Non-UTF-8 code starting with '\xa3' in file
原因:中文问题
解决办法:开头前加一个
# coding=gbk
(7。2)mysql密码忘记怎么办???
解决办法:别急,先输入‘mysqld --skip-grant-tables ’,目的强制进入mysql,在输入mysql就可以了(管理员权限)
(8)(番外!!!!)
(作者)注:本来原本是这样
def __init__(self,a1_all): self.a1_all = a1_all
我想改为这样
def __init__(self,*args):
self.a1_all = args
目的为了想传更多的参数,是游戏更加可变玩性,哪知道,args的格式为tuple类型的,着实给我当头一棒,但是对于我!!!!(一个新手菜鸟玩家),怎么难得了我!!!哼,我直接把tuple 改为 list 类型 !!!!!,成功!!!!!(附截图)
(9)最后!!!!,我想说,最近由于疫情的原因,大家还是少出门,少聚会,武汉加油!!!!!,中国加油!!!!!
这就是我写的(原创),望大家谅解!!!!有时间点个赞!!!,作者不胜感激!!!!!!!