【问题标题】:Assign points by rank to players of multiple games按等级为多个游戏的玩家分配积分
【发布时间】:2017-09-14 16:39:51
【问题描述】:

我正在构建一个多游戏锦标赛记分牌,许多玩家可以在其中玩很多游戏,很多次。我想根据每场比赛的排名而不是他们的实际得分为每场比赛的玩家分配分数。

例如

大金刚

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

锦标赛积分榜

Player1 - 1,999 Points

Player2 - 1,998 Points

Player3 - 1,997 Points

到目前为止,我的排名和积分计算工作得很好......

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;

但我需要能够按每场比赛的排名来分配积分,然后我可以将每个玩家的总积分显示在一个列表中。

【问题讨论】:

  • 首先从关系中分离数据。第二 - 从第 1 名到第 1 名,获得的分数总是相同吗?就是将业务逻辑移到代码中。
  • 是的,每个等级的分数总是相同的
  • OK - 所以从数据库中移走该数据,因为这是多余的(以及每场比赛的排名)。然后从查询中为每个游戏创建一个数组(哈希映射),在 Score 列上使用排序 desc(这将为您提供最高分作为排名 1 等),其中键是排名编号,值将是一个数组(列表)的玩家 ID 和分数。通过这种数组循环,您可以创建带有玩家 ID 的临时变量(或再次创建数组),并为他们分配奖励积分。最后,您应该以每个玩家 ID 的总分结束。
  • 不能做两次查询?

标签: php mysql rank


【解决方案1】:

你的数据库应该看起来像

玩家

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

大金刚

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

Robotron

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

DB 应该只用于存储数据。排名和奖励积分应该移到代码中,因为它们是多余的部分。

然后使用desc 对分数列进行排序查询每个表。这将创建排名表,其中最高得分手为 #1 等。检索数据存储在每个游戏的数组中,键->值,其中键将是排名 #(1+ 增量),值可以是存储玩家数据的其他数组(加入后)和一个分数或一个字符串,比如 PlayerX | Score# 如果您需要任何事情的得分数据,因为实际上您只需要对每场比赛的得分进行排序的球员数据。

之后,您需要遍历玩家表并创建玩家数组,您将在其中存储从循环每个游戏数组中检索到的锦标赛积分,并减少每个排名的锦标赛积分并分配给合适的玩家。

希望对你有帮助

附言。 对于现有数据,我将创建类似于

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

每场比赛

然后进行最终视图以汇总所有锦标赛积分

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

【讨论】:

  • 不幸的是,我无法像许多其他进程从 submit_score 表中提取的那样进行这种级别的结构更改
  • @Joel'Maximus'GriffinDodd 看看我的想法,为每场比赛创建视图,然后为总和创建最终视图。并不完美,但应该可以处理您现有的数据
  • 嗯,问题是我有超过 5000 个可用的游戏标题,然后在世界各地有 1000 个这些游戏的实例,为每个游戏实例设置一个表是不切实际的。跨度>
猜你喜欢
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多