I'm working on a Roguelike console app for C#. I have several key features working such as movement arithmetic but I am unable to coordinate things so my sprite moves around the screen properly.

If you'll compile and run the code you'll notice you have to enter in a "w", "a", "s", or "d" key twice before you can start moving the character. After that, the character keeps moving in one direction whether you enter in a different key or not. Not only that, but the Console.ReadKey(false) method doesn't work and you have to enter another key and press enter in order to move the character again. Other problems persist as well, like the character disappearing from the screen.

Instead of what I have, I want smooth movement. For example, if the user presses the "w" key, it should move the character "up" without the user having to hit enter. Likewise, "a" and "d" should move the character left and right to allow for movement as seen in the original Rogue.

I've tried using Console.ReadKey(false) but it doesn't work to move the character without having to hit enter. The code seems to be a mess and I would like to know how I can eliminate those two Console.ReadLine methods so the user doesn't have to enter in two characters to start the game properly.

Can anybody help me make sense of this?

Code:
using System;

class Sample
{
    protected static int origRow;
    protected static int origCol;

    protected static void WriteAt(string s, int x, int y)
    {
        try
        {
            Console.SetCursorPosition(origCol + x, origRow + y);
            Console.Write(s);
        }
        catch (ArgumentOutOfRangeException e)
        {
            Console.Clear();
            Console.WriteLine(e.Message);
        }
    }

    public static void Main()
    {
        Console.ReadKey(false);

        int sr = 10;
        int sc = 10;

        Console.ReadKey(false);

        ConsoleKeyInfo theKey = Console.ReadKey(false);
        string choice = Console.ReadLine();

        do
        {
            Console.Clear();
            origRow = Console.CursorTop;
            origCol = Console.CursorLeft;

            string input = Console.ReadLine();

            WriteAt("@", sr, sc);

            Console.ReadKey(false);

            switch (theKey.KeyChar)
            {
                case 'W': case 'w' :
                    sc = sc - 1;
                    WriteAt("@", sr, sc);
                    break;

                case 'S': case 's' :
                    sc = sc + 1;
                    WriteAt("@", sr, sc);
                    break;

                case 'A': case 'a' :
                    sr = sr - 1;
                    WriteAt("@", sr, sc);
                    break;

                case 'D': case 'd' :
                    sr = sr + 1;
                    WriteAt("@", sr, sc);
                    break;
            }
        } while (choice != "Q");
    }
}