从循环内部更新变量?

时间:2014-02-26 00:12:03

标签: c# arrays variables 2d

我正在编写一个策划游戏,我需要使用while循环中的变量来更新数组大小的值,在每个循环中增加是否有任何方法可以执行此操作?

bool game = false;
        do
        {
            int codeSize;
            int colourSize;
            int guessNumber = 1;
            int userGuess;
            int black = 0;
            int white = 0;
            int count = 1;

            Console.WriteLine("Welcome to Mastermind coded by ****");
            Console.Write("How many positions  > ");
            codeSize = Convert.ToInt32(Console.ReadLine());
            Console.Write("How many colours    > ");
            colourSize = Convert.ToInt32(Console.ReadLine());
            Random rand = new Random();
            int[] code = new int[codeSize];
            int[] guess = new int[codeSize];

            for (int i = 0; i < codeSize; i++)
            {
                code[i] = rand.Next(1, colourSize + 1);//filling the secret code array
            }
            Console.WriteLine("O.k. - I've generated a code -- guess it!");

            while (black < codeSize)
            {
                int[,] history = new int[count, codeSize + 2];

                Console.WriteLine("Next guess please.");
                for (int n = 0; n < codeSize; n++)
                {
                    Console.Write("Position " + guessNumber + " >");
                    userGuess = Convert.ToInt32(Console.ReadLine());

                    guess[n] = userGuess;

                    history[count - 1, n] = guess[n];

                    guessNumber++;
                }
                for (int x = 0; x < codeSize; x++)
                {
                    int caseSwitch = 1;
                    switch (caseSwitch)
                    {
                        case 1:
                            {
                                if (guess[x] == code[x])
                                {
                                    black++;
                                    break;
                                }
                                goto case 2;
                            }
                        case 2:
                            {
                                if (guess[x] == code[x])
                                {
                                    break;
                                }

                                int i = 0;
                                while (i < codeSize)
                                {
                                    if ((guess[x] == code[i]) && (guess[i] != code[i]))
                                    {
                                        white++;
                                        break;
                                    }
                                    i++;
                                }
                                break;
                            }
                    }
                }
                guessNumber = 1;

                if (black == codeSize)
                {
                    white = 0;
                }
                history[count - 1, codeSize + 1] = white;
                history[count - 1, codeSize] = black;
                count++;
                Debug.WriteLine("-----------\nSecret code\n-----------");
                for (int x = 0; x < codeSize; x++)
                {
                    Debug.WriteLine(code[x]);
                }
                Console.WriteLine("Correct positions : {0}", black);
                Console.WriteLine("Correct colours   : {0}\n", white);
                Console.WriteLine("History");

                for (int t = 1; t < codeSize + 1; t++)
                {
                    Console.Write(t + " ");
                }
                Console.WriteLine("B W");
                for (int g = 0; g < codeSize + 3; g++)
                {
                    Console.Write("--");
                }
                Console.Write("\n");
                for (int t = 0; t < count - 1; t++)
                {
                    for (int g = 0; g < codeSize + 2; g++)
                    {
                        Console.Write("{0} ", history[t, g]);
                    }
                    Console.WriteLine("\n");
                }
                if (codeSize > black)//reseting values for next turn
                {
                    black = 0;
                    white = 0;
                }
            }
            int play;
            Console.WriteLine("\nYou Win!\n\nPress 1 to play again or any other number to quit");
            play = Convert.ToInt32(Console.ReadLine());
            if (play == 1)
                game = true;

        } while (game == true);

4 个答案:

答案 0 :(得分:1)

当您声明数组时,数组具有固定大小,并且您无法在不创建新数组的情况下更改大小。请尝试使用强类型列表。

List<int> MyList = new List<int>();
// Add the value "1"
MyList.Add(1); 
表格的

或以下内容:

List<List<int>> MyTable = new List<List<int>>();
// Add a new row
MyTable.Add(new List<int>());
// Add the value "1" to the 1st row
MyTable[0].Add(1);

答案 1 :(得分:0)

有一种方法可以调整数组大小:

Array.Resize<T>

方法。详细信息:http://msdn.microsoft.com/en-us/library/bb348051(v=vs.110).aspx

但基于调整数组循环的调整通常是一个非常糟糕的主意。您需要选择另一种数据结构来保存数据,或者创建一个更大的数组,即用零填充。

答案 2 :(得分:0)

您还需要将项目添加到列表中。该列表将根据其大小动态增长。

int myInt = 6;
List<int> myList = new List<int>();
myList.Add(myInt);

答案 3 :(得分:0)

我相信您在询问是否可以在循环中更改数组的长度属性,并根据需要进行扩展。

直接,没有。有助手和类提供这样的功能,根据需要分配更多的内存,但我怀疑这是你真正需要的。您可以尝试使用固定维度的数组(程序将容忍或期望的最大codeSize),然后使用它旁边的整数来记录长度/位置。

或者,如果您确实需要扩展到任意大小并存储所有代码,只需使用List

List<int[]> theList = new List<int[]>();
theList.Add(code);

创建一个可以继续添加的整数数组(代码)列表,并像任何简单数组一样索引。