Avatar billede oneeighty Nybegynder
01. februar 2010 - 21:45 Der er 1 kommentar

Minesweeper

Jeg sidder og forsøger at lave grundarbejdet til et lille minestryger spil. Jeg er løbet ind i et problem i forbindelse med fylder mit "board". På hver "node" på boardet har jeg en liste (Relations) med de op til 8 naboer til den pågældende node(tile). Jeg har vedlagt koden til både node og til boardet, problemet opstår i de nestede for-loop i PopulateBoard()-metoden, jeg kan ikke helt overskue hvor det går galt, men det er jo nok mine if-statements som skal revideres.
Håber nogen kan hjælpe :)

public enum FieldState
{
    Free = 0,
    One = 1,
    Two = 2,
    Three = 3,
    Four = 4,
    Five = 5,
    Six = 6,
    Seven = 7,
    Eight = 8,
    Mine = 9
}

class BoardNode
{
    public FieldState State { get; set; }
    public int Y { get; private set; }
    public int X { get; private set; }
    public List<BoardNode> Relations { get; set; }

    public BoardNode(int x, int y)
    {
        Y = y;
        X = x;
        Relations = new List<BoardNode>();
    }
}

public class Board
{
private readonly int length;
private readonly int width;
private BoardNode[,] board;
static Random rnd = new Random();

public Board(int length, int width)
{
    this.length = length;
    this.width = width;
    board = new BoardNode[width,length];
    PopulateBoard();
    PlaceMines(1);
}

public void ShowBoard()
{
    for (int i = 0; i < board.GetLength(0); i++)
    {
        for (int j = 0; j < board.GetLength(1); j++)
        {
            Console.Write("{0}", (int)board[i,j].State);
        }
        Console.WriteLine();
    }
}

public void PlaceMines(int numOfMines)
{
    for (int y = 0; y < numOfMines; y++)
    {
        int rndX = rnd.Next(0, width);
        int rndY = rnd.Next(0, length);
        board[rndY, rndX].State = FieldState.Mine;
        for (int i = 0; i < board[rndY, rndX].Relations.Count; i++)
        {
            board[rndY, rndX].Relations[i].State++;
        }
       
       
    }
}

public void PopulateBoard()
{
    for (int y = 0; y < board.GetLength(0); y++)
    {
        for (int x = 0; x < board.GetLength(1); x++)
        {
            board[y,x] = new BoardNode(y,x);

        }
    }

    for (int y = 0; y < board.GetLength(0); y++)
    {
        for (int x = 0; x < board.GetLength(1); x++)
        {
            for (int y1 = x-1; y1 <= x+1; y1++)
            {
                for (int x1 = y-1; x1 <= y+1; x1++)
                {
                    if (x != x1 || y != y1)
                    {
                        if ((y1 >= 0 && y1 < board.GetLength(0)) && (x1 >= 0 && x1 < board.GetLength(1)))
                        {
                            board[y,x].Relations.Add(board[y1,x1]);
                        }
                    }
                }
            }
        }
    }
}
Avatar billede janus_007 Nybegynder
03. februar 2010 - 20:50 #1
Må jeg spørge om hvorfor du bruger Boardets's begrænsninger til at iterere igennem?
Hvorfor ikke blot arbejde med selve BoardNodens x,y og så holde en liste af Boardnodes og iterere igennem den og blot placere på x,y!

Men måske jeg misforstår hvad boardnoden er?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester