--主控过程: --作者主页: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
哈哈,胜率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*/
/*------------小熊一号-------*/--初始化 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
exec game_huaquan '小熊一号','jinjazz一号'/* 小熊一号分数:683 vs jinjazz一号分数:317 小熊一号分数:673 vs jinjazz一号分数:327 小熊一号分数:679 vs jinjazz一号分数:321 */
exec game_huaquan '小熊一号','cson1'/* 小熊一号分数:517 vs cson1分数:483 小熊一号分数:499 vs cson1分数:501 小熊一号分数:531 vs cson1分数:469 小熊一号分数:490 vs cson1分数:510 小熊一号分数:516 vs cson1分数:484 */
划拳平台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
随机对随机,没什么优势,,, 剪子的算法有问题,老犯规,每次都出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 */
划拳平台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
修正。 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
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
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 */
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
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 */
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 */
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-->小熊一号快喝,喝不死你才怪!*/
--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
--作者主页: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
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*/
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
小熊一号分数:683 vs jinjazz一号分数:317
小熊一号分数:673 vs jinjazz一号分数:327
小熊一号分数:679 vs jinjazz一号分数:321
*/
小熊一号分数:517 vs cson1分数:483
小熊一号分数:499 vs cson1分数:501
小熊一号分数:531 vs cson1分数:469
小熊一号分数:490 vs cson1分数:510
小熊一号分数:516 vs cson1分数:484
*/
比赛: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
剪子的算法有问题,老犯规,每次都出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
*/
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
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
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
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
*/
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
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
*/
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
*/
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-->小熊一号快喝,喝不死你才怪!*/
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