创建类的多个实例并区分它们

时间:2017-09-09 00:42:15

标签: c#

我正在开发一个项目,创建一个包含一些信息的类。例如

public Player(string Playername, int PlayerRating)
        {
            name = Playername;
            rating = PlayerRating;
        }

我的问题是如何创建一种方法来区分Player类的多个实例以更新Rating。我尝试了某种ID号来选择正确的类。我想也许我可以创建一个ID指针数组,每个指向不同的玩家。

编辑:从“副本”更改为“实例”。 编辑:有关程序功能的说明。我们的想法是让一个大型团队成为“玩家”并让他们在这个项目之外进行比赛。然后在比赛结束后我回到这里并更新球员的评分。

4 个答案:

答案 0 :(得分:2)

您可能正在寻找的是Dictionary。字典可以有一个键和一个值。没有两把钥匙可以是相同的。键和值可以是整数,字符串或任何所需的对象(类)。你的PlayerName是唯一的吗?如果是这样,您可以在添加到字典时使用PlayerName作为键。否则,您可以生成Guid并使用它。像这样:

// Keep a dictionary of all players
Dictionary<string, Player> PlayerDict = new Dictionary<string, Player>();

public void addNewPlayer(string newPlayerName)
{
    // create new player with rating of 0
    Player newPlayer = new Player(newPlayerName, 0);
    // check if the player already exists in dictionary
    if (!PlayerDict.ContainsKey(newPlayer.name))
    {
        // player doesn't exist / add player
        PlayerDict.Add(newPlayer.name, newPlayer);
    }
}

public void changePlayerRating(String name, int newRating)
{
    // check if player exists in dictionary
    if (PlayerDict.ContainsKey(name))
    {
        // player exists - change player rating
        PlayerDict[name].rating = newRating;
    }
    else
    {
        // player doesnt exist - add the player
        addNewPlayer(name);
    }
}

public class Player
{
    public string name { get; }
    public int rating { get; set; }

    public Player(string Playername, int PlayerRating)
    {
        name = Playername;
        rating = PlayerRating;
    }
}

然后你可以这样做:

addNewPlayer("John");
changePlayerRating("John", 1000);

或者像这样增加评级:

PlayerDict["John"].rating += 10

答案 1 :(得分:1)

根据评论中的讨论,你可能想要比我的其他答案更像这样的东西。必须自行添加LoadPlayersFromDiskSavePlayersToDisk。向您展示如何做到这一点真的超出了这个问题的范围。一旦你达到这一点,请随意创建一个关于它的新问题(在做了一些研究之后)。

这不包括如何处理使用Player中不属于Dictionary的{​​{1}}名称或如何添加新Players时发生的情况,但它应该给你一个良好的开端。唐纳德桑德的答案显示了处理这两种情况的一些好方法。

Player.cs:

public class Player
{
    public string Name { get; set;}
    public int Rank{get;set;
}

Main.cs:

var players = new Dictionary<string, Player>();

LoadPlayersFromDisk();

var winnerName = Console.ReadLine("Enter the name of the winner:");
var winner = players[winnerName];
winner.Rank++;
Console.WriteLine($"{winner.Name}'s rank has increased to {winner.Rank}")

SavePlayersToDisk();

答案 2 :(得分:0)

  

我可以描述的最佳方式是,如果我让玩家(Bob,1000)与国际象棋比赛(Joe,1200)进行比赛。我有两个Player类的副本,在比赛结束后我想改变玩家等级的值。我的问题是我不确定如何选择Bobs Player Class并将其评级设为新值,然后为Joe做同样的事情。

我不确定我是否正确理解了这个问题,但由于每个玩家都在一个单独的变量中,你应该能够使用这些变量更新评级。

在代码中,它看起来像:

class Player
{
    public string Name { get; }
    public int Rating { get; set; }

    public Player(string name, int rating)
    {
        Name = name;
        Rating = rating;
    }
}

static class Game
{
    static void Play(Player player1, Player player2)
    {
        // code to play the game here, also sets player1NewRating and player2NewRating

        player1.Rating = player1NewRating;
        player2.Rating = player2NewRating;
    }

    static void Main()
    {
        var bob = new Player("Bob", 1000);
        var joe = new Player("Joe", 1200);

        Play(bob, joe);
    }
}

答案 3 :(得分:0)

看起来您的Player已经可以区分玩家,即Name属性。有很多方法可以做到这一点,但这只是一个例子。

如果您有List<Player>名为Players,则可以找到Player名称“John”,如下所示:

var player = Players.Where(p => p.Name == "John").First();

在该行之后,player将包含第一个Player实例,其中Name为“John”。

另一种选择是使用Dictionary<string, Player>,其效果类似于var player = Players["John"]

这两种方法都依赖于Name是唯一的,没有2个玩家可以拥有相同的名称。

在更多地考虑你的问题后,你可能会对如何在单个游戏中跟踪玩家感到困惑。这通常在计算机课程的早期就已经涵盖了,所以如果你已经知道这一点,请原谅我。

这是“参考”的概念。我们处理该领域的3件事情,如程序员,变量,实例和引用。 var player定义了一个变量。 new Player()创建Player的新实例,并向其返回引用。您可以通过将这两个语句与var player = new Player()组合,将该引用放入变量中。 player 变量现在将引用保存到Player实例

如果我们谈论房屋,那么class就是蓝图。其中只有一个一次存在,它定义了如何建造房屋。只要有人使用蓝图来建造房屋,就会创建instance。你可以拥有10栋独立的房屋,所有房屋都是用相同的蓝图建造的。这些房屋中的每一个都是不同的房屋,但具有完全相同的物理特征。

在游戏中,您可以拥有多个玩家,它们可以存储在List<Player>中,并且您的游戏可以保留currentPlayer变量,其中包含int的索引为Player谁转过来了。

作为一个简单的例子,这是一个简单的游戏循环(没有转弯的实际逻辑)。最有可能的是,您还希望将bool gameOver = false; var players = new List<Player>(); players.Add(new Player("John")); players.Add(new Player("Bob")); int currentPlayerIndex = 0; Player winner = null; while(!gameOver) { var currentPlayer = players[currentPlayerIndex]; //Do a player's turn here, "currentPlayer" will be whoever's turn it is. //set won to true if the current player won the game. if(won) { currentPlayer.Rating++; gameOver = true; } currentPlayerIndex++; if(currentPlayerIndex >= players.Count) { currentPlayerIndex = 0; } } 实例持久化为更长久的实例,例如数据库。任何数量的玩家都可以使用相同的基本循环,然后轮流转过每一个玩家。

selenium.common.exceptions.WebDriverException: Message: 'phantomjs.exe' executable needs to be in PATH.
相关问题