2010-04-28 63 views
4

不確定最好的方式去做這件事嗎? 我想創建2,4,8,16,32等球隊的錦標賽支架。錦標賽支架

前兩名的獲勝者將獲得下一個2的獲勝者等。 一直到獲勝者。 Like this

任何人都可以幫助我嗎?

確定這樣的信息。

最初我想想出一個方法來創建與2,4,8,16等比賽。 然後,當我有所有的用戶,如果他們是16名球員,則有8個燈具。 在這一點上,我將把燈具發送到數據庫。

當獲勝的所有玩家都進入下一輪時,我會再次爲其中的兩位獲勝者進行另一次sql查詢。

你能明白我的意思嗎?

+1

這是一個相當普遍的問題。也許你可以分享你的一些想法,並詢問關於特定領域的更具體的問題? – Amber 2010-04-28 22:56:10

+1

你只是想創建圖形,或者只是訂購一個列表來處理這個,或者是什麼?請更具體一些,__更具體一些.__ – 2010-04-28 22:56:22

+0

如果您有31名選手而不是32名選手,您想做什麼? – 2010-04-28 23:00:41

回答

6

幾年前,我做了這樣的事情。這是一段時間以前,我不知道我會以同樣的方式做它(它不真正擴展到雙重消除或類似的)如何輸出它可能是一個不同的問題。我使用了2002年至2003年的表格。今天肯定有更好的技術。

只要玩家是您在上面指定的數字之一,比賽的回合數量就是log2(玩家)+ 1。使用這些信息,你可以計算出有多少回合。最後一輪包含最後的勝利者。

我存儲在播放器的信息是這樣的(tweek這個最佳實踐)

Tournament 
    Name 
    Size 

Players 
    Tournament 
    Name 
    Position (0 to tournament.size - 1) 

Rounds 
    Tournament 
    Round 
    Position (max halves for each round) 
    Winner (player position) 

注意,在我的下面的查詢,我不包括「錦標賽= [賽事]」,以確定比賽。他們都需要它。

用一個查詢來查詢並根據需要將其拆分爲不同的回合相當簡單。你可以做這樣的事情來得到下一個對手(假設有一個)。對於第1輪,你只需要根據獲得下/上一個球員,如果是偶數或奇數:

SELECT * FROM Players WHERE Position = PlayerPosition + 1 
SELECT * FROM Players WHERE Position = PlayerPosition - 1 

下一輪,如果用戶的最後Round.Position甚至,你會需要讓下一個位置有一個贏家: SELECT Player FROM Rounds WHERE Position = [playerRoundPosition] - 1

如果不是,下一個玩家沒有決定,或者有差距(不允許差距!)

如果用戶上一輪。位置很奇怪,你需要確保有下面這些用戶,並且有下面這些贏家,否則,他們會自動提升爲下一輪(因爲沒有人玩)

SELECT COUNT(*) FROM Players WHERE Position > [Player.Position] 
SELECT Player FROM Rounds WHERE Position = [playerRoundPosition] + 1 

在最後一點,我敢肯定,你可以使用類似下面的使用類似,以減少你寫的查詢:

SELECT Player FROM Rounds WHERE Position + Position % 2 = [playerRoundPosition] 
SELECT Player FROM Rounds WHERE Position - Position % 2 = [playerRoundPosition] 

更新:

縱觀我原來的職位,我發現,回合桌有點模糊。實際上,它應該被命名爲匹配。一場比賽是兩名獲勝者之間的比賽。最終的表應該看起來更像這個(只更改了名稱): 匹配 錦標賽 回合 位置(最大半每輪) 得主(玩家位置)

希望這使得它更有點清楚。當兩名球員相互對抗(在比賽中)時,您將該信息存儲在該匹配表中。這個特定的實現取決於比賽的位置,以瞭解哪些球員參與。

我開始將輪次編號爲1,因爲在我的實現中這更清晰。如果你願意,你可以選擇0(或者甚至做一些完全不同的事情,比如後退字詞)。

第一輪比賽1意味着參與者1和參與者2。在比賽2中,參賽選手3-4。基本上第一輪僅僅是球員的位置和位置+1參與。如果您需要更多訪問權限,您還可以將這些信息存儲在回合表中。每次我在節目中使用這些數據時,我都需要所有的回合和玩家信息。

第一輪之後,你看看最後一輪的比賽。在第2輪比賽1中,比賽1和2的獲勝者參加比賽。第2輪比賽第2場,第3場和第4場比賽的獲勝者參加比賽。它應該看起來很熟悉,除了它在第一輪之後使用匹配表。我確信有一個更有效的方法來完成這個重複任務,我從來沒有足夠的時間來重構那些代碼(它被重構了,不是那個許多)。

+0

這是一個夢幻般的答案。我意識到了log2scale,但是你已經告訴我它到底需要什麼。 我仍然試圖吸收所有您提供的信息。 您可以更好地解釋「輪次」表嗎? 這讓我感到困惑一點。 謝謝 – sark9012 2010-04-29 10:32:17

+0

我可以將這張表命名得更好一些。我用這些信息更新了答案。希望有幫助。 – Reece45 2010-05-01 05:29:23

+0

感謝您提供的額外信息。我將嘗試爲此編寫代碼! – sark9012 2010-06-16 13:03:47

0

使用數組並從主數組中刪除丟失的團隊。 (但要保存在單獨的數組上,以供參考和重用)。