猫史档案馆


【Python作品分享】谁是卧底【作品秀】

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


【作品展示】

center_image

 

【作品介绍】

作者之前向大家分享了自创谁是卧底第一个版本(之前的版本已经删除),这是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


回复

上一页1 页 / 共 1下一页
气人训练师扣子气人训练师扣子

不错哟

点赞0


评论


SonataleSonatale

6666666

点赞0


评论


BZIClawLYNEYBZIClawLYNEY

玩不了,没有叫 easygui 的库

点赞0


评论