none
Minesweeper Algorithmus RRS feed

  • Frage

  • Hallo,
    ich weiß nicht mehr so wirklich weiter und habe nicht mal mehr einen Ansatz von dem ich glaube, er sei richtig. Ich brauche einen Algorithmus um ein Minesweeper Spiel zu brechnen. Ich habe als Startwerte die Höhe, die Breite und die Anzahl der Minen. Und wie nun weiter? Meine 2 Besten vermutungen sind folgende:

    1. Zeile für Zeile irgendwie berechnen und statistisch die Minen verteilen. (Minen wären leicht erratbar...)
    2. Kreuz und Quer mit einem Algorithmus alle Felder Durchgehen und befüllen. (Dieser Algorithmus fehlt mir...)

    Kann mir da vielleicht jemand helfen?


    Koopakiller - http://koopakiller.ko.ohost.de/

    Freitag, 4. Mai 2012 17:46
    Moderator

Antworten

  • Hi,

    wie der Poster vorher schon verriet: Die Random-Klasse ist dein Freund, mit ihr bekommst du Zufallswerte geliefert.

    Für jede deiner n Minen...

       a) X-Koordinate bestimmen ( in der Form "Mine.X = myRand.Next(Width)" ).

       b) Y-Koordinate bestimmen ( analog zu a )

       c) Prüfen ob bereits durch eine vorher verteilte Mine belegt, wenn ja, wieder bei a anfangen.

    Grüße

    Andreas

    PS: Man muss nicht verstehen, wieso jemand eine Frage als hilfreich markiert... ;-)

    Montag, 7. Mai 2012 10:36

Alle Antworten

  • Hallo,

    schau Dir mal an: http://stackoverflow.com/questions/1011198/non-repetitive-random-number-c-sharp

    (auch das in der 1. Antwort genannte:Fisher–Yates shuffle

    Gruß Elmar

    Freitag, 4. Mai 2012 18:08
  • Hi,

    wie der Poster vorher schon verriet: Die Random-Klasse ist dein Freund, mit ihr bekommst du Zufallswerte geliefert.

    Für jede deiner n Minen...

       a) X-Koordinate bestimmen ( in der Form "Mine.X = myRand.Next(Width)" ).

       b) Y-Koordinate bestimmen ( analog zu a )

       c) Prüfen ob bereits durch eine vorher verteilte Mine belegt, wenn ja, wieder bei a anfangen.

    Grüße

    Andreas

    PS: Man muss nicht verstehen, wieso jemand eine Frage als hilfreich markiert... ;-)

    Montag, 7. Mai 2012 10:36
  • Hallo, danke Andreas, deine Antwort hat mir den nötigen anstoß gegeben um es zu verstehen.

    Eines möchte ich noch ergänzen, wenn es so sein soll wie ab Vista, das dass 1. angeklickte Feld leer ist und sich die Zahlen drum herum versammeln, muss man nicht nur überprüfen ob es sich bei dem eventuellen Minenfeld schon um eine mine handelt, sondern auch ob es sich um das "Startfeld" bzw. eines der umliegnden ist.

    PS: Man muss nicht verstehen, wieso jemand eine Frage als hilfreich markiert... ;-)

    stimmt ;)


    Koopakiller - http://koopakiller.ko.ohost.de/

    Montag, 7. Mai 2012 20:28
    Moderator
  • Eines möchte ich noch ergänzen, wenn es so sein soll wie ab Vista, das dass 1. angeklickte Feld leer ist und sich die Zahlen drum herum versammeln, muss man nicht nur überprüfen ob es sich bei dem eventuellen Minenfeld schon um eine mine handelt, sondern auch ob es sich um das "Startfeld" bzw. eines der umliegnden ist.


    Was hat das denn mit der Generierung des Feldes zu tun? Oder war da eine versteckte weitere Frage, die sich nicht mehr mit dem Generieren des Minenfeldes beschäftigt?  ;-)

    Beim Aufdecken muss eben geprüft werden, du musst für die angrenzenden Felder dann eine indirekte Rekursion aufbauen.

    In etwa so vielleicht:

    public void MineField.OpenCell(openedCell:MineFieldCell)
    {
       if (openedCell.ContainsMine)
       {
          SignalGameOver();
       }
       else
       {
          if (openedCell.NumberAdjacentMines>0) 
          {
             openedCell.ShowNumber();
          }
          else begin
             OpenAdjacentCells(openedCell);
          end;
       }
    }

    Viele Grüße

    Andreas

    Dienstag, 8. Mai 2012 14:36
  • Schon klar, du hast meine Frage ja beantwortet. Man muss halt nur aufpassen beim generieren. Würde man es nicht so machen wie ich es beschrieb, dann könnte es sein das man einfach eine Zahl trifft und davon dann weiter zu spielen finde ich kaum sinnvoll, da man viel leichter beim 2. Klick schon eine Mine trifft. Deswegen spiele ich Minesweeper auch erst ab W7 (Vista?), weil es bei XP eben noch so generiert wurde war.

    Naja, bei Quadratischen funktioniert jetzt alles, aber bei Sechseecken...


    Koopakiller - http://koopakiller.ko.ohost.de/

    Dienstag, 8. Mai 2012 14:40
    Moderator