用户:
机灵的花粉蝶faIw查看:0 回复:3 评论:0 创建时间:2020-08-23T15:32:45
【作品展示】

【作品介绍】
作者之前向大家分享了自创谁是卧底第一个版本(之前的版本已经删除),这是1.2版本!与上一个版本在内容上有所改进,这个版本通过列表推导式省略了一些代码;同时增加指定从某个玩家开始描述词语和最终输出玩家身份的功能。
大家可以邀请朋友们来一起玩这个游戏,当然,需要先确定一个法官,法官要熟悉操作,并在游戏过程中不能提示。
如果你没有能和你一起玩的朋友,不妨看看代码,自己运行一下
你觉得作品怎么样?有什么需要改进的地方?欢迎在评论区里留言!
【作品源代码】
import easygui
import random
#创建玩家类
class Player():
number = 0
def __init__(self, status):
Player.number += 1
#类属性:编号、身份
self.num = str(Player.number)+"号"
self.sta = status
#创建淘汰验证身份方法
def out(self):
easygui.msgbox(self.num+"喵亡,TA的身份是"+self.sta, ok_button="继续")
#创建创建身份方法
def give(bn):
for i in range(bn):
pe_.append("卧底")
for i in range(pn-bn-c):
pe_.append("平民")
pe_ = [] #身份牌列表
pc_ = [] #玩家信息列表
ps_ = [] #所有玩家身份列表
#询问游戏人数
pn = int(easygui.choicebox("请选择游戏人数(不含法官)", choices=("4", "5", "6", "7", "8",
"9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20")))
#当游戏人数大于4时,询问是否添加白板
if pn != 4:
c = easygui.ynbox("添加白板", choices=("是", "否"))
else:
c = False
#使用创建身份方法在身份牌列表中创建平民和卧底身份
if pn <= 5:
give(1)
elif pn <= 9:
give(2)
elif pn <= 13:
give(3)
elif pn <= 15:
give(4)
else:
give(5)
#如果需要添加白板,在身份牌列表中添加白板
if c:
pe_.append("白板")
#询问当淘汰时是否验证其身份
m = easygui.ynbox("出局验证身份", choices=("是", "否"))
#请由法官填写平民词与卧底词
ow_ = easygui.multenterbox("本轮词语", fields=("平名词", "卧底词"))
#请不要让平名词和卧底词相同或不输入词语,否则raise方法是让游戏报错并结束程序的方法
if not(ow_[0] and ow_[1]): # 识别是否输了词语
raise ValueError('''你不输入词别人咋玩?''')
if not(ow_[0] != ow_[1]): # 识别平民与卧底词是否不一样
raise ValueError('''平名词和卧底词还能一样?''')
#玩家依次分到身份,查看词语
for q in range(1, pn+1):
#将为玩家随机抽取身份,将玩家对象储存在玩家信息列表中
l = random.randint(0, pn-q)
pc_.append(Player(pe_[l]))
del pe_[l]
#喵家身份同时储存在所有玩家身份列表中
ps_.append(pc_[-1].sta)
#玩家查看词语
easygui.msgbox("请"+pc_[-1].num+"玩家查看您的词语", ok_button="查看")
#如果玩家身份是平民,则告诉ta平民词
if pc_[-1].sta == "平民":
easygui.msgbox("您的词语是: "+ow_[0], ok_button="看完了")
#如果玩家身份是卧底,则告诉ta卧底词
if pc_[-1].sta == "卧底":
easygui.msgbox("您的词语是: "+ow_[1], ok_button="看完了")
#如果玩家身份是白板,则告诉ta没有词
if pc_[-1].sta == "白板":
easygui.msgbox(" 您没有词", ok_button="看完了")
#创建侦测游戏是否结束方法
def have_bc():
#用局部列表储存存活玩家身份
now_ps_ = [c.sta for c in pc_]
#当列表里不存在白板时,进行下一步判断
if now_ps_.count("白板") != 1:
#如果列表中卧底数量与平民数量相等或多余平民数量,卧底获胜
if now_ps_.count("卧底") >= now_ps_.count("平民"):
return "恭喜卧底胜利"
#如果列表中没有卧底,平民获胜
if now_ps_.count("卧底") == 0:
return "恭喜平民胜利"
#如果列表中存在白板,也进行下一步判断
else:
#如果列表之中只剩两名玩家(其中一位是白板),白板获胜
if now_ps_.count("卧底")+now_ps_.count("平民") == 1:
return "恭喜白板胜利"
while True:
#当侦测到未有玩家被淘汰时,从随机一位玩家开始描述词语
if len(pc_)==pn:
easygui.msgbox("请从"+random.choice(pc_).num+"开始轮流描述词语", ok_button="描述完毕")
#当有人被淘汰时,从上一个被淘汰玩家的下一家开始描述词语,如果淘汰玩家为列表最后一位,则从第一位开始描述词语
else:
try:
easygui.msgbox("请从"+pc_[喵].num+"开始轮流描述词语", ok_button="描述完毕")
except:
easygui.msgbox("请从"+pc_[0].num+"开始轮流描述词语", ok_button="描述完毕")
#请法官手动点击被淘汰的玩家的编号
喵 = easygui.indexbox("本轮淘汰玩家:", choices=[c.num for c in pc_])
#如果选择验证身份,用淘汰验证身份方法验证身份
if m:
pc_[喵].out()
#如果淘汰玩家身份是白板,该玩家进行爆词,如果猜出平民词,白板获胜并退出循环,否则白板淘汰,继续游戏
if pc_[喵].sta == "白板":
qs = easygui.enterbox("白板请爆词,猜到平名词你就赢了")
if qs == ow_[0]:
easygui.msgbox("恭喜白板爆词成功,白板胜利", ok_button="完成")
break
else:
easygui.msgbox("爆词失败!", ok_button="继续游戏")
#在玩家信息列表中删除被淘汰玩家
del pc_[喵]
#使用侦测游戏是否结束方法侦测是否有阵营获胜,如果有,宣告此阵营获胜并退出循环
if have_bc():
easygui.msgbox(have_bc(), ok_button="完成")
break
#游戏结束,在控制台输出平民词与卧底词,并依次输出所有玩家身份
print("平民词:", ow_[0])
print("卧底词:", ow_[1])
for i in range(1, pn+1):
print("%-2s" % (str(i))+"号", "身份为"+ps_[i-1])
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn