[英]c# System.NullReferenceException with Jagged Array
我有:
namespace CardGame
{
class Dealer
{
static void Main(string[] args)
{
string[] suits = { "Clubs", "Spades", "Hearts", "Diamonds" };
string[] specials = { "Jack", "Queen", "King", "Ace" };
string[][] hand = new string[5][];
Console.WriteLine("Please enter the number of players:");
int playerCount = Int32.Parse(Console.ReadLine());
for (int currentPlayer = 0; currentPlayer < playerCount; currentPlayer++)
{
Random rand = new Random();
for (int cardNumber = 0; cardNumber < 5; cardNumber++)
{
string card;
int mode = rand.Next(0, 2);
if (mode == 1) // Numeric card...
{
card = rand.Next(2, 10).ToString();
}
else // Face card or ace...
{
card = specials[rand.Next(0, 4)];
}
hand[currentPlayer][cardNumber] = card += " of " + suits[rand.Next(0, 3)];
Console.WriteLine(card += " of " + suits[rand.Next(0, 3)]);
}
}
Console.ReadLine();
}
}
}
该行:hand [currentPlayer] [cardNumber] = card + =“ of” + suits [rand.Next(0,3)];
在标题中引发错误。 我不知道如何解决此问题,因为我是C#的新手。
我需要做什么?
您创建了一个锯齿状的数组,但它不是数组的完整数组,而只是空引用的数组。 您必须为外部数组中的每个项目创建一个内部数组。
您已经创建了一个由五个项目组成的数组,但是它应该是一个具有玩家人数长度的数组。 因此,您必须在知道有多少玩家之后创建数组:
...
string[][] hand;
Console.WriteLine("Please enter the number of players:");
int playerCount = Int32.Parse(Console.ReadLine());
hand = new string[playerCount][];
...
现在,在循环内部,您应该为每个项目创建一个内部数组,该数组的长度应为5。 应该在外部循环外部创建Random
实例,如果您创建的新实例在时间上过于接近,则它们会生成相同的数字序列。
...
Random rand = new Random();
for (int currentPlayer = 0; currentPlayer < playerCount; currentPlayer++)
{
hand[currentPlayer] = new string[5];
...
由于所有内部数组都具有相同的长度,因此可以使用二维数组而不是锯齿状数组。 它以类似的方式声明:
string[,] hand;
它以类似的方式创建:
hand = new string[playerCount, 5];
由于它是单个数组,而不是数组数组,因此您无需在循环中创建任何内部数组。
项目的分配也略有不同:
hand[currentPlayer, cardNumber] = ...
我对您的代码进行了更改,它可以运行。 我相信这就是您想要实现的目标
using System.Linq;
namespace CardGame
{
class Dealer
{
static void Main(string[] args)
{
string[] suits = { "Clubs", "Spades", "Hearts", "Diamonds" };
string[] specials = { "Jack", "Queen", "King", "Ace" };
// Two dimensional arrays - I believe this is what you want to achieve, run the application
string[,] hand = new string[5,5];
Console.WriteLine("Please enter the number of players:");
int playerCount = Int32.Parse(Console.ReadLine());
for (int currentPlayer = 0; currentPlayer < playerCount; currentPlayer++)
{
Random rand = new Random();
for (int cardNumber = 0; cardNumber < 5; cardNumber++)
{
string card;
int mode = rand.Next(0, 2);
if (mode == 1) // Numeric card...
{
card = rand.Next(2, 10).ToString();
}
else // Face card or ace...
{
card = specials[rand.Next(0, 4)];
}
var temp = " of " + suits[rand.Next(0, 3)];
if (card != null && !card.Contains(temp))
{
hand[currentPlayer, cardNumber] = card += " of " + suits[rand.Next(0, 3)];
Console.WriteLine(card += " of " + suits[rand.Next(0, 3)]);
//Result
Console.WriteLine("Result: {0}", hand[currentPlayer, cardNumber]);
}
}
}
Console.ReadLine();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.