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 7 von 14   « Erste     567 89     Letzte »    
saii

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

AW: Minesweeper

  Alt 25. Mär 2015, 19:26
Wie Popov schon gesagt hat, bin ich Anfänger und folglich sagen mir die meisten Methoden und Befehle, die ihr hier auflistet garnichts.
Im Moment bin ich auch nicht bedacht, das Programm so perfekt wie möglich zu machen, sondern bis Freitag das ganze zum Laufen zu bringen.

Vielleicht perfektionier ich das danach.
Aber jetzt fehlt mir erstmal noch, dass das Anklicken eines Panels ohne benachbarte Minen, alle benachbarten Panels aufdeckt.
Dazu reicht mir auch, wenn alle Panels ohne benachbarte Minen aufgedeckt werden, nicht niur die benachbarten Panels (Stichwort Floodfill. Mal sehen ob ich das noch mache)

Und dann fehlt nur noch die Nachricht "Du hast gewonnen", für die ich mir auch noch etwas ausdenken muss.

Womit ich Hilfe brauche:
Zunächst funktioniert das Aufdecken ALLER Panels, die den Wert m=0 (=keine benachbarten Minen) haben nicht.
Könnte da jemand bitte mal reingucken?

Relevanter Teil: (gesamtes Programm auf Seite 4)
Delphi-Quellcode:
procedure TForm1.CannonFire(var A,B,m:integer; Sender: TObject);
var h,j:integer;
begin
        Panel:=TPanel(Sender);
        A:=StrToInt(Copy(Panel.Name, 3,2));
        B:=StrToInt(Copy(Panel.Name, 6,2));

        if IntA[A,B]<>9 then
        begin
                m:=IntA[A,B];
                if IntA[A,B]=0 then
                begin
                        for h:= 0 to 14 do
                        begin
                                for j:=0 to 14 do
                                begin
                                        if IntA[h,j]=0 then PanelA[h,j].Caption:='_';

                                        if (h+1>=0) and (h+1<=14) and (j>=0) and (j<=14) then PanelA[h+1,j].Caption:='_';
                                        if (h+1>=0) and (h+1<=14) and (j+1>=0) and (j+1<=14) then PanelA[h+1,j+1].Caption:='_';
                                        if (h>=0) and (h<=14) and (j+1>=0) and (j+1<=14) then PanelA[h,j+1].Caption:='_';
                                        if (h-1>=0) and (h-1<=14) and (j+1>=0) and (j+1<=14) then PanelA[h-1,j+1].Caption:='_';
                                        if (h-1>=0) and (h-1<=14) and (j>=0) and (j<=14) then PanelA[h-1,j].Caption:='_';
                                        if (h-1>=0) and (h-1<=14) and (j-1>=0) and (j-1<=14) then PanelA[h-1,j-1].Caption:='_';
                                        if (h>=0) and (h<=14) and (j-1>=0) and (j-1<=14) then PanelA[h,j-1].Caption:='_';
                                        if (h+1>=0) and (h+1<=14) and (j-1>=0) and (j-1<=14) then PanelA[h+1,j-1].Caption:='_';
                                end;
                        end;
                end;
        end;
        
        if IntA[A,B]=9 then
        begin
                ShowMessage('Du hast Verloren!');
                close;
        end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#62

AW: Minesweeper

  Alt 25. Mär 2015, 19:41
Wenn Deine beiden Schleifen von 0 bis 14 laufen, dann nenne mir doch mal einen Fall, in dem
Delphi-Quellcode:
h+1>=0
j>=0
j<=14
nicht zutreffen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
saii

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

AW: Minesweeper

  Alt 25. Mär 2015, 19:44
Stimmt allerdings. Ich wollte halt sichergehen. Aber du hast natürlich Recht

*Edit:
Aber wenn h=14 dann wird h+1>14
-> Dann brauch ich das, oder?

