问题 什么地方出了错?

猪肉店

活跃成员
已加入
2019年4月13日
留言内容
26
地点
瑞典
编程经验
Beginner
我有一个想要在其中选择球员的网格中移动的程序。当从最后一行的第一个位置移动时,由于值超出了数组的大小,它给了我一条错误消息,我不知道如何解决它。而且,当我按下按钮时如何使它自动移动,因此我不必在两次按下之间按Enter即可进行注册?

C#:
using System;
namespace ConsoleApp2
{
    class Program
    {
        static void Print(int[] board, int Pos, int rGrid)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            int i = 0;
            while (i < (rGrid*rGrid))
            {
              
                board[Pos] = 5;
                if ((i + 1) % rGrid == 0)
                {
                    if (board[i] == board[Pos]) Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine(board[i]);
                    Console.ForegroundColor = ConsoleColor.Yellow;
                }
                else
                {
                    if (board[i] == board[Pos]) Console.ForegroundColor = ConsoleColor.Green;
                    Console.Write(board[i]);
                    Console.ForegroundColor = ConsoleColor.Yellow;
                }
                  
              
                i++;
            }
          
        }
        static void Clear(int[] board, int rGrid)
        {
            int h = 0;
            while (h < (rGrid*rGrid))
            {
                board[h] = 0;
                h++;
            }
        }
    
    static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.DarkYellow;
            Console.WriteLine("Enter CellGrid");
            string grid = Console.ReadLine();
            int rGrid;
            if (int.TryParse(grid, out rGrid))
            {
                Console.Clear();

                int Pos = rGrid;
                int[] board = new int[(rGrid*rGrid)];
                int j = 0;
                while (j < (rGrid*rGrid))
                {
                    board[j] = 0;
                    j++;
                }

            Choose:
                int i = 0;
                while (i < 10)
                {
                    Print(board, Pos, rGrid);
                    string answer = Console.ReadLine();
                    Clear(board, rGrid);
                    if (answer == "w")
                    {
                        if ((Pos - rGrid) >= 0) Pos -= rGrid;
                        else Pos += ((rGrid*rGrid)-rGrid);
                    }
                    else if (answer == "s")
                    {
                        if ((Pos + rGrid) <= (rGrid * rGrid)) Pos += rGrid;
                        else
                        {
                          
                          
                                Pos -= ((rGrid * rGrid) - rGrid);
                          
                        }
                    }
                    else if (answer == "d")
                    {
                        if ((Pos + 1) > ((rGrid*rGrid)-1))
                        {
                            Pos = 0;
                        }
                        else Pos++;
                    }
                    else if (answer == "a")
                    {
                        if ((Pos - 1) < 0)
                        {
                            Pos = (rGrid*rGrid)-1;
                        }
                        else Pos--;
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("[Invalid Syntax!]");
                        Console.ReadKey();
                        Console.Clear();
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        goto Choose;
                    }
                    Console.Clear();
                }
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("[Invalid Syntax!]");
                Console.ReadKey();
                Console.Clear();
                Console.ForegroundColor = ConsoleColor.Yellow;
                Main(null);
            }
         


        }
    }
}
 
由主持人最后编辑:

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
你必须按的原因"Enter" is because you are using ReadLine(). That waits for an entire line of text to be entered. The end of a line is denoted by pressing the "Enter" key.

You should be using ReadKey() like you seem to be using in other places in your code.
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
至于数组超出范围问题,请记住,C#数组基于零。您在第75行的条件没有考虑到这一点。

For example, let rGrid be 3. So when you end up creating an one dimensional array with 9 elements because 3*3 == 9, and set the initial Pos to 3. When you first press 's' to go down 3+3 == 6. The next time 6 + 3 == 9. But your array is only good for indices 0 to 8.

为什么要使用一维数组使事情变得艰难?为什么不立即创建二维数组?这样,您不必进行所有这些列和行的计算即可根据在X轴还是Y轴上移动来确定下一个位置。

