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

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

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倍。第三位的角色死亡概率最



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值