Skip to content

Latest commit

 

History

History
153 lines (115 loc) · 4.77 KB

File metadata and controls

153 lines (115 loc) · 4.77 KB

Problema

30 - Cria um jogo tile-based e turn-based no qual o jogador se move numa grelha 2D (não-toroidal, ou seja, com paredes nos limites do mundo). O jogador apenas se move para cima, para baixo e para os lados, usando as teclas WSAD. A tecla Q indica que o jogo terminou. A grelha deve ser representada como um array bidimensional, e após cada turn o mundo de jogo deve ser mostrado no ecrã, com o jogador representado por uma arroba (@) e os espaços vazios representados por um ponto (.).

Soluções

Solução 1

using System;

namespace exercicios_bases_cs
{
    class Program
    {
        static void Main(string[] args)
        {
            // VARIÁVEIS:

            // O mapa e os seus gráficos
            char[,] map;
            char mapTile = '.';
            char mapWallV = '|';
            char mapWallH = '_';

            // As dimensões do mapa
            uint mapHeight;
            uint mapWidth;

            // O jogador e as suas coordenadas
            char player = '@';
            uint playerX;
            uint playerY;

            // Onde guardaremos o input to utilizador
            ConsoleKey keyInput;

            // DEFINIR DIMENSÕES E POSIÇÕES:

            // Definimos aqui as dimensões do mapa, em n de tiles
            mapWidth = 40;
            mapHeight = 20;

            // Inicializamos o array do mapa com as dimensões definidas
            map = new char[mapWidth, mapHeight];

            // Definimos o local inicial do jogador no centro do mapa
            playerX = mapWidth / 2;
            playerY = mapHeight / 2;

            // LOOP DO PROGRAMA
            while (true)
            {
                // limpa a janela ao inicio de cada loop
                Console.Clear();

                // DEFINIR AS COORDENADAS DOS ELEMENTOS NOS MAPA

                // Enchemos o mapa com as tiles
                for (uint y = 0; y < mapHeight; y++)
                {
                    for (uint x = 0; x < mapWidth; x++)
                    {
                        map[x, y] = mapTile;
                    }
                }

                // Introduzimos o player no mapa com as suas próprias coordenadas
                map[playerX, playerY] = player;

                // DESENHAR O MAPA, LIMITES, E JOGADOR

                // Cria o teto, antes de tudo, no topo da janela
                Console.Write(" ");
                for (uint _x = 0; _x < mapWidth; _x++) Console.Write(mapWallH);
                Console.WriteLine();

                // Desenhamos no ecrã todos os elementos do array mapa
                for (uint y = 0; y < mapHeight; y++)
                {
                    // criamos uma parede vertical no inicio de cada linha
                    Console.Write(mapWallV.ToString());
                    for (uint x = 0; x < mapWidth; x++)
                    {
                        // Desenha as tiles
                        Console.Write(map[x, y]);
                    }

                    // Criamos parede vertical no fim de cada linha
                    Console.WriteLine(mapWallV.ToString());
                }

                // criamos o "chão" do mesmo método que foi feito o teto
                Console.Write(" ");
                for (uint _x = 0; _x < mapWidth; _x++) Console.Write(mapWallH);

                // INTERAÇÃO JOGADOR -> APLICAÇÃO

                // Texto informativo debaixo do mapa
                Console.WriteLine("\nMap dimensions: {0} X {1}." +
                    "\nUse 'WASD' to move." +
                    "\nPress 'Q' to Quit.", mapWidth, mapHeight);

                // Guardamos a próxima tecla pressionada.
                keyInput = Console.ReadKey().Key;

                // Usamos o if para podermos sair do loop neste caso especifico
                if (keyInput == ConsoleKey.Q) break;

                // Alteramos a coordenadas próprias do jogador de acordo com as
                // teclas pressionadas pelo utilizador.
                switch (keyInput)
                {
                    // A cada caso verificamos se o jogador está no limite do mapa
                    // para o impedirmos de sair dele e crashar tudo

                    case ConsoleKey.A:
                    if (playerX > 0) playerX--;
                    break;

                    case ConsoleKey.D:
                    if (playerX < mapWidth - 1) playerX++;
                    break;

                    case ConsoleKey.S:
                    if (playerY < mapHeight - 1) playerY++;
                    break;

                    case ConsoleKey.W:
                    if (playerY > 0) playerY--;
                    break;

                    default:
                    break;

                }

            }

        }

    }

}

Por Rafael Castro e Silva