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 (.
).
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;
}
}
}
}
}