AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Minesweeper

Ein Thema von saii · begonnen am 21. Mär 2015 · letzter Beitrag vom 29. Mär 2015
Antwort Antwort
Seite 1 von 2  1 2      
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#1

AW: Minesweeper

  Alt 26. Mär 2015, 16:20
Jajn. In der Regel schon, es gibt aber eine Ausnahme. Beispiel:
Code:
|*|1|_|_|
+-+-+-+-+
|1|1|_|_|
+-+-+-+-+
|_|#|1|1|
+-+-+-+-+
|_|_|1|*|
Nehmen wir an die Raute ist der Klick und das Feld ist auch leer. Nun werden alle Felder um das Feld (mit Raute) offen gelegt, bis auf das Feld oben rechts (wenn es frei ist, also weder eine Mine, noch eine Zahl enthällt).
Das ist doch schon wieder falsch.

Zum 100. mal: Die Diagonale ist keine Grenze.

In diesem Beispiel wird auf Feld(1,2) mit der Raute geklick.
geöffnet werden:
(0,2),(1,2),(0,3),(1,3) UND (2,1),(3,1),(2,0),(3,0)

Beispiel siehe Bild in Post #82.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.

Geändert von BadenPower (26. Mär 2015 um 16:30 Uhr) Grund: Hervorhebung hinzugefügt
  Mit Zitat antworten Zitat
saii

Registriert seit: 20. Feb 2015
22 Beiträge
 
#2

AW: Minesweeper

  Alt 26. Mär 2015, 16:38
Erstmal: Ich möchte nicht, das ihr das Programm für mich schreibt. Ich brauche nur leider viel Hilfe.
Ich werde auch Popov's Programm nicht einfach so abgeben. Ich werde meins fertigstellen (soweit wie ich komme).

