本帖最后由 jinjazz 于 2008-04-30 18:31:57 编辑

解决方案 »

  1.   

    <HTML>
     <BODY>
      <script language="javascript">
            //计时器
            function getTickCount()
            {
                var now = new Date();
                var ticks = now.getTime();
                return ticks;
            }
            //出拳参数
            var UserInfo=function()
            {
                this.finger=-1;
                this.sum=-1;
            }
            //酒鬼类
            var Drunkard=function()
            {
                this.Come=function(userInfo)
                {
                }
                this.OutCome=function(otherFinger,otherSum,otherResult,selfFinger,selfSum,selfResult)
                {
                   
                }
            }
            //酒馆类
            var Drunkery=function(eastDrunkard,westDrunkard)
            {
                //参数继承酒鬼类
                eval(eastDrunkard+".prototype=new Drunkard()");
                eval(westDrunkard+".prototype=new Drunkard()");
                 
                //中断标志 
                var bExit=false;
                
                //超时控制
                var eastTime=0;var westTime=0;
                var eastTimeoutCount=0;var westTimeoutCount=0;
                
                var eastPlayer;var westPlayer;
                
                //初始化东家
                try
                {
                    eastTime=getTickCount();
                    eastPlayer=eval("new "+eastDrunkard+"();");
                    eastTime=getTickCount()-eastTime;
                }
                catch(e)
                {
                    document.writeln(eastDrunkard+"初始化失败");
                    bExit=true;
                }
                //初始化西家
                try
                {
                    westTime=getTickCount();
                    westPlayer=eval("new "+westDrunkard+"();");
                    westTime=getTickCount()-westTime;
                }
                catch(e)
                {
                    document.writeln(eastDrunkard+"初始化失败");
                    bExit=true;
                }
                
                if(bExit)
                {
                    return;
                }
                
                //超时判断
                if(eastTime>1000)
                {
                    document.writeln(eastDrunkard+"初始化严重超时");
                    bExit=true;
                }
                if(westTime>1000)
                {
                    document.writeln(westDrunkard+"初始化严重超时");
                    bExit=true;
                }
                
                if(bExit)
                {
                    return;
                }
                
                //比赛参数
                var  eastInfo=new UserInfo();
                var  westInfo=new UserInfo();
                
                //分数
                var eastScore=0;
                var westScore=0;
                
                //开始1000局
                for(var i=0;i<1000;i++)
                {
                    //每局最多100次,直到分出胜负或有人严重超时
                    for(var j=0;j<100;j++)
                    {
                        
                        var eastResult="Unknow";var westResult="Unknow";
                        
                        //出拳,抛出异常算一次犯规
                        try
                        {
                            eastTime=getTickCount();
                            eastPlayer.Come(eastInfo);
                            eastTime=getTickCount()-eastTime;
                        }
                        catch(e)
                        {
                            eastResult="Foul";
                        }
                         try
                        {
                            westTime=getTickCount();
                            westPlayer.Come(westInfo);
                            westTime=getTickCount()-westTime;
                        }
                        catch(e)
                        {   
                             westResult="Foul";
                        }
                        if(eastTime>1000)
                        {
                            document.writeln(eastDrunkard+"出拳严重超时");
                            bExit=true;
                        }
                        if(westTime>1000)
                        {
                            document.writeln(westDrunkard+"出拳严重超时");
                            bExit=true;
                        }
                        if(bExit)
                        {
                            return;
                        }
                        //超时判断
                        if(eastTime>100)
                        {
                            eastResult="Timeout";
                            eastTimeoutCount++;
                        }
                        if(westTime>100)
                        {
                            westResult="Timeout";
                            westTimeoutCount++;
                        }
                        //犯规判断
                        if(eastInfo.finger<0 || eastInfo.finger>5 || eastInfo.sum<eastInfo.finger || eastInfo.sum>eastInfo.finger+5)
                            eastResult="Foul";
                        if(westInfo.finger<0 || westInfo.finger>5 || westInfo.sum<westInfo.finger || westInfo.sum>westInfo.finger+5)
                            westResult="Foul";
                        
                        //如果都没有犯规或超时则计算胜负
                        if(eastResult=="Unknow" && westResult=="Unknow")
                        {
                            if(eastInfo.finger+westInfo.finger==eastInfo.sum)
                                eastResult="Win";
                            if(eastInfo.finger+westInfo.finger==westInfo.sum)
                                westResult="Win";
                        }
                        //结果相同算打平
                        if(eastResult==westResult)
                        {
                            eastResult="Dogfall";
                            westResult="Dogfall";
                        }
                        else
                        {
                            if(eastResult=="Win")
                                westResult="Lost";
                            if(westResult=="Win")
                                eastResult="Lost";
                            if(eastResult=="Foul")
                                westResult="Win";
                            if(westResult=="Foul")
                                eastResult="Win";
                            if(eastResult=="Timeout")
                                westResult="Win";
                            if(westResult=="Timeout")
                                eastResult="Win";
                        }
                         
                        //犯规扣100分,对方加1分
                        if(eastResult=="Win")eastScore++;
                        if(eastResult=="Foul")eastScore-=100;
                        if(westResult=="Win")westScore++;
                        if(westResult=="Foul")westScore-=100;
      

  2.   

    //输出结果
                         try
                        {
                            eastTime=getTickCount();
                            eastPlayer.OutCome(westInfo.finger,westInfo.sum,westResult,
                                eastInfo.finger,eastInfo.sum,eastResult);
                            eastTime=getTickCount()-eastTime;
                        }
                        catch(e)
                        {
                            //抛出异常直接扣总分
                            eastScore-=100;
                        }
                        try
                        {
                        westTime=getTickCount();
                        westPlayer.OutCome(eastInfo.finger,eastInfo.sum,eastResult,
                            westInfo.finger,westInfo.sum,westResult);
                        westTime=getTickCount()-westTime;
                        }
                        catch(e)
                        {
                            //抛出异常直接扣总分
                            westScore-=100;
                        }
                        //超时判断
                        if(eastTime>1000)
                        {
                            document.writeln(eastDrunkard+"接收结果严重超时");
                            bExit=true;
                        }
                        if(westTime>1000)
                        {
                            document.writeln(westDrunkard+"接收结果严重超时");
                            bExit=true;
                        }
                        if(bExit)
                        {
                            return;
                        }
                        if(eastTime>100)
                        {
                            eastResult="Timeout";
                            eastTimeoutCount++;
                        }
                        if(westTime>100)
                        {
                            westResult="Timeout";
                            westTimeoutCount++;
                        }
                        
                        if(eastTimeoutCount>=10)
                        {
                            document.writeln(eastDrunkard+"超时10次以上");
                            bExit=true;
                        }
                        if(westTimeoutCount>=10)
                        {
                            document.writeln(westDrunkard+"超时10次以上");
                            bExit=true;
                        }
                        if(bExit)
                        {
                            return;
                        }
                        //分出胜负
                        if(eastResult!=westResult)
                        {
                            break;
                        }
                    }
                }
                
                //输出结果
                document.writeln(eastDrunkard+" 分数:"+eastScore.toString()+" , "+westDrunkard+" 分数:"+westScore.toString());
            }
            
            //酒鬼1号
            var jinjazz一号=function()
            {
                //出拳
                this.Come=function(userInfo)
                {
                    userInfo.finger=5;
                    userInfo.sum=10;
                } 
            }
            //酒鬼2号
            var jinjazz二号=function()
            {
                //出拳
               this.Come=function(userInfo)
               {
                    userInfo.sum=Math.round(Math.random()*10);
                    if(userInfo.sum<=5)//别犯规
                    {
                        userInfo.finger=Math.round(Math.random()*(userInfo.sum));
                    }
                    else
                    {
                        userInfo.finger=userInfo.sum-5+Math.round(Math.random()*(10-userInfo.sum));
                    }
               }
               //输出结果
               this.OutCome=function(otherFinger,otherSum,otherResult,selfFinger,selfSum,selfResult)
               {
                    //这机器人不关心比赛结果 
               }
            }
            
            new Drunkery("jinjazz一号","jinjazz二号");
       </script>
     </BODY>
    </HTML>
      

  3.   

    代码有点长..把1楼和2楼的拼起来就可以了
    刷新后输出类似结果jinjazz一号 分数:485 , jinjazz二号 分数:515 
    现在擂主是jinjazz二号,欢迎大家51休息时前来挑战
      

  4.   

    看来我要赶紧来个BCB版和Delphi版。
      

  5.   

    jinjazz二号的随机比较聪明,
    试图掩盖他出几的概率,
    只给出他喊几的概率,
    但是我们可以倒推其出几的概率:
    出几     喊0-5时出的概率        喊6-10时出的概率          总概率
    0       1.645         +     0               =       1.645
    1       1.78          +     0.125           =       1.905
    2       1.03          +     0.42            =       1.45
    3       0.62          +     0.83            =       1.45
    4       0.325         +     1.58            =       1.905
    5       0.1           +     1.67            =       1.77
    这里的概率不是百分比,只是一个相对的权值
    我一直相信真正的平均随机是最难以战胜的,尽管它不一定能大比分战胜任何人!
    只要概率不均匀,就有软肋,就可攻之!大家继续,我先试着构造一个...  
      

  6.   

    zswang 来反盗版了,:-)
    估计这贴火不了了....
      

  7.   

    俺在sql版把原始擂主的随即算法写错了,结果惨败...
    伴水快把borland的板块都搞一下^&^
      

  8.   

    //无聊一号
            var kivetja一号=function()
            {
                //出拳
               this.Come=function(userInfo)
               {
                    userInfo.finger=Math.round(Math.random()*5);
    userInfo.sum=Math.round(Math.random()*5)+userInfo.finger;
               }
               //这机器人不关心比赛结果
            }
      

  9.   

            //无聊二号 
            var kivetja一号=function() 
            { 
                //出拳 
               this.Come=function(userInfo) 
               { 
                    userInfo.finger=Math.floor(Math.random()*6);
                    userInfo.sum=Math.floor(Math.random()*6)+userInfo.finger; 
               } 
               //这机器人不关心比赛结果 
            }