python实现 谁是卧底游戏

Python027

python实现 谁是卧底游戏,第1张

#!/usr/local/bin/python3    

    

import random    

from spyword import spyword    

    

num=int(input('请输入玩家数(至少为3)\n'))    

#卧底玩家    

spy=random.randint(0,num-1)    

    

#随机产生词语 定义词语列表 计算玩家票数的列表 统计死亡玩家的列表    

list_rand=spyword.popitem()    

word=[]    

cnt=[]    

dead=[]    

    

#给三个列表赋值    

for i in range(0,num):    

    word.append('a')    

    cnt.append(0)    

    dead.append(num+2)    

    

#给玩家词语 其中print是调试用的,sanmeVote是出现相同票数的标志,spyWin是卧底胜利的判决条件    

for i in range(0,num):    

    if (i==spy):    

        word[i]=str(list_rand[1])    

    else:    

        word[i]=str(list_rand[0])    

    print (word[i])    

sameVote=0    

spyWin=0    

#游戏开始    

for x in range(0,num-1):    

    for k in range(0,num):    

        if ((k not in dead) & (sameVote==0)):    

            print ('%d号玩家发言时间'%(k+1))    

    print ('发言环节结束')    

            

    #将各位玩家的票数置0    

    for j in range(0,num):    

        if (j not in dead):    

            cnt[j]=0    

        

    for j in range(0,num):    

        if (j not in dead):    

            vote2p=int(input('请%d号玩家投票'%(j+1)))-1    

            cnt[vote2p]=cnt[vote2p]+1    

            sameVote=0    

    

    for y in range(0,num):    

        if((cnt[y]==max(cnt)) & (y!=cnt.index(max(cnt)))):    

            print ('不止一位玩家得到最高票数,请这些玩家重新发言')    

            sameVote=1    

        

    if (sameVote==0):    

        dead[x]=cnt.index(max(cnt))    

        if (dead[x]==spy):    

            print ('卧底得到最多票数,游戏结束')    

            spyWin=1    

            break    

        print ('%d号玩家被冤死!'%(dead[x]+1))    

            

#游戏结束    

if(spyWin==0):    

    print ('只剩两名玩家,卧底胜利!')

spyword是自定义的卧底词字典,运行时把这个文件放在python的工作目录下,就可以让python程序调用该字典了。

小弟不才,也写了一个程序,没有用到上面说的方法,我也不知道什么的方法怎么搞!!我的思维是完全简单的模拟人的思维过程,算法叫相当的不优秀,不过还是有扩展的空间的,因为只需要改变某些值,就能很好的处理更多条件的情况。我用一数组a来存放每个人说话是真假情况,用1表示真话,0表示假话。再用b表示每个人可能的犯罪情况,用0表示有可能是凶手,用1表示是凶手,用3表示是不是凶手,因为每个b[]只能加一到两次,所以这样的值就够了,考虑b中元素可能的取值,然后在再后面加上相应的判断,判断什么情况合理,考虑所有的能够正确判断凶手的情况就行了,如果加条件的话,只需加if和相应的判断就可。算法的时间复杂性不是很好的。反正还是做出来了啊 !!!!在开始你没有加条件的时候,我是穷举了所有的能正确判断的情况!!

#include <stdio.h>

void main()

{

int a[4]={0},b[4]={0}

int i,j,m=0,n=0,flag

for (i=0i<4i++ )

{

n=0

flag=1

for (j=0j<4j++ )

{ b[j]=0

a[j]=1

}

a[i]=0 //设置说话的真伪情况

if(a[0]==0)

b[0]+=1

else b[0]+=3

if(a[1]==0)

{ b[2]+=3

}

else b[2]+=1

if(a[2]==0)

{ b[3]+=3

}

else b[3]+=1

if(a[3]==0)

{ b[3]+=1

}

else b[3]+=3//具条件的判断过程,得到了每个人的可能的犯罪情况

for (j=0j<4j++ )

{

if(b[j]==1||b[j]==2)

n+=1

if(b[j]==3||b[j]==6) //不知道有没有3个不可能,一个不知道的情况,加上吧,

m+=1

if(b[j]==4) //有4就不行,因为它是1+3 来的,也就是一定是和一定不是的和

{ flag=0

}

}

if((n==1&&flag)||(n==0&&m==3&&flag))//判断什么情况是合理的,打印出来

for (j=0j<4 j++ )

{ printf(" %d",a[j])

}

}

}

//如果是问题规模扩大,就只需要改判断就行了,还是很方便的

1、某宾馆发现一具尸体,医生对死者进行检查后,说:“从最近的距离向心脏打了一发子弹,因此立即死亡。”警察立刻展开对此事的调查,传讯了三位有嫌疑的人。三人分别作了如下的证词:

甲:死者不是乙杀的,是自杀的。

乙:他不是自杀的,是甲杀的。

丙:不是我杀的,是乙杀的。

后经查明,每个人的话都只有一半是正确的。

根据以上信息,说出谁是凶手。

2、某市发生了一起凶杀案,凶手将被害人杀死后刚逃跑,就有人发现了尸体,打110报警。刑警中心立即出动,将犯罪嫌疑人抓获归案。预审员在审问犯罪嫌疑人时,发现他是一个聋哑人,便对他进行书面盘问,书面盘问结束后,预审员沉思了一会儿,对这个聋哑人说了一句话,便立即发现聋哑人是作案者,是个伪装成聋哑人的罪犯。

那么,预审员说了一句什么话使罪犯马上露出了马脚?

3、德国的卡尔斯鲁厄市的警方,在一宗杀人案现场,发现留有凶犯的几滴鼻血。经化验,这鼻血的血型是AB型。经侦查一名叫汉斯的中年司机有犯罪嫌疑,但在警方前往拘捕时,汉斯出国了,因而无法查出他的血型是什么。于是,警方转而调查汉斯父母的血型。他父亲的血型是O型,母亲的血型为AB型。

请问:汉斯是凶手吗?

4、一个闷热的夏天,宋探长无意走到好友大光教授的门前。他按了半天门铃也没有人开门,他看见窗户大开着,意识到很有可能出了什么事情,使用身体撞开了大门。他进到客厅,发现卧室的门紧闭着,但锁孔好像已经从里面琐死,他就从窗户爬进去,发现大光教授己死在床上。房间内的一切现象似乎都表明他是自杀而死。

在锁孔上还插着一把钥匙,经宋探长的提取,发现留下的拇指和食指指纹同大光教授的右手拇指和食指指纹一样,这更证明了宋探长关于大光教授反锁门后自杀的推断。但细心的宋探长经过反复推敲,还是看出了这是一场伪造的自杀现象。

那么他又是从哪看出破绽的?

5、英国一名私家女侦探到泰国调查一起黑帮凶杀案时,在她所住的饭店被枪杀。附近警长带助手赶到现场,见女侦探倒在酒店房间的窗下,胸部中了两枪,手里紧握着一支口红。警长撩起窗帘一看,只见玻璃上留着一行用口红写下的数字:809。又从女式提包中找出一张卷得很紧的小纸条,纸条上写着:“己查到三名嫌疑人,其中一人是凶手。这三人是:代号608的光,代号906的岛,代号806的刚。”

警长沉思片刻,指着纸条上的一个人说:“凶手就是他!”根据警长的推断,警方很快将凶手缉拿归案。

请问,凶手是谁?为什么?