Okay, let's do this step by step.
With this query, we get a list of games and their players, sorted by game and score. We add a rownumber which resets to 1 for each game.
SELECT
games.game_id,
`games`.`score`,
CONCAT(`users`.`full_name`) AS `name`,
`users`.`facebook_id`,
@row_num := if(@game != games.game_id, 1, @row_num + 1) AS rownumber,
@game := games.game_id
FROM
`games`
INNER JOIN users ON `games`.`user_id`=`users`.`id`
, (select @row_num := 1, @game := NULL) variables
WHERE
`users`.`id` IN ('user ids goes here')
AND `games`.`status`=2
ORDER BY
games.game_id, /*or something*/
`games`.`score` DESC
Now we can get the top 10 players for each game by putting above query into this
SELECT * FROM (
<above query here>
) subquery_alias
WHERE rownumber <= 10;
Now we just have to add a GROUP BY playername and get the greatest result. So your final query is this:
SELECT name, MAX(score) FROM (
SELECT
games.game_id,
`games`.`score`,
CONCAT(`users`.`full_name`) AS `name`,
`users`.`facebook_id`,
@row_num := if(@game != games.game_id, 1, @row_num + 1) AS rownumber,
@game := games.game_id
FROM
`games`
INNER JOIN users ON `games`.`user_id`=`users`.`id`
, (select @row_num := 1, @game := NULL) variables
WHERE
`users`.`id` IN ('user ids goes here')
AND `games`.`status`=2
ORDER BY
games.game_id, /*or something*/
`games`.`score` DESC
) subquery_alias
WHERE rownumber <= 10
GROUP BY `name`