我正在写一个卡片播放程序作为学习C#的一种方式。
我遇到一个数据超出界限的问题。
这是我的代码:
namespace Pcardconsole
{
class Deck
{
public Deck()
{
// Assign standard deck to new deck object
int j;
for (int i = 0; i != CurrentDeck.Length; i++)
{
CurrentDeck[i] = originalCards[i];
}
// Fisher-Yates Shuffling Algorithim
Random rnd = new Random();
for (int k = CurrentDeck.Length - 1; k >= 0; k++)
{
int r = rnd.Next(0, k + 1);
int tmp = CurrentDeck[k];
CurrentDeck[k] = CurrentDeck[r];
CurrentDeck[r] = tmp;
// Console.WriteLine(i);
}
}
public void Shuffle()
{
// TODO
}
// public int[] ReturnCards()
// {
// TODO
// }
public int[] originalCards = new int[54]
{
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C,
0x1D, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B,
0x2C, 0x2D, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A,
0x3B, 0x3C, 0x3D, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
0x4A, 0x4B, 0x4C, 0x4D, 0x50, 0x51
};
public int[] CurrentDeck = new int[54];
}
class Program
{
static void Main(string[] args)
{
// Create a Deck object
Deck mainDeck = new Deck();
Console.WriteLine("Here is the card array:");
for (int index = 0; index != mainDeck.CurrentDeck.Length; index++)
{
string card = mainDeck.CurrentDeck[index].ToString("x");
Console.WriteLine("0x" + card);
}
}
}
}
十六进制数代表不同的牌。
当我编译它时,我得到一个数组索引超出边界错误,并且崩溃。
我不明白出了什么问题。
非常感谢任何帮助。
答案 0 :(得分:1)
不应该是
for (int k = CurrentDeck.Length - 1; k >= 0; k--)
而不是
for (int k = CurrentDeck.Length - 1; k >= 0; k++)
您还可以将length属性存储到变量中,然后检查该变量。
int currentDeckLength = CurrentDeck.Length;
for (int k = currentDeckLength - 1; k >= 0; k++)
答案 1 :(得分:0)
你应该减少循环:k--
而不是k++
。
通过递增它,您将访问一个出界索引,因为您在最大计数处初始化k以开始。你的循环看起来像是设置为向后循环,所以减少索引。
答案 2 :(得分:0)
您有for (int k = CurrentDeck.Length - 1; k >= 0; k++)
应为for (int k = CurrentDeck.Length - 1; k >= 0; k--)
你看到了区别吗?