C#读取字符并将其放置在特定位置

时间:2018-10-10 14:33:13

标签: c# console ascii console-application

首先,感谢您的帮助。 我是一名学生,我刚刚开始使用C#编程,所以请原谅我使我的代码如此混乱。

出于练习和娱乐的目的,我正在尝试制作一个ascii游戏(自上而下,就像旧的zelda游戏一样,但非常简单)。我设法建立了各种移动系统(“ w”将光标在控制台中向上移动,“ a”将其向左移动,等等。)地图也将完全在控制台中绘制。

由于我遇到的问题和随之而来的问题:每当我移动光标时,它实际上会将与我按下的按钮相对应的字符放置在地图的磁贴应放置的位置(例如:我按下“ w”。光标首先放置一个“ w”,它将替换地图图块,然后向上移动)。我的解决方案是首先复制最初在图块中的字符。之后,我移动光标。最后,我将复制的字符放回它所属的位置,而不是程序之前放置的“ w”,“ a”,“ s”或“ d”)。另一个解决方案是确保光标首先不要替换地图的ascii字符。问题是:我将如何实施这些解决方案之一?

我包含的代码显示了我的地图创建例程(当前仅填充“█”)和移动系统。

class Program
{   
    static void Main(string[] args)
    {
        Console.WindowWidth = 128; //The map will be 128x32
        Console.WindowHeight = 32;
        LoadMap();
        Console.SetCursorPosition(10, 10); //the cursor will be set at x = 10 and y = 10

        while (true) //a simple loop to check for user input
        {
            ConsoleKeyInfo input = Console.ReadKey();
            Console.Write("\b");
            PosX = Console.CursorLeft;
            PosY = Console.CursorTop;
            switch (input.KeyChar)
            {
                case 'w':
                Console.SetCursorPosition(PosX + 0, PosY - 1);
                    break;
                case 'a':
                Console.SetCursorPosition(PosX - 1, PosY + 0);
                    break;
                case 's':
                Console.SetCursorPosition(PosX + 0, PosY + 1);
                    break;
                case 'd':
                Console.SetCursorPosition(PosX + 1, PosY + 0);
                    break;
            }
        }
    }

    public static void PathWay(int PathSize) //pathsize = amount of █ placed in a row.
    {
        int n = 0;
        Console.ForegroundColor = ConsoleColor.Gray;
        while (n < PathSize)
        {
            n = n + 1;
            Console.Write("█");
        }
    }

    public static void LoadMap() //This will eventually call to many subroutines to create a map (a subroutine for creating a tree for example)
    {
        PathSize = 128;
        int n;
        n = 0;
        while(n < 32)
        {
            n = n + 1;
            PathWay(PathSize);
        }
    }

    public static int PathSize;
    public static int PosX;
    public static int PosY;
    public static string test;
}   

我当然可以做到,所以您只能踩着一种角色,但是如果您可以踩着一种以上角色,则游戏会更加有趣。

再次,谢谢您!

2 个答案:

答案 0 :(得分:0)

使用ReadKey(true)代替ReadKey()

ConsoleKeyInfo input = Console.ReadKey(true);
//Console.Write ("\b");

答案 1 :(得分:0)

您只能使用此语句来读取带有 true 参数的控制台输入键

// Start a console read operation. Do not display the input.
ConsoleKeyInfo input = Console.ReadKey(true);