24h購物| | PChome| 登入
2007-06-04 23:57:04| 人氣37| 回應0 | 上一篇 | 下一篇

保齡球算法四

推薦 0 收藏 0 轉貼0 訂閱站台

我自己寫了一個,我不是很明白你的獎勵,我以前也比較經常打保齡球,不過沒有你說的獎勵,
只有每輪每次擊倒的瓶數,還有就是每次的得分!

你對保齡球還有一些不清楚的地方,我先補說計分規則:

一局(GAME)保齡球分為10格,每格裏有兩次投球機會,如在第一次投球時全中,就有需要投第二球。每一格可能出現三種情況:

1.失球(MISS)

無論何種情況,在一格的兩次投球時,未能擊倒10個瓶,此格的分數為擊倒的瓶數,未擊中用一個(-)符號表示。

2.補中(SPARE)

當第二次投球擊倒該格第一球餘下的全部瓶子,稱為補中,用一個(/)符號表示。補中的記分是10分加上下一次投球擊倒的瓶數。

3.全中(STRIKE)

當每一格的第一次投球擊倒全部豎立的十個瓶時,稱為全中,用一個(×)符號表示。全中的記分是10分(擊倒的瓶)加該球員下兩次投球擊倒的瓶數。

但在第十格中情況比較特殊:

(1)如第二次投球未補中,則第十格得分為第九格得分加上第十格所擊倒瓶數。

(2)如第二次投球補中,則追加一次投球機會,第十格得分為第九格得他加上10加上追加一次投球擊倒瓶數。

(3)如第一球為全中,則追上加二次投球機會,第十格得分為第九格得分加上10加追加二次投球擊倒的瓶數。因此從第一格到第十格的兩次追加投球,都為全中,則為12個全中,得分為滿分300分。

注意:投球入溝,或犯規都為一次投球。--這個也是要算在裏面,不過擊倒球數為0!

好啦!

我就舉個例子,你應該有看那個說明,Andy Warren說,不要有什麼存儲過程,或者擴展存儲過程,也就是說代碼要純sql,不要外借其他sp!我把他寫成sp,這樣我每一局的分數都可以取到,我 sp裏面沒有用到任何sp,或者extended stored procedures,符合舉辦人Andy Warren說的要求。


create table #Scores (
RowID int identity(1,1) not null, --
UserID int not null,
DateAdded smalldatetime default GetDate(), --
FrameNumber tinyint not null,
NumberOfPins tinyint not null)

insert into #Scores(UserID,FrameNumber,NumberOfPins)
select 1,1,9 union all
select 1,1,1 union all
select 1,2,6 union all
select 1,2,3 union all
select 1,3,8 union all
select 1,3,2 union all
select 1,4,7 union all
select 1,4,2 union all
select 1,5,10 union all
select 1,6,10 union all
select 1,7,10 union all
select 1,8,4 union all
select 1,8,5 union all
select 1,9,8 union all
select 1,9,2 union all
select 1,10,10 union all --第10輪因為第一次投球就大滿貫,所以就加多2局!!
select 1,10,7 union all
select 1,10,3

alter procedure getScore
@UserID int,
@FrameNumber tinyint,
@returnScore int output
as
declare @i int
declare @tmpTimes int
declare @tmpScore tinyint
set @tmpScore = 0
set @tmpTimes = 0
set @i = 1
set @returnScore = 0
while @i <= @FrameNumber
begin
select @tmpTimes = count(1),@tmpScore = sum(NumberOfPins) from #Scores where FrameNumber = @i and UserID = @UserID
set @tmpScore =
( case when @i = 10 or (@tmpTimes = 2 and @tmpScore <> 10) then @tmpScore
when @tmpTimes = 2 and @tmpScore = 10 then
(select top 1 NumberOfPins + 10 from #Scores where UserID = @UserID and FrameNumber = @i + 1 order by RowID asc)
when @tmpTimes = 1 and @tmpScore <> 10 then @tmpScore
when @tmpTimes = 1 and @tmpScore = 10 then
(select sum(NumberOfPins) + 10 from (select top 2 NumberOfPins from #scores where userid = @UserID and
FrameNumber > @i order by RowID asc)B)
else 0
end )
set @returnScore = @returnScore + @tmpScore
set @i = @i + 1
end

go

--下麵是調用,我計算第5輪的得分,和第10輪的得分(10輪即為總分)
declare @UserID int
declare @FrameNumber tinyint
declare @returnScore int
set @UserID = 1
set @FrameNumber = 5
exec getScore 1,5,@returnScore output
print N’選手’+ convert(varchar(10),@UserID) + N’第’ + convert(varchar(10) ,@FrameNumber)
+ N’局得分:’ + convert(varchar(10),@returnScore)
set @UserID = 1
set @FrameNumber = 10
exec getScore 1,10,@returnScore output
print N’選手’+ convert(varchar(10),@UserID) + N’第’ + convert(varchar(10) ,@FrameNumber)
+ N’局得分:’ + convert(varchar(10),@returnScore)

/*
選手1第5輪得分:81
選手1第10輪得分:173
*/

台長: 劍心
人氣(37) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文