我正在开发一个项目,创建一个包含一些信息的类。例如
public Player(string Playername, int PlayerRating)
{
name = Playername;
rating = PlayerRating;
}
我的问题是如何创建一种方法来区分Player类的多个实例以更新Rating。我尝试了某种ID号来选择正确的类。我想也许我可以创建一个ID指针数组,每个指向不同的玩家。
编辑:从“副本”更改为“实例”。 编辑:有关程序功能的说明。我们的想法是让一个大型团队成为“玩家”并让他们在这个项目之外进行比赛。然后在比赛结束后我回到这里并更新球员的评分。
答案 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)
根据评论中的讨论,你可能想要比我的其他答案更像这样的东西。必须自行添加LoadPlayersFromDisk
和SavePlayersToDisk
。向您展示如何做到这一点真的超出了这个问题的范围。一旦你达到这一点,请随意创建一个关于它的新问题(在做了一些研究之后)。
这不包括如何处理使用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.