谁是卧底
谁是卧底也是深受很多人喜欢的游戏,起码要三人以上才能玩,大致分为几个阶段:
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中字典的原理,利用键值结构实现了动态赋值变量名