2017-04-18 4 views
0

Ich baue eine Multispiel-Anzeigetafel, in der viele Spieler viele Spiele spielen können. Ich möchte den Spielern pro Spiel Punkte zuweisen, basierend auf ihrem Rang für jedes Spiel, nicht ihre tatsächliche Punktzahl.Weisen Sie Spielern von mehreren Spielen Punkte nach Rang zu.

z.B.

Donkey Kong

Rank | Player | Score | Points Awarded  
1 | Player2 | 34,000 | 1,000  
2 | Player1 | 32,000 | 999  
3 | Player3 | 29,000 | 998 

Robotron

Rank | Player | Score | Points Awarded  
1 | Player1 | 39,000 | 1,000  
2 | Player3 | 32,000 | 999  
3 | Player2 | 21,000 | 998 

Turnier-Platzierung

Player1 - 1,999 Points 

Player2 - 1,998 Points 

Player3 - 1,997 Points 

So Bis jetzt habe ich Ranking und Punkte Berechnungen funktioniert ganz gut ...

SELECT 
    `id`, 
    `userID`, 
    `gameID`, 
    `gamescore`, 
    `rank`, 
    1001.0 - (rank) AS points 
FROM (
    SELECT 
     `id`, 
     `userID`, 
     `gameID`, 
     `gamescore`, 
     @curr_rank := IF(@prev_rank = id, @curr_rank, @curr_rank + 1) AS rank, 
     @prev_rank := id 
    FROM 
     `submit_score`, 
     (SELECT @curr_rank := 0) y, 
     (SELECT @prev_rank := NULL) z 
    WHERE `submit_score`.`tournID` = 2 
    ORDER BY `gamescore` DESC 
) ranked_game; 

Aber ich muss in der Lage sein, die Punkte von Rang-per-Spiel zuweisen und haben dann eine Gesamtsumme der Punkte für jeden Spieler, dass ich dann in einer Liste anzeigen.

+0

erste getrennte Daten von Beziehungen. Zweitens - Wurden die Punkte immer vom ersten bis zum niedrigsten Platz vergeben? Ist das so, verschieben Sie diese Geschäftslogik in den Code. – JackTheKnife

+0

ja die Punkte sind immer die gleichen pro Rang –

+0

OK - also weg diese Daten aus der DB wie dies redundant ist (sowie Rang pro Spiel). Dann erstellen Sie ein Array (Hash-Map) für jedes Spiel aus einer Abfrage mit der Sortierung 'desc' in der Score-Spalte (das wird Ihnen die höchste Punktzahl als Rang 1 usw. geben), wobei der Schlüssel eine Rangnummer und die Werte ein Array sind (Liste) der Spieler-ID und des Ergebnisses. Durch diese Art von Array können Sie temporäre Variablen (oder ein Array) mit Player-IDs erstellen und ihnen Punkte zuweisen. Am Ende solltest du mit Gesamtpunkten für jede Spieler-ID enden. – JackTheKnife

Antwort

0

Ihr DB sollte etwas aussehen

Spieler

ID | Player Nickname 
1 | Player1 
2 | Player2 
3 | Player3 

Donkey Kong

PlayerID | Score 
Player2ID | 34,000 
Player1ID | 32,000 
Player3ID | 29,000 

Robotron

PlayerID | Score 
Player1ID | 39,000 
Player3ID | 32,000 
Player2ID | 21,000 

DB sollte nur zum Speichern von Daten verwendet werden. Rang und vergebene Punkte sollten in den Code verschoben werden, da diese redundante Teile sind.

Dann Abfrage jeder Tabelle mit desc Sortieren auf Score-Spalten. Das wird Ranglisten-Tabellen mit Top-Torschützen als # 1 usw. erstellen. Das abgerufene Datenspeicher in Arrays für jedes Spiel mit Key-> Values ​​wobei Key ein Rang # (1+ inkrementell) und Werte ein anderes Array mit gespeicherten Spielerdaten sein können (nach join) und eine Partitur oder eine Saite wie PlayerX | Score #, wenn Sie eine Score-Daten für etwas brauchen, denn für echte brauchen Sie nur Spieler Daten sortieren nach Partituren pro Spiel.

Danach müssen Sie die Spieler-Tabelle durchlaufen und eine Reihe von Spielern erstellen, in denen Sie die aus jedem Spiel-Array abgerufenen Turnierpunkte speichern und die Turnier-Punkte für jeden Rang verringern und einem richtigen Spieler zuweisen.

Hoffe es hilft

PS. Für vorhandene Daten Ich werde so etwas wie Ansichten erstellen

set @max_points=1000; 
select Rank, Player, 
@current_points := IF(Rank = 1, @max_points, @current_points-1) AS points 
from DonkeyKong 

für jedes Spiel

dann tun endgültige Ansicht alle Turniere zu summieren Punkte

select dk.Player AS Player,(dk.Points + ro.Points) AS Total 
from RO_view AS ro 
left join DK_view AS dk 
on dk.Player = ro.Player 
+0

Leider bin ich nicht an einem Ort, wo ich diese Ebene der Struktur ändern kann, wie viele andere Prozesse ziehen aus der Tabelle submit_score –

+0

@ Joel'Maximus'GriffinDodd werfen Sie einen Blick auf meine Idee mit der Erstellung von Ansichten für jedes Spiel erstellen Sie dann endgültige Ansicht für eine Gesamtsumme. Ist nicht perfekt, aber sollte an Ihren vorhandenen Daten arbeiten. – JackTheKnife

+0

Nun, das Problem ist, ich habe über 5000 verfügbare Spieletitel und dann 1000 von Instanzen von jedem dieser Spiele an Orten auf der ganzen Welt, mit einer Tabelle für jede Spielinstanz unpraktisch. –

Verwandte Themen