顺便说一句,请注意,并非所有键盘都有"WASD"设置为倒T。例如,在我的Dvorak键盘上:
500px-KB_United_States_Dvorak.svg.png
 

猪肉店

活跃成员
已加入
2019年4月13日
留言内容
26
地点
瑞典
编程经验
Beginner
我曾考虑过C#是基于0的,但是我仍然想出一个可能的解决方法。
我还没有学习过二维数组,在这个项目之后我会做的。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
而且,如何使用ReadKey()?
也许从阅读开始 该方法的文档. It says that it returns a ConsoleKeyInfo object, not a char, so the next step would be to read about that type and how you get the info you need form it. Reading the relevant info should ALWAYS be the first step.
 

猪肉店

活跃成员
已加入
2019年4月13日
留言内容
26
地点
瑞典
编程经验
Beginner
好吧,我做到了。我使用了这段代码,但只允许我输入"w"在控制台中作为输入,但不接受所有其他符号。我只用w进行了测试,因为它更容易。
C#:
using System;
namespace Move_R2
{
    class Program
    {
        static void Print(string[,] board, int a, int xPos, int yPos)
        {
            for (int i = 0; i < a; i++)
            {
                for (int j = 0; j < a; j++)
                {
                    if (board[i, j] == board[yPos, xPos])
                    {
                        if ((j + 1) % a == 0)
                        {
                            Console.ForegroundColor = ConsoleColor.Green;
                            Console.WriteLine(board[i, j]);
                            Console.ForegroundColor = ConsoleColor.Yellow;
                        }
                        else
                        {
                            Console.ForegroundColor = ConsoleColor.Green;
                            Console.Write(board[i, j]);
                            Console.ForegroundColor = ConsoleColor.Yellow;
                        }
                    }
                    else
                    {                    
                        if ((j+1) % a == 0)
                        {
                            Console.WriteLine(board[i, j]);
                        }
                        else Console.Write(board[i, j]);
                    }
                }
            }
        }
        //prints every value in board[] and every a/2,a/2 is green (Player position).
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            const int a = 5;
            int xPos = a/2;
            int yPos = a/2;        
            string[,] board = new string[a, a];
        // creates grid in R2
        Start:
            Console.Clear();
            for (int i =0; i<a; i++)
            {
                for (int j = 0; j<a; j++)
                {
                    board[i,j] = "O";
                }
            }
            //Assigns all values to "O"                
            board[yPos, xPos] = "X";
            Print(board, a, xPos, yPos);
          
while (Console.ReadKey().Key == ConsoleKey.Enter)
       
            {
                if ((yPos - 1) >= 0)
                {
                    yPos--;
                }
                else yPos = (a - 1);
}
         
            goto Start;
        }
    }
}
 
由主持人最后编辑:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
您是否调试了代码,即设置了断点并逐行逐步执行?如果没有,则应该立即执行此操作。拥有后,如果仍然需要帮助,请告诉我们确切的位置以及代码的行为与您的期望有所不同。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
好吧,我做到了。我使用了这段代码,但只允许我输入"w"在控制台中作为输入,但不接受所有其他符号。我只用w进行了测试,因为它更容易。
[/代码]
其实不是只接受"w"。这是因为如果您在第63-67行进行编码,"w"被按下。您在第60行的唯一条件是,只要"Enter"不按键,然后继续循环播放。一次以外的其他任何键"Enter"按下后,第63-67行将输入视为用户想要向上移动。如果您有其他逻辑来查看实际按下的键,则可能会有不同的行为。
 

猪肉店

活跃成员
已加入
2019年4月13日
留言内容
26
地点
瑞典
编程经验
Beginner
噢,我的坏。我抄错了。我改写了ConsoleKey.W。但是当它运行时,我得到与上述相同的结果,我不明白有什么问题。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,609
地点
弗吉尼亚州切萨皮克
编程经验
10+
使用调试器逐步执行代码,当您观察与程序获取的数据有关的情况时,应该会使事情更加清晰。
 
最佳 底部