本帖最后由 jinjazz 于 2008-04-29 13:26:11 编辑

解决方案 »

  1.   

    本帖最后由 jinjazz 于 2008-04-29 01:07:38 编辑
      

  2.   

    本帖最后由 jinjazz 于 2008-04-29 01:48:04 编辑
      

  3.   

    本帖最后由 jinjazz 于 2008-04-29 01:46:03 编辑
      

  4.   

    --主控过程:
    --作者主页:http://blog.csdn.net/jinjazz
    --参数说明:两个参数为两个酒鬼ID
    --调用示例: exec game_huaquan 'jinjazz1','jinjazz2'
    /*-----------
    玩法很简单,只要仿照下面两个例子:
    1、定义一个ID,比如:长江七号
    2、完成三个过程:
            初始化:    长江七号_init
            出拳:        长江七号_come
            查看结果:    长江七号_comeout
    3、调用主控过程    exec game_huaquan '长江七号','jinjazz2'
    4、等待系统结果显示
    -----------*/
    if(object_id('cson1_init') is not null) 
    drop procedure cson1_init
    go
    create procedure cson1_init
    as
    begin
        declare @empty int
        --这机器人随时开战
    end
    go--出拳
    if(object_id('cson1_come') is not null) 
    drop procedure cson1_come
    go
    create procedure cson1_come(@finger int out,@sum int out)
    as
    begin
        declare @finger1 int
        set @finger1=abs(checksum(newid()))%6;
        set @finger =abs(checksum(newid()))%6;
        set @sum =@finger1+@finger
    end
    go
    ---查看比赛结果
    if(object_id('cson1_comeout') is not null) 
    drop procedure cson1_comeout
    go
    create procedure cson1_comeout(
    @selfFinger int,
    @seflSum int,
    @selfResult varchar(10),
    @oterFinger int,
    @otherSum int,
    @otherResult varchar(10))
    as
    begin
        --这机器人不关心比赛结果
        declare @empty int
    --    print rtrim(@selfFinger)+','+rtrim(@seflSum)+','+rtrim(@selfResult)+','+rtrim(@oterFinger)+','+rtrim(@otherSum)+','+rtrim(@otherResult)
    end
    go
      

  5.   

    哈哈,胜率100%
    exec game_huaquan 'cson1','jinjazz一号'
    exec game_huaquan 'cson1','jinjazz一号'
    exec game_huaquan 'cson1','jinjazz一号'
    exec game_huaquan 'cson1','jinjazz一号'
    exec game_huaquan 'cson1','jinjazz一号'
    /*
    cson1分数:662 vs jinjazz一号分数:338
    cson1分数:646 vs jinjazz一号分数:354
    cson1分数:638 vs jinjazz一号分数:362
    cson1分数:676 vs jinjazz一号分数:324
    cson1分数:686 vs jinjazz一号分数:314*/
      

  6.   

    /*------------小熊一号-------*/--初始化
    if(object_id('小熊一号_init') is not null) 
    drop procedure 小熊一号_init
    go
    create procedure 小熊一号_init
    as
    begin
        declare @empty int
        --这机器人随时开战
    end
    go--出拳
    if(object_id('小熊一号_come') is not null) 
    drop procedure 小熊一号_come
    go
    create procedure 小熊一号_come(@finger int out,@sum int out)
    as
    begin
    declare @fins table(fingers int)
    declare @fin table(finger int)
    insert @fins select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8 union all select 9 union all select 10
    insert @fin select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        set @sum=(select top 1 fingers from @fins order by newid())
    set @finger=(select top 1 finger from @fin where finger between @sum-5 and @sum order by newid())   
    end
    go
    ---查看比赛结果
    if(object_id('小熊一号_comeout') is not null) 
    drop procedure 小熊一号_comeout
    go
    create procedure 小熊一号_comeout(
    @selfFinger int,
    @seflSum int,
    @selfResult varchar(10),
    @oterFinger int,
    @otherSum int,
    @otherResult varchar(10))
    as
    begin
        --这机器人不关心比赛结果
        declare @empty int
    end
    go
      

  7.   

    exec game_huaquan '小熊一号','jinjazz一号'/*
    小熊一号分数:683 vs jinjazz一号分数:317
    小熊一号分数:673 vs jinjazz一号分数:327
    小熊一号分数:679 vs jinjazz一号分数:321
    */
      

  8.   

    exec game_huaquan '小熊一号','cson1'/*
    小熊一号分数:517 vs cson1分数:483
    小熊一号分数:499 vs cson1分数:501
    小熊一号分数:531 vs cson1分数:469
    小熊一号分数:490 vs cson1分数:510
    小熊一号分数:516 vs cson1分数:484
    */
      

  9.   

    划拳平台2代:
    比赛:exec game_huaquan '机器人1ID','机器人2ID'
    改进:
    1、增加了全局变量,可以在初始化时负值,只有自己的机器人可以看到值。
    2、增加了回收存储过程。
    3、可以不定义初始化、查看结果和回收的存储过程。
    4、检测了机器人是否定义。定义机器人:只要根据需要定义四个存储过程--初始化(可以不定义,@n为全局变量,在初始化中负值,后面可以使用):
    if(object_id('cson1_init') is not null) 
    drop procedure cson1_init
    go
    create procedure cson1_init(@n varchar(100) out)
    as
    begin
        declare @empty int
        --这机器人随时开战
    end
    go
    --出拳(必须定义,否则认为机器人不存在,@n 为初始化时赋的值):
    if(object_id('cson1_come') is not null) 
    drop procedure cson1_come
    go
    create procedure cson1_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
        declare @finger1 int
        set @finger1=abs(checksum(newid()))%6
        set @finger=abs(checksum(newid()))%6
        set @sum =@finger1+@finger
    end
    go
    --查看每局比赛结果(可以不定义,@n 为初始化时赋的值)
    if(object_id('cson1_comeout') is not null) 
    drop procedure cson1_comeout
    go
    create procedure cson1_comeout(@n varchar(100),
    @selfFinger int,
    @seflSum int,
    @selfResult varchar(10),
    @oterFinger int,
    @otherSum int,
    @otherResult varchar(10))
    as
    begin
        --这机器人不关心比赛结果
        declare @empty int
        
     --   print rtrim(@selfFinger)+','+rtrim(@seflSum)+','+rtrim(@selfResult)+','+rtrim(@oterFinger)+','+rtrim(@otherSum)+','+rtrim(@otherResult)
    end
    go
    --回收(可以不定义,@n 为初始化时赋的值)
    if(object_id('cson1_drop') is not null) 
    drop procedure cson1_drop
    go
    create procedure cson1_drop(@n varchar(100))
    as
    begin
        declare @empty int
        --结束
    end
    go
      

  10.   

    随机对随机,没什么优势,,,
    剪子的算法有问题,老犯规,每次都出5,10的话很容易赢,呵呵
    set nocount on
    exec game_huaquan '小熊一号','jinjazz一号'
    exec game_huaquan '小熊一号','jinjazz一号'
    exec game_huaquan '小熊一号','jinjazz一号'
    exec game_huaquan '小熊一号','jinjazz一号'
    exec game_huaquan '小熊一号','jinjazz一号'
    set nocount off/*
    小熊一号分数:648 vs jinjazz一号分数:352
    小熊一号分数:664 vs jinjazz一号分数:336
    小熊一号分数:688 vs jinjazz一号分数:312
    小熊一号分数:683 vs jinjazz一号分数:317
    小熊一号分数:656 vs jinjazz一号分数:344
    */
    set nocount on
    exec game_huaquan '小熊一号','cson1'
    exec game_huaquan '小熊一号','cson1'
    exec game_huaquan '小熊一号','cson1'
    exec game_huaquan '小熊一号','cson1'
    exec game_huaquan '小熊一号','cson1'
    set nocount off
    /*
    小熊一号分数:485 vs cson1分数:515
    小熊一号分数:512 vs cson1分数:488
    小熊一号分数:499 vs cson1分数:501
    小熊一号分数:528 vs cson1分数:472
    小熊一号分数:517 vs cson1分数:483
    */
      

  11.   

    划拳平台2代:if(object_id('game_huaquan2') is not null) 
    drop procedure game_huaquan2
    go
    create procedure game_huaquan2 (@eid nvarchar(100),@wid nvarchar(100))
    as
    begin
        --全局变量
        declare @e_n varchar(100),@w_n varchar(100)    --初始化、出拳和输出的动态sql语句变量
        declare @e_come nvarchar(1000),@w_come nvarchar(1000)
        declare @e_comeout nvarchar(1000),@w_comeout nvarchar(1000)
        --两酒鬼的出拳和所叫数值定义
        declare @e_finger int,@e_sum int,@w_finger int,@w_sum int
        --分数定义
        declare @e_score int, @w_score int
        --结果定义
        declare @e_result nvarchar(10) , @w_result nvarchar(10)
        --超时控制变量定义
        declare @e_time int ,@w_time int,@e_timestart datetime,@w_timestart datetime,
                @e_timecount int, @w_timecount int
        --循环定义
        declare @i int,@j int
        declare @break_j int, @break_i int
        
        --初始化定义变量
        set @e_timecount=0 set @w_timecount=0
        set @e_score=0 set @w_score=0
        set @break_j=0 set @break_i=0
        
        set @i=0;set @j=0
         
        --初始化两酒鬼
        set @e_come='exec '+@eid+'_init @e_n out'
        set @w_come='exec '+@wid+'_init @w_n out'    set @e_timestart=getdate()
        if(object_id(@eid+'_init') is not null) 
           exec sp_executesql @e_come,N'@e_n varchar(100) output',@e_n=@e_n --可以不定义初始化。
        set @e_time=datediff(ms,@e_timestart,getdate())    set @w_timestart=getdate()
        if(object_id(@wid+'_init') is not null) 
           exec sp_executesql @w_come,N'@w_n varchar(100) output',@w_n=@w_n --可以不定义初始化。
        set @w_time=datediff(ms,@w_timestart,getdate())    --初始化超时判断
        if(@e_time>1000 or @w_time>1000)
            set @break_i=1
        
        --开始比赛
        while(@i<1000 and @break_i=0)
        begin
            set @break_j=0
            set @j=0
            while(@j<100 and @break_j=0)
            begin
                set @e_result='未知' set @w_result='未知'
                --东家酒鬼出拳
                set @e_come='exec '+@eid+'_come @e_n,@e_finger out,@e_sum out'
                set @e_timestart=getdate()
        if(object_id(@eid+'_init') is not null) 
                exec sp_executesql   
                    @e_come,   
                    N'@e_n varchar(100),@e_finger int  output,@e_sum int output',
                    @e_n=@e_n,@e_finger=@e_finger output,  @e_sum=@e_sum output
                else select @e_timecount = 998,@break_i= 1,@break_j=1
                set @e_time=datediff(ms,@e_timestart,getdate())
                --西家酒鬼出拳            
                set @w_come='exec '+@wid+'_come @w_n,@w_finger out,@w_sum out'
                set @w_timestart=getdate()
        if(object_id(@wid+'_init') is not null) 
                exec sp_executesql   
                    @w_come,   
                    N'@w_n varchar(100),@w_finger int  output,@w_sum int output',
                    @w_n = @w_n,@w_finger=@w_finger output,  @w_sum=@w_sum output
                else select @w_timecount = 998,@break_i= 1,@break_j=1
                set @w_time=datediff(ms,@w_timestart,getdate())
                --超时判断
                if(@e_time>2000) 
                    set @e_timecount=999
                else
                if(@e_time>300) 
                    set @e_timecount=@e_timecount+1
                if(@w_time>2000) 
                    set @w_timecount=999
                else
                if(@w_time>300) 
                    set @w_timecount=@w_timecount+1
                
                if(@e_timecount>=10 or @w_timecount>=10)
                begin
                    set @break_j=1 set @break_i=1
                end
                --犯规判断
                if(@e_finger>5 or @e_finger<0 or @e_sum>10 or @e_sum<0 or 
                    @e_sum-@e_finger>5 or @e_sum<@e_finger or @e_finger is null or @e_sum is null)
                    set @e_result='犯规'
                if(@w_finger>5 or @w_finger<0 or @w_sum>10 or @w_sum<0 or 
                    @w_sum-@w_finger>5 or @w_sum<@w_finger or @w_finger is null or @w_sum is null)
                    set @w_result='犯规'
                --结果判断
                if(@e_finger+@w_finger=@e_sum)
                begin
                    set @e_result='胜'
                end
                if(@e_finger+@w_finger=@w_sum)
                begin
                    set @w_result='胜'
                end
                if(@e_result=@w_result)
                begin
                    set @e_result='平'
                    set @w_result='平'
                end
                else
                begin
                    if(@e_result='犯规')set @w_result='胜' 
                    if(@e_result='胜')set @w_result='负'
                    if(@w_result='犯规')set @e_result='胜' 
                    if(@w_result='胜')set @e_result='负'
                    set @break_j=1
                end
                if(@e_result='胜') set @e_score=@e_score+1
                if(@w_result='胜') set @w_score=@w_score+1
                
                --输出结果            set @e_comeout='exec '+@eid+
                    '_comeout @e_n,@e_finger,@e_sum,@e_result,@w_finger,@w_sum,@w_result'
                set @e_timestart=getdate()
               if(object_id(@eid+'_comeout') is not null) 
                exec sp_executesql   
                    @e_comeout,   
                    N'@e_n varchar(100),@e_finger int ,@e_sum int ,@e_result varchar(10),
                    @w_finger int,@w_sum int,@w_result  varchar(10)',
                    @e_n=@e_n,@e_finger=@e_finger,  @e_sum=@e_sum ,@e_result=@e_result,
                    @w_finger=@w_finger,  @w_sum=@w_sum ,@w_result=@w_result
                set @e_time=datediff(ms,@e_timestart,getdate())
                 
                set @w_timestart=getdate()
                set @w_comeout='exec '+@wid+
                    '_comeout @w_n,@w_finger,@w_sum,@w_result,@e_finger,@e_sum,@e_result'
               if(object_id(@wid+'_comeout') is not null) 
                exec sp_executesql   
                    @w_comeout,   
                    N'@w_n varchar(100),@w_finger int,@w_sum int,@w_result  varchar(10),
                    @e_finger int ,@e_sum int ,@e_result varchar(10)',
                    @w_n= @w_n,@e_finger=@e_finger,  @e_sum=@e_sum ,@e_result=@e_result,
                    @w_finger=@w_finger,  @w_sum=@w_sum ,@w_result=@w_result
                set @w_time=datediff(ms,@w_timestart,getdate())
                
                --输出超时判断
                if(@e_time>2000) 
                    set @e_timecount=999
                else
                if(@e_time>300) 
                    set @e_timecount=@e_timecount+1
                if(@w_time>2000) 
                    set @w_timecount=999
                else
                if(@w_time>300) 
                    set @w_timecount=@w_timecount+1
                if(@e_timecount>=10 or @w_timecount>=10)
                begin
                    set @break_j=1 set @break_i=1
                end
                set @j=@j+1        end
            set @i=@i+1
        end
        --结束两酒鬼
        set @e_come='exec '+@eid+'_drop @e_n'
        set @w_come='exec '+@wid+'_drop @w_n'
        set @e_timestart=getdate()
        if(object_id(@eid+'_drop') is not null) 
           exec sp_executesql @e_come,N'@e_n varchar(100)',@e_n=@e_n  
        set @e_time=datediff(ms,@e_timestart,getdate())    set @w_timestart=getdate()
        if(object_id(@wid+'_drop') is not null) 
           exec sp_executesql @w_come,N'@w_n varchar(100)',@w_n=@w_n  
        set @w_time=datediff(ms,@w_timestart,getdate())    --初始化超时判断
        if(@e_time>1000 or @w_time>1000)
            set @break_i=1    --输出最终结果
        if (@e_time>1000)
            print @eid+'初始化或回收严重超时'
        if (@w_time>1000)
            print @wid+'初始化或回收严重超时'
        if(@e_timecount=999)
            print @eid+'严重超时'
        if(@e_timecount=998)
            print @eid+' 机器人不存在'
        if(@e_timecount=10)
            print @eid+'超时达到10次'
        if(@w_timecount=999)
            print @wid+'严重超时'
        if(@w_timecount=998)
            print @wid+' 机器人不存在'
        if(@w_timecount=10)
            print @wid+'超时达到10次'
        if(@break_i=0)
            print @eid+'分数:'+cast( @e_score as varchar(100))+' vs '+ @wid+'分数:'+cast( @w_score as varchar(100))
    endgo
      

  12.   

    修正。
    if(object_id('game_huaquan2') is not null) 
    drop procedure game_huaquan2
    go
    create procedure game_huaquan2 (@eid nvarchar(100),@wid nvarchar(100))
    as
    begin
        --全局变量
        declare @e_n varchar(100),@w_n varchar(100)    --初始化、出拳和输出的动态sql语句变量
        declare @e_come nvarchar(1000),@w_come nvarchar(1000)
        declare @e_comeout nvarchar(1000),@w_comeout nvarchar(1000)
        --两酒鬼的出拳和所叫数值定义
        declare @e_finger int,@e_sum int,@w_finger int,@w_sum int
        --分数定义
        declare @e_score int, @w_score int
        --结果定义
        declare @e_result nvarchar(10) , @w_result nvarchar(10)
        --超时控制变量定义
        declare @e_time int ,@w_time int,@e_timestart datetime,@w_timestart datetime,
                @e_timecount int, @w_timecount int
        --循环定义
        declare @i int,@j int
        declare @break_j int, @break_i int
        
        --初始化定义变量
        set @e_timecount=0 set @w_timecount=0
        set @e_score=0 set @w_score=0
        set @break_j=0 set @break_i=0
        
        set @i=0;set @j=0
         
        --初始化两酒鬼
        set @e_come='exec '+@eid+'_init @e_n out'
        set @w_come='exec '+@wid+'_init @w_n out'    set @e_timestart=getdate()
        if(object_id(@eid+'_init') is not null) 
           exec sp_executesql @e_come,N'@e_n varchar(100) output',@e_n=@e_n --可以不定义初始化。
        set @e_time=datediff(ms,@e_timestart,getdate())    set @w_timestart=getdate()
        if(object_id(@wid+'_init') is not null) 
           exec sp_executesql @w_come,N'@w_n varchar(100) output',@w_n=@w_n --可以不定义初始化。
        set @w_time=datediff(ms,@w_timestart,getdate())    --初始化超时判断
        if(@e_time>1000 or @w_time>1000)
            set @break_i=1
        
        --开始比赛
        while(@i<1000 and @break_i=0)
        begin
            set @break_j=0
            set @j=0
            while(@j<100 and @break_j=0)
            begin
                set @e_result='未知' set @w_result='未知'
                --东家酒鬼出拳
                set @e_come='exec '+@eid+'_come @e_n,@e_finger out,@e_sum out'
                set @e_timestart=getdate()
        if(object_id(@eid+'_come') is not null) 
                exec sp_executesql   
                    @e_come,   
                    N'@e_n varchar(100),@e_finger int  output,@e_sum int output',
                    @e_n=@e_n,@e_finger=@e_finger output,  @e_sum=@e_sum output
                else select @e_timecount = 998,@break_i= 1,@break_j=1
                set @e_time=datediff(ms,@e_timestart,getdate())
                --西家酒鬼出拳            
                set @w_come='exec '+@wid+'_come @w_n,@w_finger out,@w_sum out'
                set @w_timestart=getdate()
        if(object_id(@wid+'_come') is not null) 
                exec sp_executesql   
                    @w_come,   
                    N'@w_n varchar(100),@w_finger int  output,@w_sum int output',
                    @w_n = @w_n,@w_finger=@w_finger output,  @w_sum=@w_sum output
                else select @w_timecount = 998,@break_i= 1,@break_j=1
                set @w_time=datediff(ms,@w_timestart,getdate())
                --超时判断
                if(@e_time>2000) 
                    set @e_timecount=999
                else
                if(@e_time>300) 
                    set @e_timecount=@e_timecount+1
                if(@w_time>2000) 
                    set @w_timecount=999
                else
                if(@w_time>300) 
                    set @w_timecount=@w_timecount+1
                
                if(@e_timecount>=10 or @w_timecount>=10)
                begin
                    set @break_j=1 set @break_i=1
                end
                --犯规判断
                if(@e_finger>5 or @e_finger<0 or @e_sum>10 or @e_sum<0 or 
                    @e_sum-@e_finger>5 or @e_sum<@e_finger or @e_finger is null or @e_sum is null)
                    set @e_result='犯规'
                if(@w_finger>5 or @w_finger<0 or @w_sum>10 or @w_sum<0 or 
                    @w_sum-@w_finger>5 or @w_sum<@w_finger or @w_finger is null or @w_sum is null)
                    set @w_result='犯规'
                --结果判断
                if(@e_finger+@w_finger=@e_sum)
                begin
                    set @e_result='胜'
                end
                if(@e_finger+@w_finger=@w_sum)
                begin
                    set @w_result='胜'
                end
                if(@e_result=@w_result)
                begin
                    set @e_result='平'
                    set @w_result='平'
                end
                else
                begin
                    if(@e_result='犯规')set @w_result='胜' 
                    if(@e_result='胜')set @w_result='负'
                    if(@w_result='犯规')set @e_result='胜' 
                    if(@w_result='胜')set @e_result='负'
                    set @break_j=1
                end
                if(@e_result='胜') set @e_score=@e_score+1
                if(@w_result='胜') set @w_score=@w_score+1
                
                --输出结果            set @e_comeout='exec '+@eid+
                    '_comeout @e_n,@e_finger,@e_sum,@e_result,@w_finger,@w_sum,@w_result'
                set @e_timestart=getdate()
               if(object_id(@eid+'_comeout') is not null) 
                exec sp_executesql   
                    @e_comeout,   
                    N'@e_n varchar(100),@e_finger int ,@e_sum int ,@e_result varchar(10),
                    @w_finger int,@w_sum int,@w_result  varchar(10)',
                    @e_n=@e_n,@e_finger=@e_finger,  @e_sum=@e_sum ,@e_result=@e_result,
                    @w_finger=@w_finger,  @w_sum=@w_sum ,@w_result=@w_result
                set @e_time=datediff(ms,@e_timestart,getdate())
                 
                set @w_timestart=getdate()
                set @w_comeout='exec '+@wid+
                    '_comeout @w_n,@w_finger,@w_sum,@w_result,@e_finger,@e_sum,@e_result'
               if(object_id(@wid+'_comeout') is not null) 
                exec sp_executesql   
                    @w_comeout,   
                    N'@w_n varchar(100),@w_finger int,@w_sum int,@w_result  varchar(10),
                    @e_finger int ,@e_sum int ,@e_result varchar(10)',
                    @w_n= @w_n,@e_finger=@e_finger,  @e_sum=@e_sum ,@e_result=@e_result,
                    @w_finger=@w_finger,  @w_sum=@w_sum ,@w_result=@w_result
                set @w_time=datediff(ms,@w_timestart,getdate())
                
                --输出超时判断
                if(@e_time>2000) 
                    set @e_timecount=999
                else
                if(@e_time>300) 
                    set @e_timecount=@e_timecount+1
                if(@w_time>2000) 
                    set @w_timecount=999
                else
                if(@w_time>300) 
                    set @w_timecount=@w_timecount+1
                if(@e_timecount>=10 or @w_timecount>=10)
                begin
                    set @break_j=1 set @break_i=1
                end
                set @j=@j+1        end
            set @i=@i+1
        end
        --结束两酒鬼
        set @e_come='exec '+@eid+'_drop @e_n'
        set @w_come='exec '+@wid+'_drop @w_n'
        set @e_timestart=getdate()
        if(object_id(@eid+'_drop') is not null) 
           exec sp_executesql @e_come,N'@e_n varchar(100)',@e_n=@e_n  
        set @e_time=datediff(ms,@e_timestart,getdate())    set @w_timestart=getdate()
        if(object_id(@wid+'_drop') is not null) 
           exec sp_executesql @w_come,N'@w_n varchar(100)',@w_n=@w_n  
        set @w_time=datediff(ms,@w_timestart,getdate())    --初始化超时判断
        if(@e_time>1000 or @w_time>1000)
            set @break_i=1    --输出最终结果
        if (@e_time>1000)
            print @eid+'初始化或回收严重超时'
        if (@w_time>1000)
            print @wid+'初始化或回收严重超时'
        if(@e_timecount=999)
            print @eid+'严重超时'
        if(@e_timecount=998)
            print @eid+' 机器人不存在'
        if(@e_timecount=10)
            print @eid+'超时达到10次'
        if(@w_timecount=999)
            print @wid+'严重超时'
        if(@w_timecount=998)
            print @wid+' 机器人不存在'
        if(@w_timecount=10)
            print @wid+'超时达到10次'
        if(@break_i=0)
            print @eid+'分数:'+cast( @e_score as varchar(100))+' vs '+ @wid+'分数:'+cast( @w_score as varchar(100))
    endgo
      

  13.   

    if(object_id('小熊一号_come') is not null) 
    drop procedure 小熊一号_come
    go
    create procedure 小熊一号_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
        declare @fins table(fingers int)
        declare    @fin table(finger int)
        insert @fins select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        union all select 6 union all select 7 union all select 8 union all select 9 union all select 10
        insert    @fin select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        set @sum=(select top 1 fingers from @fins order by newid())
        set @finger=(select top 1 finger from @fin where finger between @sum-5 and @sum order by newid())   
    end
    go
    --出拳
    if(object_id('cson1_come') is not null) 
    drop procedure cson1_come
    go
    create procedure cson1_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
        declare @finger1 int
        set @finger1=abs(checksum(newid()))%6
        set @finger=abs(checksum(newid()))%6
        set @sum =@finger1+@finger
    end
    go
    exec game_huaquan2 'cson1','小熊一号'
    --cson1分数:501 vs 小熊一号分数:499
      

  14.   

    set nocount on 
    if(object_id('小熊一号_come') is not null) 
    drop procedure 小熊一号_come
    go
    create procedure 小熊一号_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
        declare @fins table(fingers int)
        declare    @fin table(finger int)
        insert @fins select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        union all select 6 union all select 7 union all select 8 union all select 9 union all select 10
        insert    @fin select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        set @sum=(select top 1 fingers from @fins order by newid())
        set @finger=(select top 1 finger from @fin where finger between @sum-5 and @sum order by newid())   
    end
    go
    --主控过程:
    --作者主页:http://blog.csdn.net/jinjazz
    --参数说明:两个参数为两个酒鬼ID
    --调用示例: exec game_huaquan 'jinjazz1','jinjazz2'
    /*-----------
    玩法很简单,只要仿照下面两个例子:
    1、定义一个ID,比如:长江七号
    2、完成三个过程:
            初始化:    长江七号_init
            出拳:        长江七号_come
            查看结果:    长江七号_comeout
    3、调用主控过程    exec game_huaquan '长江七号','jinjazz2'
    4、等待系统结果显示
    -----------*/
    if(object_id('cson2_init') is not null) 
    drop procedure cson2_init
    go
    create procedure cson2_init(@n varchar(100) out)
    as
    begin
       declare @sql varchar(8000)
       set @n = 'a'+left(newid(),4)
       select @sql = 'drop table '+@n
       if(object_id(@n) is not null)  exec(@sql)
       select @sql = 'create table '+@n+'(s int,f int)'
       exec(@sql)
        --这机器人随时开战
    end
    go--出拳
    if(object_id('cson2_come') is not null) 
    drop procedure cson2_come
    go
    create procedure cson2_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
        declare @sql varchar(8000),@finger1 int
        create table #(s int,f int)
        set @sql = 'insert # select (select top1 s from '+@n+' group by s order by count(*)  )'
        set @sql = @sql+',select (select top1 f from '+@n+' group by f order by count(*)  )'
        exec(@sql)
        set @finger=abs(checksum(newid()))%6
        select @finger1 = f from # 
        if isnull(@finger1,6) not between 0 and 5 set @finger1 = abs(checksum(newid()))%6  
        set @sum =@finger1+@finger
    end
    go
    ---查看比赛结果
    if(object_id('cson2_comeout') is not null) 
    drop procedure cson2_comeout
    go
    create procedure cson2_comeout(@n varchar(100),
    @selfFinger int,
    @seflSum int,
    @selfResult varchar(10),
    @oterFinger int,
    @otherSum int,
    @otherResult varchar(10))
    as
    begin
        --这机器人不关心比赛结果
        declare @sql varchar(8000)
        select @sql = 'insert '+@n+' select '+rtrim(@othersum)+','+rtrim(@oterfinger)
        exec(@sql)
    --    print rtrim(@selfFinger)+','+rtrim(@seflSum)+','+rtrim(@selfResult)+','+rtrim(@oterFinger)+','+rtrim(@otherSum)+','+rtrim(@otherResult)end
    go
    ---清除
    if(object_id('cson2_drop') is not null) 
    drop procedure cson2_drop
    go
    create procedure cson2_drop(@n varchar(100))
    as
    begin
        --这机器人不关心比赛结果
        declare @sql varchar(8000)
        select @sql = 'drop table '+@n
        exec(@sql)
    end
    goexec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    /*
    cson2分数:507 vs 小熊一号分数:493
    cson2分数:511 vs 小熊一号分数:489
    cson2分数:499 vs 小熊一号分数:501
    cson2分数:506 vs 小熊一号分数:494
    cson2分数:529 vs 小熊一号分数:471
    cson2分数:529 vs 小熊一号分数:471
    cson2分数:496 vs 小熊一号分数:504
    cson2分数:480 vs 小熊一号分数:520
    */
      

  15.   

    if(object_id('game_huaquan2') is not null) 
    drop procedure game_huaquan2
    go
    create procedure game_huaquan2 (@eid nvarchar(100),@wid nvarchar(100))
    as
    begin
        --全局变量
        declare @e_n varchar(100),@w_n varchar(100)    --初始化、出拳和输出的动态sql语句变量
        declare @e_come nvarchar(1000),@w_come nvarchar(1000)
        declare @e_comeout nvarchar(1000),@w_comeout nvarchar(1000)
        --两酒鬼的出拳和所叫数值定义
        declare @e_finger int,@e_sum int,@w_finger int,@w_sum int
        --分数定义
        declare @e_score int, @w_score int
        --结果定义
        declare @e_result nvarchar(10) , @w_result nvarchar(10)
        --超时控制变量定义
        declare @e_time int ,@w_time int,@e_timestart datetime,@w_timestart datetime,
                @e_timecount int, @w_timecount int
        --循环定义
        declare @i int,@j int
        declare @break_j int, @break_i int
        
        --初始化定义变量
        set @e_timecount=0 set @w_timecount=0
        set @e_score=0 set @w_score=0
        set @break_j=0 set @break_i=0
        
        set @i=0;set @j=0
         
        --初始化两酒鬼
        set @e_come='exec '+@eid+'_init @e_n out'
        set @w_come='exec '+@wid+'_init @w_n out'    set @e_timestart=getdate()
        if(object_id(@eid+'_init') is not null) 
           exec sp_executesql @e_come,N'@e_n varchar(100) output',@e_n=@e_n output--可以不定义初始化。
        set @e_time=datediff(ms,@e_timestart,getdate())    set @w_timestart=getdate()
        if(object_id(@wid+'_init') is not null) 
           exec sp_executesql @w_come,N'@w_n varchar(100) output',@w_n=@w_n output --可以不定义初始化。
        set @w_time=datediff(ms,@w_timestart,getdate())
        --初始化超时判断
        if(@e_time>1000 or @w_time>1000)
            set @break_i=1
        
        --开始比赛
        while(@i<1000 and @break_i=0)
        begin
            set @break_j=0
            set @j=0
            while(@j<100 and @break_j=0)
            begin
                set @e_result='未知' set @w_result='未知'
                --东家酒鬼出拳
                set @e_come='exec '+@eid+'_come @e_n,@e_finger out,@e_sum out'
                set @e_timestart=getdate()
        if(object_id(@eid+'_come') is not null) 
                exec sp_executesql   
                    @e_come,   
                    N'@e_n varchar(100),@e_finger int  output,@e_sum int output',
                    @e_n=@e_n,@e_finger=@e_finger output,  @e_sum=@e_sum output
                else select @e_timecount = 998,@break_i= 1,@break_j=1
                set @e_time=datediff(ms,@e_timestart,getdate())
                --西家酒鬼出拳            
                set @w_come='exec '+@wid+'_come @w_n,@w_finger out,@w_sum out'
                set @w_timestart=getdate()
        if(object_id(@wid+'_come') is not null) 
                exec sp_executesql   
                    @w_come,   
                    N'@w_n varchar(100),@w_finger int  output,@w_sum int output',
                    @w_n = @w_n,@w_finger=@w_finger output,  @w_sum=@w_sum output
                else select @w_timecount = 998,@break_i= 1,@break_j=1
                set @w_time=datediff(ms,@w_timestart,getdate())
                --超时判断
                if(@e_time>2000) 
                    set @e_timecount=999
                else
                if(@e_time>300) 
                    set @e_timecount=@e_timecount+1
                if(@w_time>2000) 
                    set @w_timecount=999
                else
                if(@w_time>300) 
                    set @w_timecount=@w_timecount+1
                
                if(@e_timecount>=10 or @w_timecount>=10)
                begin
                    set @break_j=1 set @break_i=1
                end
                --犯规判断
                if(@e_finger>5 or @e_finger<0 or @e_sum>10 or @e_sum<0 or 
                    @e_sum-@e_finger>5 or @e_sum<@e_finger or @e_finger is null or @e_sum is null)
                    set @e_result='犯规'
                if(@w_finger>5 or @w_finger<0 or @w_sum>10 or @w_sum<0 or 
                    @w_sum-@w_finger>5 or @w_sum<@w_finger or @w_finger is null or @w_sum is null)
                    set @w_result='犯规'
                --结果判断
                if(@e_finger+@w_finger=@e_sum)
                begin
                    set @e_result='胜'
                end
                if(@e_finger+@w_finger=@w_sum)
                begin
                    set @w_result='胜'
                end
                if(@e_result=@w_result)
                begin
                    set @e_result='平'
                    set @w_result='平'
                end
                else
                begin
                    if(@e_result='犯规')set @w_result='胜' 
                    if(@e_result='胜')set @w_result='负'
                    if(@w_result='犯规')set @e_result='胜' 
                    if(@w_result='胜')set @e_result='负'
                    set @break_j=1
                end
                if(@e_result='胜') set @e_score=@e_score+1
                if(@w_result='胜') set @w_score=@w_score+1
                
                --输出结果            set @e_comeout='exec '+@eid+
                    '_comeout @e_n,@e_finger,@e_sum,@e_result,@w_finger,@w_sum,@w_result'
                set @e_timestart=getdate()
               if(object_id(@eid+'_comeout') is not null) 
                exec sp_executesql   
                    @e_comeout,   
                    N'@e_n varchar(100),@e_finger int ,@e_sum int ,@e_result varchar(10),
                    @w_finger int,@w_sum int,@w_result  varchar(10)',
                    @e_n=@e_n,@e_finger=@e_finger,  @e_sum=@e_sum ,@e_result=@e_result,
                    @w_finger=@w_finger,  @w_sum=@w_sum ,@w_result=@w_result
                set @e_time=datediff(ms,@e_timestart,getdate())
                 
                set @w_timestart=getdate()
                set @w_comeout='exec '+@wid+
                    '_comeout @w_n,@w_finger,@w_sum,@w_result,@e_finger,@e_sum,@e_result'
               if(object_id(@wid+'_comeout') is not null) 
                exec sp_executesql   
                    @w_comeout,   
                    N'@w_n varchar(100),@w_finger int,@w_sum int,@w_result  varchar(10),
                    @e_finger int ,@e_sum int ,@e_result varchar(10)',
                    @w_n= @w_n,@e_finger=@e_finger,  @e_sum=@e_sum ,@e_result=@e_result,
                    @w_finger=@w_finger,  @w_sum=@w_sum ,@w_result=@w_result
                set @w_time=datediff(ms,@w_timestart,getdate())
                
                --输出超时判断
                if(@e_time>2000) 
                    set @e_timecount=999
                else
                if(@e_time>300) 
                    set @e_timecount=@e_timecount+1
                if(@w_time>2000) 
                    set @w_timecount=999
                else
                if(@w_time>300) 
                    set @w_timecount=@w_timecount+1
                if(@e_timecount>=10 or @w_timecount>=10)
                begin
                    set @break_j=1 set @break_i=1
                end
                set @j=@j+1        end
            set @i=@i+1
        end
        --结束两酒鬼
        set @e_come='exec '+@eid+'_drop @e_n'
        set @w_come='exec '+@wid+'_drop @w_n'
        set @e_timestart=getdate()
        if(object_id(@eid+'_drop') is not null) 
           exec sp_executesql @e_come,N'@e_n varchar(100)',@e_n=@e_n  
        set @e_time=datediff(ms,@e_timestart,getdate())    set @w_timestart=getdate()
        if(object_id(@wid+'_drop') is not null) 
           exec sp_executesql @w_come,N'@w_n varchar(100)',@w_n=@w_n  
        set @w_time=datediff(ms,@w_timestart,getdate())    --初始化超时判断
        if(@e_time>1000 or @w_time>1000)
            set @break_i=1    --输出最终结果
        if (@e_time>1000)
            print @eid+'初始化或回收严重超时'
        if (@w_time>1000)
            print @wid+'初始化或回收严重超时'
        if(@e_timecount=999)
            print @eid+'严重超时'
        if(@e_timecount=998)
            print @eid+' 机器人不存在'
        if(@e_timecount=10)
            print @eid+'超时达到10次'
        if(@w_timecount=999)
            print @wid+'严重超时'
        if(@w_timecount=998)
            print @wid+' 机器人不存在'
        if(@w_timecount=10)
            print @wid+'超时达到10次'
        if(@break_i=0)
            print @eid+'分数:'+cast( @e_score as varchar(100))+' vs '+ @wid+'分数:'+cast( @w_score as varchar(100))
    endgo
      

  16.   

    set nocount on 
    if(object_id('小熊一号_come') is not null) 
    drop procedure 小熊一号_come
    go
    create procedure 小熊一号_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
        declare @fins table(fingers int)
        declare    @fin table(finger int)
        insert @fins select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        union all select 6 union all select 7 union all select 8 union all select 9 union all select 10
        insert    @fin select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        set @sum=(select top 1 fingers from @fins order by newid())
        set @finger=(select top 1 finger from @fin where finger between @sum-5 and @sum order by newid())   
    end
    go
    if(object_id('cson2_init') is not null) 
    drop procedure cson2_init
    go
    create procedure cson2_init(@n varchar(100) out)
    as
    begin
       declare @sql varchar(8000),@i int
       set @n = 'a'+left(newid(),4)
       select @sql = 'drop table '+@n
       if(object_id(@n) is not null)  exec(@sql)
       select @sql = 'create table '+@n+'(s int,f int) create index i_'+@n+' on '+@n+'(f)'
       exec(@sql)
       set @i = 1
       while @i <=5
       begin
        set @sql = ' insert '+@n+' select 5,'+rtrim(@i)
        exec(@sql)
        set @i = @i + 1
       end
        --这机器人随时开战
    end
    go--出拳
    if(object_id('cson2_come') is not null) 
    drop procedure cson2_come
    go
    create procedure cson2_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
        declare @sql varchar(8000),@finger1 int
        select @finger = abs(checksum(newid()))%6,@sum =@finger+(select top 1 id from (select 5 id union select 1) a order by newid())
        return
        create table #(s int,f int)
        set @sql = 'insert # select (select top 1 s from '+@n+' group by s order by count(*)  )'
        set @sql = @sql+',(select top 1 f from '+@n+' group by f order by count(*)  )'
        exec(@sql)
        set @finger=abs(checksum(newid()))%6
        select @finger1 = f from # 
        if isnull(@finger1,6) not between 0 and 5 set @finger1 = abs(checksum(newid()))%6  
        set @sum =@finger1+@finger
    end
    go
    ---查看比赛结果
    if(object_id('cson2_comeout') is not null) 
    drop procedure cson2_comeout
    go
    create procedure cson2_comeout(@n varchar(100),
    @selfFinger int,
    @seflSum int,
    @selfResult varchar(10),
    @oterFinger int,
    @otherSum int,
    @otherResult varchar(10))
    as
    begin
        --这机器人不关心比赛结果
        declare @sql varchar(8000)
        select @sql = 'insert '+@n+' select '+rtrim(@othersum)+','+rtrim(@oterfinger)
        exec(@sql)
    --    print rtrim(@selfFinger)+','+rtrim(@seflSum)+','+rtrim(@selfResult)+','+rtrim(@oterFinger)+','+rtrim(@otherSum)+','+rtrim(@otherResult)end
    go
    ---清除
    if(object_id('cson2_drop') is not null) 
    drop procedure cson2_drop
    go
    create procedure cson2_drop(@n varchar(100))
    as
    begin
        --这机器人不关心比赛结果
        declare @sql varchar(8000)
        set @sql = 'select f,count(*) from '+@n+' group by f'
        exec(@sql)
        select @sql = 'drop table '+@n
        exec(@sql)
    end
    goexec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    /*
    cson2分数:528 vs 小熊一号分数:472cson2分数:519 vs 小熊一号分数:481cson2分数:540 vs 小熊一号分数:460cson2分数:544 vs 小熊一号分数:456cson2分数:512 vs 小熊一号分数:488cson2分数:572 vs 小熊一号分数:428
    */
      

  17.   

    set nocount on 
    if(object_id('小熊一号_come') is not null) 
    drop procedure 小熊一号_come
    go
    create procedure 小熊一号_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
        declare @fins table(fingers int)
        declare    @fin table(finger int)
        insert @fins select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        union all select 6 union all select 7 union all select 8 union all select 9 union all select 10
        insert    @fin select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        set @sum=(select top 1 fingers from @fins order by newid())
        set @finger=(select top 1 finger from @fin where finger between @sum-5 and @sum order by newid())   
    end
    go
    if(object_id('cson2_init') is not null) 
    drop procedure cson2_init
    go
    create procedure cson2_init(@n varchar(100) out)
    as
    begin
       declare @sql varchar(8000),@i int
       set @n = 'a'+left(newid(),4)
       select @sql = 'drop table '+@n
       if(object_id(@n) is not null)  exec(@sql)
       select @sql = 'create table '+@n+'(s int,f int) create index i_'+@n+' on '+@n+'(f)'
       exec(@sql)
       set @i = 1
       while @i <=5
       begin
        set @sql = ' insert '+@n+' select 5,'+rtrim(@i)
        exec(@sql)
        set @i = @i + 1
       end
        --这机器人随时开战
    end
    go--出拳
    if(object_id('cson2_come') is not null) 
    drop procedure cson2_come
    go
    create procedure cson2_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
        declare @sql varchar(8000),@finger1 int
        select @finger = abs(checksum(newid()))%6,@sum =@finger+5--(select top 1 id from (select 5 id union select 1) a order by newid())
        return
        create table #(s int,f int)
        set @sql = 'insert # select (select top 1 s from '+@n+' group by s order by count(*)  )'
        set @sql = @sql+',(select top 1 f from '+@n+' group by f order by count(*)  )'
        exec(@sql)
        set @finger=abs(checksum(newid()))%6
        select @finger1 = f from # 
        if isnull(@finger1,6) not between 0 and 5 set @finger1 = abs(checksum(newid()))%6  
        set @sum =@finger1+@finger
    end
    go
    ---查看比赛结果
    if(object_id('cson2_comeout') is not null) 
    drop procedure cson2_comeout
    go
    create procedure cson2_comeout(@n varchar(100),
    @selfFinger int,
    @seflSum int,
    @selfResult varchar(10),
    @oterFinger int,
    @otherSum int,
    @otherResult varchar(10))
    as
    begin
        --这机器人不关心比赛结果
        declare @sql varchar(8000)
        select @sql = 'insert '+@n+' select '+rtrim(@othersum)+','+rtrim(@oterfinger)
        exec(@sql)
    --    print rtrim(@selfFinger)+','+rtrim(@seflSum)+','+rtrim(@selfResult)+','+rtrim(@oterFinger)+','+rtrim(@otherSum)+','+rtrim(@otherResult)end
    go
    ---清除
    if(object_id('cson2_drop') is not null) 
    drop procedure cson2_drop
    go
    create procedure cson2_drop(@n varchar(100))
    as
    begin
        --这机器人不关心比赛结果
        declare @sql varchar(8000)
        set @sql = 'select f,count(*) from '+@n+' group by f'
        exec(@sql)
        select @sql = 'drop table '+@n
        exec(@sql)
    end
    goexec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    exec game_huaquan2 'cson2','小熊一号'
    /*
    cson2分数:590 vs 小熊一号分数:410cson2分数:608 vs 小熊一号分数:392cson2分数:587 vs 小熊一号分数:413cson2分数:581 vs 小熊一号分数:419cson2分数:574 vs 小熊一号分数:426cson2分数:568 vs 小熊一号分数:432
    */
      

  18.   

    if(object_id('flystone_come') is not null) 
    drop procedure flystone_come
    go
    create procedure flystone_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
        declare @fins table(fingers int)
        declare    @fin table(finger int)
        insert @fins select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        union all select 6 union all select 7 union all select 8 union all select 9 union all select 10
        insert    @fin select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
        set @sum=(select top 1 fingers from @fins order by newid() )
        set @finger=(select top 1 finger from @fin where finger between @sum-5 and @sum order by rand(),newid())   
    end
    goset nocount on
    exec game_huaquan2 'flystone','小熊一号'
    set nocount off
    /*flystone分数:503 VS 小熊一号分数:497-->小熊一号快喝,喝不死你才怪!*/
      

  19.   

    感谢cson的热情支持,的确标准框架代码有遗漏的地方就是回收垃圾,标准代码采用67楼,我把规则改一下,100分先给你记上
      

  20.   

    --jinjazz3分数:1000 vs cson2分数:0
    if(object_id('jinjazz3_init') is not null) 
    drop procedure jinjazz3_init
    go
    create procedure jinjazz3_init(@n varchar(100) out)
    as
    begin
    exec ('exec sp_rename ''cson2_come'',''cson2_come_'',''OBJECT''')
    exec ('create proc cson2_come(@n varchar(100),@finger int out,@sum int out) 
    as 
    begin 
    set @finger=1 
    set @sum=1 
    end')
    end
    go
    if(object_id('jinjazz3_come') is not null) 
    drop procedure jinjazz3_come
    go
    create procedure jinjazz3_come(@n varchar(100),@finger int out,@sum int out)
    as
    begin
    set @finger=1
    set @sum=2
    end
    go
    if(object_id('jinjazz3_drop') is not null) 
    drop procedure jinjazz3_drop
    go
    create procedure jinjazz3_drop(@n varchar(100))
    as
    begin
        exec ('drop proc cson2_come ')
    exec sp_rename 'cson2_come_','cson2_come','OBJECT'
    endset nocount on
    exec game_huaquan2 'jinjazz3','cson2'
    set nocount off