使用redis实现游戏排行榜代码使用C#实现
以下是使用C#实现游戏排行榜的示例代码:
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
namespace GameRanking
{
class Program
{
static void Main(string[] args)
{
// 连接 Redis
var redis = ConnectionMultiplexer.Connect("localhost");
// 获取排行榜
var ranking = new GameRanking(redis);
// 添加玩家分数
ranking.AddScore("player1", 100);
ranking.AddScore("player2", 200);
ranking.AddScore("player3", 150);
// 获取玩家排名和分数
var rank1 = ranking.GetRank("player1");
var score1 = ranking.GetScore("player1");
Console.WriteLine("player1 rank: {0}, score: {1}", rank1, score1);
// 获取前三名玩家
var top3 = ranking.GetTop(3);
Console.WriteLine("Top 3 players:");
foreach (var player in top3)
{
Console.WriteLine("{0} - {1}", player.Name, player.Score);
}
Console.ReadLine();
}
}
class GameRanking
{
private IDatabase _db;
public GameRanking(ConnectionMultiplexer redis)
{
_db = redis.GetDatabase();
}
public void AddScore(string playerName, int score)
{
_db.SortedSetAdd("ranking", playerName, score);
}
public int? GetRank(string playerName)
{
var rank = _db.SortedSetRank("ranking", playerName);
return rank.HasValue ? rank.Value + 1 : (int?)null;
}
public double GetScore(string playerName)
{
return _db.SortedSetScore("ranking", playerName) ?? 0;
}
public List<PlayerScore> GetTop(int count)
{
var players = _db.SortedSetRangeByRankWithScores("ranking", 0, count - 1, Order.Descending)
.Select(p => new PlayerScore { Name = p.Element, Score = p.Score })
.ToList();
return players;
}
}
class PlayerScore
{
public string Name { get; set; }
public double Score { get; set; }
}
}
上述代码定义了一个名为 GameRanking 的类,用于管理游戏排行榜。该类使用 StackExchange.Redis 库连接 Redis,并提供了以下方法:
AddScore(string playerName, int score):添加玩家分数到排行榜。GetRank(string playerName):获取指定玩家的排名。GetScore(string playerName):获取指定玩家的分数。GetTop(int count):获取排名前count名的玩家。
在 Main 方法中,我们创建了一个 GameRanking 实例,并添加了三个玩家的分数。然后我们获取了玩家1的排名和分数,以及排名前三名的玩家。最后,我们输出了玩家1的排名和分数,以及排名前三名的玩家的名称和分数。
需要注意的是,在 GetRank 方法中,我们需要将 Redis 返回的排名加1,才能得到正确的排名。因为 Redis 返回的排名是从0开始。
原文地址: https://www.cveoy.top/t/topic/b59P 著作权归作者所有。请勿转载和采集!