Weiß jemand, warum keine Panels aufgedeckt werden, wenn ich auf ein Panel ohne benachbarte Minen drücke?
Warscheinlich was ganz banales, was ich übersehe
Angehängte Dateien
Dateityp: rar MINESWEEPER by saii.rar (194,9 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Minesweeper

  Alt 26. Mär 2015, 16:51
Erstmal: Ich möchte nicht, das ihr das Programm für mich schreibt. Ich brauche nur leider viel Hilfe.
Ich werde auch Popov's Programm nicht einfach so abgeben. Ich werde meins fertigstellen (soweit wie ich komme).

Weiß jemand, warum keine Panels aufgedeckt werden, wenn ich auf ein Panel ohne benachbarte Minen drücke?
Warscheinlich was ganz banales, was ich übersehe
Weil der Algo so nicht geht. Da muß z.B. rekursiv was gemacht werden. Siehe Z.B. Popov oder #73 mit #80 von meiner Wenigkeit (auch die Beispiele von BadenPower).

Geändert von Bjoerk (26. Mär 2015 um 17:02 Uhr) Grund: #80 statt #83
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Minesweeper

  Alt 26. Mär 2015, 16:43
Jajn. In der Regel schon, es gibt aber eine Ausnahme. Beispiel:
Code:
|*|1|_|_|
+-+-+-+-+
|1|1|_|_|
+-+-+-+-+
|_|#|1|1|
+-+-+-+-+
|_|_|1|*|
Nehmen wir an die Raute ist der Klick und das Feld ist auch leer. Nun werden alle Felder um das Feld (mit Raute) offen gelegt, bis auf das Feld oben rechts (wenn es frei ist, also weder eine Mine, noch eine Zahl enthällt).
Das ist doch schon wieder falsch.

Zum 100. mal: Die Diagonale ist keine Grenze.

In diesem Beispiel wird auf Feld(1,2) mit der Raute geklick.
geöffnet werden:
(0,2),(1,2),(0,3),(1,3) UND (2,1),(3,1),(2,0),(3,0)

Beispiel siehe Bild in Post #82.
So isses

Eine ganz simple Regel (die anscheinend schwer zu begreifen ist )
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: Minesweeper

  Alt 26. Mär 2015, 16:56
In diesem Beispiel wird auf Feld(1,2) mit der Raute geklick.
geöffnet werden:
(0,2),(1,2),(0,3),(1,3) UND (2,1),(3,1),(2,0),(3,0)

Beispiel siehe Bild in Post #82.
Das Bild in Post #82 unterstützt deine Aussage nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Minesweeper

  Alt 26. Mär 2015, 17:01
In diesem Beispiel wird auf Feld(1,2) mit der Raute geklick.
geöffnet werden:
(0,2),(1,2),(0,3),(1,3) UND (2,1),(3,1),(2,0),(3,0)

Beispiel siehe Bild in Post #82.
Das Bild in Post #82 unterstützt deine Aussage nicht.
Doch, sogar zweimal, allerdings musst du das Bild um 180° drehen, damit es zu deiner Beschreibung passt und somit diese widerlegt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Minesweeper

  Alt 26. Mär 2015, 17:10
Wo siehst du auf dem Bild #82 sich berührende Flächen über Eck?

Hier ein Beispiel wie ich es meine:
Angehängte Grafiken
Dateityp: png MineSweeper2.png (17,2 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Minesweeper

  Alt 26. Mär 2015, 17:12
Wo siehst du auf dem Bild #82 sich berührende Flächen über Eck?
Kuckst du, mit deiner überlagerten Aussage (und passend gedreht, für alle, die das im Kopf nicht hinbekommen )
Angehängte Grafiken
Dateityp: png PopovMine.png (275,9 KB, 14x aufgerufen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: Minesweeper

  Alt 26. Mär 2015, 17:21
Na gut, dann ist der Algorithmus für MineSweeper nicht wirklich eine Herausforderung.

Wer die Regel nicht will kann aus meinem Beispiel diese Zeilen löschen:
Delphi-Quellcode:
              if not ((a = 0) or (b = 0)) then
                Continue;
Sie verhindern die Öffnung benachbarter Flächen über Eck. So simpel die zwei Zeilen auch aussehen, ich hab da fast 3/4 Stunde dran gesessen. Das war das einzig komplizierte. Der Rest ist in fünf bis zehn Minuten gemacht.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Minesweeper

  Alt 26. Mär 2015, 22:55
Na gut, dann ist der Algorithmus für MineSweeper nicht wirklich eine Herausforderung. [..]
Ich kenn das Spiel ja quasi erst seit gestern aber kann es sein daß wir das vergessen haben? "Wenn man auf ein leeres Feld klickt, öffnen sich alle anschliessenden leeren Felder + das erste mit einer Zahl belegten Feld" (aus einem VB Forum). Oder stimmt das nicht?

Also zusätzlich zur Rekursion noch den Code nach den ???

Delphi-Quellcode:
procedure TMinesweeperForm.Play(X, Y: integer); // PanelsMouseUp, Button mbLeft;
var
  I, J, K, L: integer;
begin
  // Wenn zu tun:
  // Wenn im Raster und noch nicht aufgedeckt und leeres Feld bzw. Feld mit einer pos. Zahl drin; (Mine = -1);
  if InPanelGrid(X, Y) and FPanels[X, Y].Enabled and (FPanels[X, Y].FlankingMinesCount >= 0) then
  begin
    if FPanels[X, Y].FlankingMinesCount > 0 then // Wenn Zahl > Null;
      FPanels[X, Y].Caption := IntToStr(FPanels[X, Y].FlankingMinesCount)
    else
      FPanels[X, Y].Caption := ''; // Null;
    FPanels[X, Y].Color := clWindow; // farblich kennzeichnen und
    FPanels[X, Y].Enabled := false; // -> aufdecken;
    for I := -1 to 1 do
      for J := -1 to 1 do
        if ((I <> 0) or (J <> 0)) // Alle außer 0 / 0;
          and InPanelGrid(X + I, Y + J) // Wenn im Raster;
          and FPanels[X + I, Y + J].Enabled // Wenn noch nicht aufgedeckt;
          and (FPanels[X + I, Y + J].FlankingMinesCount = 0) // Wenn leer
          and (FPanels[X + I, Y + J].Caption <> cFlagSign) then // und keine Fahne;
        begin
          Play(X + I, Y + J); // Rekursion;
          // Angrenzende Felder des leeren Feldes die eine Zahl haben ebenfalls aufdecken ???
          for K := -1 to 1 do
            for L := -1 to 1 do
              if ((K <> 0) or (L <> 0)) // Alle außer 0 / 0;
                and InPanelGrid(X + K, Y + L) // Wenn im Raster;
                and (FPanels[X + K, Y + L].FlankingMinesCount > 0) // Wenn Zahl > 0;
                and (FPanels[X + K, Y + L].Caption <> cFlagSign) then // und keine Fahne;
              begin
                FPanels[X + K, Y + L].Caption := IntToStr(FPanels[X + K, Y + L].FlankingMinesCount);
                FPanels[X + K, Y + L].Color := clWindow; // farblich kennzeichnen und
                FPanels[X + K, Y + L].Enabled := false; // -> aufdecken;
              end;
        end;
  end;
end;

Geändert von Bjoerk (26. Mär 2015 um 23:39 Uhr) Grund: Code
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz