C#无法在ASCII控制台游戏

时间:2018-03-06 16:44:01

标签: c# oop console character ascii

我有一个学校的C#项目。我无法在这个ASCII控制台游戏中移动我的角色。它必须是OO。运行代码后,我得到了这个:

Result before pressing left or right.

向左或向右按​​后,我得到了

this.

有人可以帮我这个吗?任何帮助表示赞赏。

的Program.cs:

class Program
{

    static void Main(string[] args)
    {
        SuperConsole.Init(50, 44);

        // create the game
        Game game = new Game(30, 30);

        //create objects
        Entity spaceship = new Entity(1, 15, '@', SuperConsoleColor.Cyan); 



        // start the game loop
        RunGameLoop(game);
    }

    protected static void RunGameLoop(Game game)
    {
        SuperConsole.BackgroundColor = SuperConsoleColor.DarkBlue;
        SuperConsole.ForegroundColor = SuperConsoleColor.Gray;

        int refreshRate = 20;

        SuperConsole.CursorVisible = false;

        SuperConsole.BackgroundColor = SuperConsoleColor.DarkBlue;
        SuperConsole.ForegroundColor = SuperConsoleColor.Gray;
        SuperConsole.Clear();

        Reset(game);

        game.Draw(0.0f);

        SuperConsole.Flush();

        /*
        SuperConsole.SetCursorPosition(0, 0);*/

        while (true)
        {
            while (SuperConsole.KeyAvailable)
            {
                ConsoleKeyInfo key = SuperConsole.ReadKey(true);
                game.OnInput(key.Key);
            }

            System.Threading.Thread.Sleep(1000 / refreshRate);

            Reset(game);
            game.Draw(1.0f / (float)refreshRate);
            SuperConsole.Flush();


        }
    }

    protected static void Reset(Game game)
    {
        SuperConsole.BackgroundColor = SuperConsoleColor.Black;
        SuperConsole.ForegroundColor = SuperConsoleColor.Black;
        SuperConsole.SetCursorPosition(0, 0);
        for (int y = 0; y < game.GetHeight(); ++y)
        {
            for (int x = 0; x < game.GetWidth(); ++x)
            {
                SuperConsole.Write(" ");
            }
            SuperConsole.WriteLine();
        }
        SuperConsole.SetCursorPosition(0, 0);
    }
}

}

game.cs:

class Game : Entity
{
    protected int width, height;

    Entity spaceship = new Entity(1, 15, '@', SuperConsoleColor.Cyan);

    public Game(int newWidth, int newHeight)
    {

        // set the size
        width = newWidth;
        height = newHeight;

        // set the window
        Console.WindowWidth = width+1;
        Console.WindowHeight = height+1;
    }

    public int GetWidth()
    {
        return width;
    }

    public int GetHeight()
    {
        return height;
    }

    public void Draw(float dt) 
    {

        SuperConsole.SetCursorPosition(spaceship.GetX(), spaceship.GetY());
        SuperConsole.ForegroundColor = spaceship.GetColour();
        SuperConsole.Write(spaceship.GetChar());
    }



    public void OnInput(ConsoleKey key)
    {
        int redo = 0;
        ConsoleKey pressedKey = key;

        do
        {    
            Console.Clear();

            switch (pressedKey)
            {
                case ConsoleKey.LeftArrow:
                    SuperConsole.SetCursorPosition(spaceship.GetX() - 1, spaceship.GetY());
                    break;
                case ConsoleKey.UpArrow:

                    break;
                case ConsoleKey.RightArrow:

                    SuperConsole.SetCursorPosition(spaceship.GetX()+1, spaceship.GetY());

                    break;
                case ConsoleKey.DownArrow:

                    break;
            }
        } while (redo == 0);

    }

}

}

entity.cs:

class Entity 
{
    protected int xPos;
    protected int yPos;

    protected char character;

    protected SuperConsoleColor colour;



    public Entity()
    {
    }

    public Entity(int xPosNew, int yPosNew, char newCharacter, SuperConsoleColor newColour) 
    {
        //define position
        xPos = xPosNew;
        yPos = yPosNew;

        //define character
        character = newCharacter;

        //define colour
        colour = newColour;
    }

    public char GetChar()
    {
        return character;
    }

   public int GetX()
    {
        return xPos;
    }




    public int GetY()
    {
        return yPos;
    }

    public SuperConsoleColor GetColour()
    {
        return colour;
    }




}

}

1 个答案:

答案 0 :(得分:0)

我看到两个问题:

  • RunGameLoop(Game game)内,您应将while (SuperConsole.KeyAvailable)替换为if (SuperConsole.KeyAvailable)
  • Game.OnInput(ConsoleKey)内,您可以更改光标位置而不是太空船位置

同时尝试使用断点检查代码是否到达Game.Draw()并检查飞船位置和光标位置是否正确。

此外,您还应该了解更多C#。 而不是

public char GetChar()
{
    return character;
}
private character;

.Net允许您使用属性:

public char Character
{
    get; private set;
}

public char Character
{
    get { return character; }
}
private character = '@';

希望这有帮助。

除此之外:没有冒犯,但这个问题并不是Stackoverflow的真正含义。将来,请更耐心,并尝试使用Google调试提示,而不是让Stackoverflow为您做“肮脏的工作”。