Рисование фигур тетриса из верхней части окна C # - PullRequest
0 голосов
/ 07 мая 2018

Я следовал руководству по c ++ по написанию простой игры в тетрис. Я пишу на C #, так что это было довольно сложно. Я использую массив, который состоит из 0, 1, 2 (давайте просто скажем, что это точка разворота). Моя проблема в том, что я хочу начать писать 1,2 с верхней части консоли, исключая 0. Я пытался использовать GetXInitialPosition() и GetYInitialPosition(), которые возвращают отрицательные значения, чтобы нарисовать блок, исключая нули над формой, в методе Console.SetCursorPosition(). Этот метод не может принимать отрицательные значения, потому что он должен рисовать над окном консоли. В конце приведен пример кода. Я хочу пропустить все выше 00210 и начать рисовать оттуда. Все, что я действительно хочу сделать, это найти способ рисовать над консолью.

Вот учебник, которому я следовал http://javilop.com/gamedev/tetris-tutorial-in-c-platform-independent-focused-in-game-logic-for-beginners/

А вот и мой код:

class Tile
{
    public Tile()
    {
        pPiece = SetRandomShape();
        pRotation = 0;
   }

    public int GetBlockType(int whichBlock, int pRotation, int pX, int pY)
    {
        return Block1[whichBlock, pRotation, pX, pY];
    }

    public int GetXInitialPosition()
    {
        return BlockInitialPosition[pPiece, pRotation, 0];
    }

    public int GetYInitialPosition()
    {
        return BlockInitialPosition[pPiece, pRotation, 1];
    }

    public void Print(int xPos, int yPos)
    {
        for (int i = 0; i < Block.GetLength(2); i++)
        {
            for (int j = 0; j < Block.GetLength(3); j++)
            {
                if ((GetBlockType(pPiece, pRotation, j, i) == 1))
                {
                    Console.SetCursorPosition(xPos + i, yPos + j);
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.Write(GetBlockType(pPiece, pRotation, j, i));
                }
                else if ((GetBlockType(pPiece, pRotation, j, i) == 2))
                {
                    if (yPos + j >= 0)
                    {
                        Console.SetCursorPosition(xPos + i, yPos + j);
                        Console.ForegroundColor = ConsoleColor.Blue;
                        Console.Write(GetBlockType(pPiece, pRotation, j, i));
                    }
                }
                else //displaying 00
                {
                    Console.SetCursorPosition(xPos  + i,  yPos + j);
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.Write(GetBlockType(pPiece, pRotation, j, i));
                }
            }
            Console.WriteLine(" ");
        }
    }

    private int[,,,] Block = new int[7, 4, 5, 5] //7 kinds , 4 rotation / 5 horizontal / 5 vertical
{
              {
             {0, 0, 0, 0, 0},
             {0, 0, 0, 0, 0},
             {0, 0, 2, 1, 0},
             {0, 0, 1, 1, 0},
             {0, 0, 0, 0, 0}
             },


       private int[,,] BlockInitialPosition = new int[7, 4, 2] // 7 kinds , 4 rotations , horizontal value of row that needs to be removed , vertical  value of row that needs to be removed
 /* Square */
             {
             {-2, -3},
             {-2, -3},
             {-2, -3},
             {-2, -3}
            },

1 Ответ

0 голосов
/ 07 мая 2018

Рисование вне консоли невозможно.Это также не имеет большого значения, потому что мы все равно не сможем это увидеть.Так что просто не пишите вне консоли.В двойном цикле перед кодом if-else-if проверьте, будете ли вы рисовать вне консоли, и если да, пропустите чертеж.Как то так:

for (int i = 0; i < Block.GetLength(2); i++)
{
    if (xPos + i < 0 || xPos + i >= Console.WindowWidth)
        continue;

    for (int j = 0; j < Block.GetLength(3); j++)
    {
        if (yPos + j < 0 || yPos + j >= Console.WindowHeight)
            continue;

        // if-else-if ...
    }
}
...