Geändert von saii (25. Mär 2015 um 20:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#64

AW: Minesweeper

  Alt 25. Mär 2015, 19:59
Ich wollte halt sichergehen.
Das ist im Allgemeinen keine schlechte Idee.
Für solche Aussagen (sollte immer wahr sein, wenn das Programm korrekt ist) bieten sich Assertions an.
Aber bitte nur einmal in der Schleife
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#65

AW: Minesweeper

  Alt 25. Mär 2015, 20:48
WDazu reicht mir auch, wenn alle Panels ohne benachbarte Minen aufgedeckt werden, nicht niur die benachbarten Panels (Stichwort Floodfill. Mal sehen ob ich das noch mache)
Die Floodfill Methode ist geeignet Flächen zu füllen, für das Aufdecken einer Fläche wie es in MineSweeper gemacht wird, ist es der falsch Algorithmus. Oder man nimmt es nicht so genau und macht es zu 95%.

Man kann es vielleicht als Grundlage nehmen, mehr aber auch nicht.
  Mit Zitat antworten Zitat
saii

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

AW: Minesweeper

  Alt 25. Mär 2015, 20:54
Alles klar.
Und weiß jemand wie ich bei meinem Problem weiterkomme?
  Mit Zitat antworten Zitat
Bjoerk

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

AW: Minesweeper

  Alt 25. Mär 2015, 22:21
Muß man die IntA[h + 1, j + 1] ect. evtl. auf Null prüfen (keine Ahnung?) bevor Caption auf '_' gesetzt wird?
  Mit Zitat antworten Zitat
BadenPower

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

AW: Minesweeper

  Alt 25. Mär 2015, 22:36
Die Floodfill Methode ist geeignet Flächen zu füllen, für das Aufdecken einer Fläche wie es in MineSweeper gemacht wird, ist es der falsch Algorithmus.
Der FloodFill-Algorithmus in der 4-Neighbour-Variante ist doch genau der Ansatz den er braucht.

Wenn in ein Feld geklickt wird, dass keine Zahl und keine Bombe enthält, dann alles Aufdecken, was leer ist und was angrenzend eine Zahl hat.

Also, wenn leer, dann aufdecken und rekursiv oben unten links und rechts weiter prüfen. Wenn eine Zahl, dann nur aufdecken und diese Stelle nicht mehr weiter untersuchen.
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#69

AW: Minesweeper

  Alt 25. Mär 2015, 22:43
Mein Hinweis auf falschen Algorithmus in Post #65 bezog sich auf Floofill. Dein Code in Post #61 ist aber... sagen wir es mal psychologisch nett: noch weniger richtig.

Du kannst die Matrix nicht mit For-Schleifen durchgehen. Damit bekommst du irgendwas hin, vielleicht sogar freie Flächen inkl. Zahlenwerte um die Minen, aber eben alle Flächen in der Matrix. Das ist aber nicht unbedingt das wie MineSweeper funktioniert. Du musst nur die Fläche um den Klick herum frei machen.

Das bedeutet, dass du von deiner geklickten Zelle heraus arbeiten musst. Das bekommt man nicht ohne Hilfe eines Stapelspeichers (Stack) hin. Das ist nicht leicht, aber auch nicht schwer.

Ich versuche das ganz Simpel zu erklären, also nicht optimiert. Nehmen wir an du hast ein Feld von 10x10 Feldern. Feld x/y 5/6 ist frei und alle Felder um das Feld sind auch frei. Du klickst in das Feld 5/6 rein. Dein Problem ist nun, dass du mitten drin bist und nun die freie Fläche aufdecken mußt. Wie kannst du nun jedes Freie benachbarte Feld ansprechen?

Gehen wir von dem Feld 5/6 aus. Das ist ein Feld, das kannst du bei der Gelegenheit überprüfen und aufdecken. Nun hast du 8 benachbarte Felder um das Feld 5/6 (4/5, 5/5, 6/5, 4/6, 6/6, 4/7, 5/7, 6/7). Die Felder legst du auf Stapel. Mit eine While-Schleife prüfst du den Count des Stapels. Ist er größer Null, sind Koordinaten drin. Also nimmst du den obersten Wert vom Stapel, z. B. 6/7 und überprüfst das Feld und dann alle benachbarte Felder aufnehmen (bereits aufgedeckte Felder wie z. B. 5/6 nicht auf Stapel legen, denn das ist bereits abgearbeitet). Im Grunde war es das schon. Du legst neue Koordinate auf Stack und arbeitest den obersten immer ab. Auf diese Weise wird jede Feld abgearbeitet.

Hier eine kleine Demo (ohne Code) wie so ein Stack funktioniert: http://www.delphipraxis.net/1246627-post16.html. Die roten Punkte sind die Koordinate auf Stack.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#70

AW: Minesweeper

  Alt 25. Mär 2015, 22:58
Die Floodfill Methode ist geeignet Flächen zu füllen, für das Aufdecken einer Fläche wie es in MineSweeper gemacht wird, ist es der falsch Algorithmus.
Der FloodFill-Algorithmus in der 4-Neighbour-Variante ist doch genau der Ansatz den er braucht.

Wenn in ein Feld geklickt wird, dass keine Zahl und keine Bombe enthält, dann alles Aufdecken, was leer ist und was angrenzend eine Zahl hat.

Also, wenn leer, dann aufdecken und rekursiv oben unten links und rechts weiter prüfen. Wenn eine Zahl, dann nur aufdecken und diese Stelle nicht mehr weiter untersuchen.
Code:
2|1|3
-+-+-
1|x|1
-+-+-
1|1|1
Das Problem ist (siehe Beispiel oben), dass wenn du auf X klickst, es nicht ausreicht nur die Felder zu den vier Seiten aufzudecken, sondern auch die in der Diagonalen (z. B. auch das Feld mit der 2). So funktioniert der MineSweeper von MS. Aber so einfach ist es dann doch nicht, denn so ohne weiteres wird keine 8-Neighbour-Variante draus. Denn nehmen wir das Beispiel oben und machen das Feld mit der 3 leer
Code:
2|1|_
-+-+-
1|x|1
-+-+-
1|1|1
darf das nicht aufgedeckt werden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 14   « Erste     567 89     Letzte »    


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 11:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz