用python实现谁是卧底小游戏

谁是卧底

谁是卧底也是深受很多人喜欢的游戏,起码要三人以上才能玩,大致分为几个阶段:
1.分配平民词语和卧底词语--->
2.玩家依次发言--->
3.根据发言投票认为谁是卧底--->
4.得到票数最多的玩家出局--->
5.出局玩家刚好是卧底则平民胜利,如果出局玩家是平民则被冤死并继续第2步,当剩下的平民只有1个时卧底胜利。
特殊情况是,出现两名或以上的玩家票数相同,则相同票数的玩家重新发言,然后全体针对这几个玩家投票。

设计思路

1、创建游戏类
2、创建玩家类
玩家类拥有名字,是否卧底,拥有票数的属性
3、玩家发言
4、玩家投票
5、判断出局
6、判断是否结束游戏

代码实现

import random

class Game:
    """ 游戏类 """
    game_list=[]
    
    def __init__ (self):
        """ 初始化类时加入列表 """
        Game.game_list.append(self)
        
    def wd_r ():
        """ 随机一个卧底 """
        random.choice(Game.game_list).wd=1
        
    def speak (self,talk):
        """ Function doc """
        self.talk=talk
        
    def vote_r (self,name):
        """ 玩家投票 """
        for i in Game.game_list:
            if i.name==name:
                i.vote+=1
    
    def judge ():
        """ 判决出局,判断是否结束游戏 """
        vote=0
        player=0
        weather=0
        #判断哪个玩家的票数最高
        for i in Game.game_list:#判断最高票数玩家的票数
            if i.vote>vote:
                vote=i.vote
        for i in Game.game_list:#选出最高票数玩家的对象
            if i.vote==vote:
                weather+=1#判断获得最高票数玩家的个数
                player=i#取出最高票数玩家对象
        if weather == 1:#判断最高票数玩家是否只有一个
            print('玩家%s被出局'%player.name)
            if player.wd == 1:#判断出局玩家是否卧底
                print('卧底出局,平民胜,游戏结束')
                return 0
            else:
                Game.game_list.remove(player)
                if len(Game.game_list)<=2:#判断剩余玩家人数
                    print('卧底未出局,卧底胜,游戏结束')
                    return 0
                print('卧底未出局,游戏继续')   
                return 1
        else:
            print('存在票数相同的玩家,游戏继续')
            return 1
        

        
class Player(Game):
    """ 玩家类 """
    
    def __init__ (self,name,wd=0,vote=0):
        """ 初始化玩家类 """
        self.name=name
        self.wd=wd
        self.vote=vote
        super().__init__()


if __name__=='__main__':
    flag=1
    while flag:#输入玩家数量
        num=int(input('请输入玩家数量(至少3个):'))
        if num>=3:
            flag=0
        else:
            print('请输入正确人数')
        n=num
        
    names=locals()#动态创建玩家对象
    for i in range(num):
        n-=1
        name=input('请输入第%d个玩家名字:'%(num-n))
        names['player'+str(i)]=Player(name)
        # ~ exec('player{} = {}'.format((num-n),Player(name)))
    
    Game.wd_r()#随机将一个玩家变成卧底
    
    flag=1
    while flag:
        for i in Game.game_list:#玩家发言
            i.speak(input('请玩家%s发言:'%i.name))
        
        for i in Game.game_list:#输出玩家发言
            print('玩家%s发言:%s'%(i.name,i.talk))
        
        for i in Game.game_list:#投票
            i.vote_r(input('请玩家%s投票(玩家名):'%i.name))
        
        flag=Game.judge()#判决出局
        
        for i in Game.game_list:#票数清零
            i.vote=0

总结

	在实现过程中遇到了动态命名创建的对象难题,学习了新的方法:
	names=locals()
	names['player'+str(i)]=Player(name)
	该方法通过python中字典的原理,利用键值结构实现了动态赋值变量名
  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值