python解决三国杀头脑风暴(8人 大乔)后续

来源:互联网 发布:python学习资料 编辑:程序博客网 时间:2024/05/01 12:52

前几天编写的程序,有一点小失误,导致大乔的技能没有触发限制了,因此将原来的小程序做了调整。调整的主要方面是:大乔不能将杀流离给出杀的人其他的人可以随意流离。

class daqiao:    pai=0;    xue=3;    name=0;    def __init__(self,name,pai):        self.name = name+1;#名称        self.pai = pai;#初始化手牌    def get(self):#摸牌        self.pai+=2;        """        print str(self.name)+": Get 2 codes"        print str(self.name)+": have code "+str(self.pai);        """    def put(self):#出牌        self.pai-=1;        """        print str(self.name)+": Out 1 code"        print str(self.name)+": have code "+str(self.pai);        """    def skill(self,mopaiid,maxid):        if abs(self.name%maxid-1-mopaiid)==1:#是否为距离出杀大乔距离为1的人            if (self.name%maxid-1)>mopaiid:#出杀大乔下家                return self.judge(1)            else:#出杀大乔上家                return self.judge(2)        else:            return self.judge(3)    def judge(self,num):        if self.pai != 0:            self.pai -= 1;            """            print str(self.name)+": skill put 1"            print str(self.name)+": have code "+str(self.pai);            """            if num == 1:                return 1;#出杀大乔只可向后流离            elif num == 2:                return -1;#出杀大乔上家只可向前流离            else:                return random.choice([-1,1]);#其他大乔任意        else:            self.xue -= 1;            """            print str(self.name)+": blood -1"            print str(self.name)+": have blood "+str(self.xue);            """            return 0;
def Server():    mylist=[];    for i in range(0,8):        mylist.append(daqiao(i,4));#开局    mopaiid=0;    maxid=8;    attack=0;
    firstdead=0;    while(1):        if len(mylist)==1:#只剩一个人退出            break;        if mopaiid % maxid == 0:            mopaiid %= maxid;        mylist[mopaiid].get();#摸牌        mylist[mopaiid].put();#出牌        attack=mopaiid+1;        if (attack)%maxid==0:            attack %= maxid;        temp=mylist[attack].skill(mopaiid,maxid);#发动技能并确定流离方向        while temp:            attack+=temp;            if (attack)%maxid==0:                attack %= maxid;            temp=mylist[attack].skill(mopaiid,maxid);        if mylist[mopaiid].pai > mylist[mopaiid].xue:            mylist[mopaiid].pai=mylist[mopaiid].xue;        if mylist[attack].xue == 0:            print str(mylist[attack].name)+":dead"            if maxid==8:                firstdead=mylist[attack].name;            mylist.pop(attack);            maxid -= 1;            mopaiid -= 1;        mopaiid += 1;    print str(mylist[0].name)+":Winer"    return mylist[0].name,firstdead
通过对程序的调整,使得现在谁先死谁后死已经不能确定了,所以编写了一个循环程序来计算每个角色获胜的概率。

def main():    num=0;    wintemp=0;    faltemp=0;    num=input("Input the while number:")    winlist=[0,0,0,0,0,0,0,0];    fallist=[0,0,0,0,0,0,0,0];    i=num;    while(i):        wintemp,faltemp=Server();        winlist[wintemp-1] += 1;        fallist[faltemp-1] += 1;        i-=1;    for i in range(0,8):        print i+1,"Win:",winlist[i]/float(num);        print "Fal:",fallist[i]/float(num);

通过计算机大量的运算,位于第一位和第二位的角色获胜的概率比其他角色高出接近10倍。第三位的角色死亡概率最



原创粉丝点击