Лучший способ хранить 3 куска данных в виде одной записи - PullRequest
1 голос
/ 30 марта 2010

Для игрового сервера я хочу записать детали, когда игрок совершает убийство, сохранить его, а затем через некоторое время обновить базу данных sql.

Часть, в которой я сейчас заинтересован, - это лучший способ хранения информации об убийстве. Что бы я хотел передать серверу sql при обновлении, это {PlayerName, Kills, Deaths}, где количество убийств и смертей является суммой за период между обновлениями.

Итак, я предполагаю, что я бы построил список в соответствии с {боб, 1, 0} {откровенно, 0, 1} {1, 0} {откровенно, 0, 1} затем при обновлении объедините список в {frank, 14, 3} и т. д.

Может кто-нибудь дать совет, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 30 марта 2010
class PlayerDeathKills
{
    public int PlayerId;
    public int NumDeaths;
    public int NumKills;
}

Редактировать На самом деле, это даже лучше:

class DeathsKills
{
    public int NumDeaths;
    public int NumKills;
}

IDictionary<int, DeathsKills> playerDeathKills = new Dictionary(...);

public void AddKill(int killerId, int victimId)
{
    DeathKills killer;
    if (!playerDeathKills.TryGetValue(killerId, out killer)) {
        killer = new DeathKills();
        playerDeathKills.Add(killerId, killer);
    }
    killer.NumKills ++;

    DeathKills victim;
    if (!playerDeathKills.TryGetValue(victimId, out victim)) {
        victim = new DeathKills();
        playerDeathKills.Add(victimId, victim);
    }
    victim.NumDeaths ++;
}
0 голосов
/ 30 марта 2010

Моя версия

class Player
{
    private readonly string _Name;
    private int _KillsCount = 0;
    private int _DeathsCount = 0;
    private bool _IsChanged = false;

    public string Name
    {
        get { return _Name; }
    }

    public int DeathsCount
    {
        get { return _DeathsCount; }
        private set
        {
            if (_DeathsCount != value)
            {
                _DeathsCount = value;
                _IsChanged = true;  
            }   
        }
    }

    public int KillsCount
    {
        get { return _KillsCount; }
        private set
        {
            if (_KillsCount != value)
            {
                _KillsCount = value;
                _IsChanged = true;  
            }
        }
    }

    public bool IsChanged
    {
        get { return _IsChanged; }
        set { _IsChanged = value; }
    }

    public Player(string name)
    {
        _Name = name;
    }

    public void Kill(Player killer)
    {
        DeathsCount++;
        killer.KillsCount++;
    }
}

class Example
{
    private readonly Collection<Player> _Players = new Collection<Player>();
    private bool _IsUpdateEnabled;
    private int _UpdateTimeout = 1000;

    public void Start()
    {
        var frank = new Player("Frank");
        var tom = new Player("Tom");
        _Players.Add(frank);
        _Players.Add(tom);

        _Players.Add(new Player("Bob"));

        _IsUpdateEnabled = true;
        new Thread(UpdateThreadMethod).Start();

        // Frank kills Tom ):
        tom.Kill(frank);

        // Where is Bob?
        var bob = _Players.First(p => p.Name == "Bob");

        // Bob kills Frank
        frank.Kill(bob);

        // Tom kills Bob
        bob.Kill(tom);
    }

    private void UpdateThreadMethod()
    {
        while (_IsUpdateEnabled)
        {
            foreach (var player in _Players)
            {
                if (player.IsChanged)
                {
                    // update database
                    // e.g. "update stats set kills = @kills, deaths = @deaths where name = @name"
                    // where
                    // @kills is players.KillsCount
                    // @deaths is player.DeathsCount
                    // @name is player.Name
                    player.IsChanged = false;
                }
            }

            Thread.Sleep(_UpdateTimeout);
        }   
    }

    public void ShowResults()
    {
        foreach (var player in _Players)
        {
            Console.WriteLine("Player name: {0}, kills: {1}, deaths: {2}", player.Name, player.KillsCount, player.DeathsCount);
        }
    }
}
0 голосов
/ 30 марта 2010

Как вам эта структура?

public class Murder
    {
        public DateTime Time { get; set;}
        public Player Killer { get; set; }
        public Player Killed { get; set;}

        public Murder(DateTime time, Player killer, Player killed)
        {
            Time = time;
            Killer = killer;
            Killed = killed;
        }
    }

public class Player
{
    public int DeathNumber{ get; set;}
    public int KillNumber { get; set; }

}

public static class MainClass
{
    static Dictionary<DateTime, Murder> murders = new Dictionary<DateTime, Murder>();

    //Add new murder. Save it to murders and refresh Player statistics.
    public static void AddMurder(Player killer, Player killed)
    {
        DateTime now = DateTime.Now;
        murders.Add(now, new Murder(now, killer, killed));
        killer.KillNumber++;
        killed.DeathNumber++;
    }

    public static void GameProcessExample()
    {
        AddMurder(new Player(), new Player());
        Thread.Sleep(1000);
        AddMurder(new Player(), new Player());

        //You can use LINQ to select any murders you need: by date or just some number of the last murders.
        var q = from murder in murders
                where murder.Key > DateTime.Now.AddHours(-1)
                select murder;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...