2017-04-18 1 views
0

Je construis un tableau d'affichage de tournois multi-jeux, où de nombreux joueurs peuvent jouer à plusieurs jeux, plusieurs fois. Je veux attribuer des points aux joueurs par match en fonction de leur classement pour chaque jeu, pas de leur score réel.Attribuer des points par classement aux joueurs de plusieurs jeux

par exemple.

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 

Tournoi Classement

Player1 - 1,999 Points 

Player2 - 1,998 Points 

Player3 - 1,997 Points 

Alors Jusqu'à présent, j'ai le classement et les points calculs fonctionne très bien ...

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; 

Mais je dois être en mesure d'attribuer des points par rang par match et un grand total de points pour chaque joueur que je peux puis montrer dans une liste.

+0

Les premières données séparées de relations. Deuxièmement - les points attribués seront-ils toujours les mêmes de la 1ère place à la plus basse? Est donc déplacer cette logique métier vers le code. – JackTheKnife

+0

oui les points sont toujours les mêmes par rang –

+0

OK - donc éloignez ces données de DB car cela est redondant (ainsi que le rang par partie). Puis créez un tableau (hash map) pour chaque jeu à partir d'une requête avec un sort 'desc' sur la colonne Score (qui vous donnera le score le plus élevé comme rang 1 etc) où la clé est un rang et les valeurs seront un tableau (liste) de l'identifiant du joueur et du score. En faisant défiler ce type de tableau, vous pouvez créer des variables temporaires (ou un tableau à nouveau) avec des ID de joueur et leur attribuer des points de récompense. À la fin, vous devriez terminer avec le nombre total de points pour chaque ID de joueur. – JackTheKnife

Répondre

0

Votre DB devrait ressembler à

Joueurs

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 doit uniquement être utilisé pour stocker des données. Rang et points attribués doivent être déplacés vers le code car ce sont des parties redondantes.

Puis interrogez chaque table avec desc trier sur les colonnes de score. Cela va créer des tables classées avec le meilleur marqueur comme # 1 etc. Récupérant le magasin de données dans des tableaux pour chaque jeu avec Key-> Valeurs où Key sera un rang # (incrémental 1+) et Values ​​peut être un autre tableau avec des données de joueurs stockées (après rejoindre) et un score ou une chaîne quelque chose comme PlayerX | Score # si vous avez besoin d'un score pour n'importe quoi car pour de vrai, vous n'avez besoin que de trier les résultats des joueurs par partie. Après cela, vous devez parcourir la table des joueurs et créer une rangée de joueurs où vous allez stocker les points de tournoi récupérés à partir de chaque rangée de jeu et diminuer les points de tournoi sur chaque rang et les assigner à un bon joueur.

Espérons que cela aide

PS.Pour les données existantes, je vais créer des vues quelque chose comme

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

pour chaque jeu

puis faites vue finale pour résumer tous les points des tournois

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

Malheureusement, je ne suis pas à un endroit où je peux changer ce niveau de structure comme beaucoup d'autres processus tirent de la table submit_score –

+0

@ Joel'Maximus'GriffinDodd jetez un oeil à mon idée avec créer des vues pour chaque jeu puis créer une vue finale pour une somme totale. Ce n'est pas parfait mais ça devrait marcher sur vos données existantes – JackTheKnife

+0

Eh bien, le problème est que j'ai plus de 5000 titres de jeux disponibles, puis des milliers d'instances de chacun de ces jeux partout dans le monde, avec une table pour chaque instance de jeu pas pratique. –