Estoy tratando de hacer un mapa como este en C #:

   0     1    
0 [ ]---[ ]   
   |     |    
   |     |    
1 [ ]---[ ]

Cuadrícula simple con habitaciones en (0,0), (1,0), (0,1) y (1,1)

He intentado hacer esto y tengo un ejemplo aquí https://dotnetfiddle.net/3qzBhy

Pero mi salida es: [ ]|||| [ ]

No entiendo por qué y no estoy seguro de si llamar a .ToString() en un StringBuilder hace que pierda su formato, como nuevas líneas.

También tuve problemas para encontrar una forma de almacenar coordenadas

Public SortedList<int, int> Rooms ()
    {
        var roomList = new SortedList<int, int>(); 

        roomList.Add(0,0);
        roomList.Add(1,0);
        //roomList.Add(0,1);
        //roomList.Add(1,1);

        return roomList;
    }

roomList.Add(0,1) y roomList.Add(1,1) son duplicados porque las claves 0 y 1 ya se utilizan. ¿Cómo puedo almacenar una lista de coordenadas?

1
Liam Kenneth 15 dic. 2016 a las 17:08

2 respuestas

La mejor respuesta

En lugar de difundir mis opiniones a través de comentarios, las dejaré todas aquí como respuesta:

También tuve problemas para encontrar una forma de almacenar coordenadas

SortedLists, Dictionaries, etc. no funcionarán. Lo mejor sería usar un List normal con Tuples, Points o una clase propia hasta que encuentre una solución mejor.

Dado que esas habitaciones tal vez no permanezcan vacías, podría escribir sus propias clases, por ejemplo:

class Tile
{
    public int X { get; set; }
    public int Y { get; set; }

    public virtual void Draw(StringBuilder map)
    {
        map.Append("   ");
    }
}

class Room : Tile
{ 
    public int EnemyType { get; set; }
    public int Reward { get; set; }

    public override void Draw(StringBuilder map)
    {
        map.Append("[ ]");
    }
}

// etc.

No entiendo por qué y no estoy seguro de si llamar a .ToString () en un StringBuilder hace que pierda su formato, como nuevas líneas.

No es así. No tenía líneas nuevas en su ejemplo porque todas las salas están en Y = 0

El intento actual no funcionará si dibuja varias líneas a la vez y las une. En su lugar, podría usar algo como una cuadrícula de "medio paso".

enter image description here

Puede encontrar un ejemplo pequeño (feo, no optimizado, improvisado) aquí como violín.

1
Manfred Radlwimmer 15 dic. 2016 a las 15:26

Además de los problemas con el formato de texto y la consola, y también las opciones que Manfred ya mencionó, aquí hay un ejemplo que usa una matriz en lugar de una lista. Una habitación es un valor true - en cualquier índice dado, "sin habitación" está representado por false.

Entonces, su método Rooms() se ve así:

public bool[,] Rooms ()
{
    var roomList = new bool[,]{{true,false},{true,true}};
    return roomList;
}

Lo que hace que tengas que cambiar IsRoom(int, int) para que se vea así:

public bool IsRoom(int x, int y)
{
    var rooms = Rooms();

    if(x<rooms.GetLength(0) && y<rooms.GetLength(1))
    {
        return (rooms[x,y]);
    }
    return false;
}

También faltaba un salto de línea, lo que llevó a tener un conector vertical en la misma línea que la habitación contigua. Lo cambié para ser

        if (IsRoom(x, y + 1))
        {
            buildMap.Append("\r\n".PadLeft(4) + DrawVerticalConnector().PadRight(4));
            buildMap.Append("\r\n".PadLeft(4) + DrawVerticalConnector().PadRight(4)+ "\r\n".PadLeft(4));
        }
0
K. Berger 15 dic. 2016 a las 14:35