Ben birkaç yıl önce böyle bir şey yaptım. Bu oldukça bir süre önceydi ve ben bunu farklı bir soru olabilir nasıl çıktı aynı şekilde (gerçekten çift elimintation veya benzeri ölçek değildir) yapmak istiyorum emin değilim. O 2002-2003 yılında olduğu gibi tablolar başvurdu. Bugün daha iyi teknikleri kesinlikle vardır.
Turnuvada mermi miktarı sürece oyuncu olarak, yukarıda belirtilen sayı biridir log2 (oyuncular) + 1 olduğunu. Bu bilgileri kullanarak siz orada kaç tur hesaplayabilirsiniz. Son turun nihai kazanan içerir.
Ben (en iyi uygulamalar için bu tweek) bu gibi oyuncu bilgileri şey saklanır
Tournament
Name
Size
Players
Tournament
Name
Position (0 to tournament.size - 1)
Rounds
Tournament
Round
Position (max halves for each round)
Winner (player position)
Aşağıda tüm sorgularda Not, ben turnuva tanımlamak için "Turnuva = [turnuva]" dahil değildir. Onlar hiç gerek.
Bu bir sorgu ile bu sorgulamak ve farklı tur için gerektiği gibi dışarı bölmek için oldukça basit. Sen sonraki rakibini (orada bir varsayarak) almak için böyle bir şey yapabilirdi. 1. turda için, sadece tek veya çift olup olmadığını dayalı sonraki / önceki oynatıcı almak gerekir:
SELECT * FROM Players WHERE Position = PlayerPosition + 1
SELECT * FROM Players WHERE Position = PlayerPosition - 1
For the next round, if the user's last Round.Position was even, you'll need to make suer that the next position up has a winner:
SELECT Player FROM Rounds WHERE Position = [playerRoundPosition] - 1
Değilse, bir sonraki oyuncu karar, ya da bir boşluk var değil (Boşlukların izin yok!)
Kullanıcıların son Round.Position tek olsaydı, orada bunların altında bir kullanıcı var ve emin olun gerekir (oynamak için kimse olduğu gibi), aksi takdirde otomatik olarak bir sonraki tura teşvik edilmelidir Bunların altında bir kazanan var,
SELECT COUNT(*) FROM Players WHERE Position > [Player.Position]
SELECT Player FROM Rounds WHERE Position = [playerRoundPosition] + 1
Son bir not olarak, ben gibi bir şey kullanarak yazdığınız sorguları azaltmak için aşağıdaki gibi bir şey kullanabilirsiniz eminim:
SELECT Player FROM Rounds WHERE Position + Position % 2 = [playerRoundPosition]
SELECT Player FROM Rounds WHERE Position - Position % 2 = [playerRoundPosition]
Güncelleme:
Looking over my original post, I find that the Rounds table was a little ambigous. In reality, it should be named matches. A match is a competition between two players with a winner. The final table should look more like this (only the name changed):
Matches
Tournament
Round
Position (max halves for each round)
Winner (player position)
Umarım o biraz daha açık hale getirir. Iki oyuncu (bir maçta) birbirlerine karşı gittiğinizde, size bu bilgileri tablosu Maçları olduğunu saklayın. Bu özel uygulama oyuncuların katıldığı bilmek Maçın konumuna bağlıdır.
O benim uygulamasında daha açıktı, çünkü ben 1 de mermi numaralandırma başladı. Eğer seçerseniz, (gibi backwords gitmek tamamen farklı bir şey yapmak veya hatta) 0 seçebilirsiniz.
İlk turda, maç 1 oyuncu 1 ve 2. katıldı demektir. Maçında 2, oyuncular 3-4 katıldı. Esasen ilk turda sadece oyuncuların pozisyonu ve pozisyon + 1 katıldı. Bunun için daha fazla erişim gerekiyorsa da mermi tabloda bu bilgi depolayabilir. Ben programda bu verileri kullanılan her zaman, ben zaten tüm yuvarlak ve oyuncu bilgileri gerekli.
İlk turda sonra, maç son turda bakmak. 2. turda, maç, 1 maç 1 ve 2'den kazananlar katılabilir. Yuvarlak 2, maçı 2 maç 3 ve 4 kazananlar katılabilir. Bu turdan sonra 1 maç tablosunu kullanır dışında, oldukça tanıdık gelecektir. Bunu tekrarlayan görevi yapmak için daha verimli bir yolu vardır eminim, ben (sadece değil, refactored olduğunu kodu refactor için yeterli zaman gidemedik fazla).