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
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Minesweeper

  Alt 21. Mär 2015, 23:35
Und selbst wenn Du Panel's nehmen willst...

Aber dann bitte nicht Zusammengeklickt sondern dynamisch erzeugen...

Delphi-Quellcode:
Procedure TForm1.InitFeld;
var
  X,Y : Integer;
begin
  for X := 0 to XMAX do
   for Y := 0 to YMAX do
     begin
       MeinCoolesPanelArray[X,Y] := TPanel.Create(Self);
       MeinCoolesPanelArray[X,Y].Parent := self;
       MeinCoolesPanelArray[X,Y].Left := StartX + X*XSize;
       MeinCoolesPanelArray[X,Y].Top := StartY + Y*YSize;
       MeinCoolesPanelArray[X,Y].Width := XSize-XRand;
       MeinCoolesPanelArray[X,Y].Height:= YSize-YRand;
       MeinCollesPanelArray[X,Y].OnClick := PanelClick;
       ....
     end;
end;
Mavarik
  Mit Zitat antworten Zitat
saii

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

AW: Minesweeper

  Alt 22. Mär 2015, 14:09
Macht es Sinn über Self.Compenents auf die Panels zuzugreifen?


(A und B sind global als integer definiert)
Delphi-Quellcode:
var s:String;
    Panel:TPanel;
begin
  A:=0;
  B:=0;

  Panel:=TPanel(Self.Components['P_'+IntToStr(A)+'_'+IntToStr(B)]);

  s:=Panel.Caption;
  //...
  end;
Leider krieg ich so in der "Panel:=TPanel.."-Zeile die Meldung "[Fehler] Unit1.pas(334): Inkompatible Typen: 'Integer' und 'String'"
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Minesweeper

  Alt 22. Mär 2015, 14:17
Wenn es funktioniert, dann funktioniert es eben. Du kannst dir auch FindComponent an genauer angucken.

Das einzige Problem was ich an deinem Code sehe ist, du solltest vorher prüfen ob die Komponente auch wirklich exisiert, bevor du auf sie zugreifst. Ansonsten gibt es eine böse Fehlermeldung.


//Edit:

Ich sehe gerade den Fehler. Components erwartet einen Index (Zahl), keinen Text. Also z. B. Self.Components[5].

Die Kunst ist nun herauszufinden welchen Index das Panel 'P_'+IntToStr(A)+'_'+IntToStr(B) hat.

//Edit 2:

Eine Möglichkeit der Suche, vorausgesetzt du nimmst nicht FindComponent, wäre:

Delphi-Quellcode:
var
  i: Integer;
  Gesucht: String;
begin
  Gesucht := 'P_'+IntToStr(1)+'_'+IntToStr(5);
  for i := 0 to Self.ComponentCount - 1 do
  begin
    if Self.Components[i].Name = Gesucht then
    begin
      ShowMessage('Die Gesuchte Komponente hat den Index: ' + IntToStr(i));
      Break;
    end;
  end;
end;

Geändert von Popov (22. Mär 2015 um 14:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.360 Beiträge
 
Delphi 12 Athens
 
#4

AW: Minesweeper

  Alt 22. Mär 2015, 14:27
Delphi-Referenz durchsuchenTComponent.Components
Und nun rate mal, warum es nicht funktioniert, wobei dir der Compiler das auch schon deutlich erklärt hat, wenn du schon selber nicht auf die Idee kommst und in die Hilfe schaust.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
saii

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

AW: Minesweeper

  Alt 22. Mär 2015, 14:51
Vielen Dank Popov. Soweit funktioniert's

Das macht die Aktivierung von 225 Panels VIEL einfacher

Jetzt setz ich mich noch an daran, dass wenn das angeklickte Panel KEINE angrenzenden Minen hat, alle benachbarten Panels "aufgedeckt" werden, die eben falls keine angrenzenden Minen haben und eine Art Ring aus Panels entsteht, die anzeigen, wieviele Minen angrenzen.

Ich probier das mal aus und melde mich dann nochmal

Geändert von saii (22. Mär 2015 um 15:15 Uhr)
  Mit Zitat antworten Zitat
saii

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

AW: Minesweeper

  Alt 22. Mär 2015, 17:47
Kleines Update:

Hab es erstmal so gemacht, dass wenn man ein Panel anklickt, dass keine angrenzenden Minen hat, alle Panels "aufgedeckt" werden, die ebenfalls keine angrenzenden Minen haben und wiederum deren bnachbarten Panels, sodass die zuvor erwähnten Ringe aus Zahlen entstehen.
Im Original werden nur die aufgedeckt, die benachbart sind, aber das reicht mir so erstmal.

Mein Problem ist nun, dass in 7 von 10 Versuchen, eine Zahl auf einem Panel erscheint, die unmöglich ist (zB -1, 227, 981256). Diese erscheint NICHT immer dem gleichen Panel!
Ich komme nicht drauf, warum solch eine Zahl entsteht.

Falls ihr möchtet könntet ihr ja mal kurz einsehen. Ich wäre euch sehr dankbar!
Relevanter Quellcode + Screenshot des gemeinten Falles anbei.
(das StringGrid benutze ich, um sehen zu können wo die Minen sind)


*Edit: Hab das Problem gefunden (glaube Ich) Könnte sein, dass ich die Panels nicht in der Reihenfolge
gesetzt habe, in der sie da sind. Funktioniert die ganze Component-Aktion dadurch nicht richtig?
Krieg ich das nur durch das neu platzieren von 225 Panels wieder hin?





Form1

Delphi-Quellcode:
procedure TForm1.CannonFire(var A,B,m:integer); //Procedure für Linksklick
var h,j:integer;
begin
if mf[A,B]<>9 then //Falls keine Minen...
  begin
   m:=mf[A,B];
   if mf[A,B]=0 then
     begin
       h:=A;
       j:=B;
       for h:= 0 to 14 do
         begin
           for j:=0 to 14 do
             begin
               if mf[h,j]=0 then
                 begin
                   g := 'P_'+IntToStr(j)+'_'+IntToStr(h);
                   for i := 0 to Self.ComponentCount - 1 do
                     begin
                       if Self.Components[i].Name = g then
                       Panel:=TPanel(Self.Components[i]);
                     end;
                   Panel.Caption:='_';

                   if (h+1>=0) and (h+1<=14) and (j>=0) and (j<=14) then
                     begin
                       g := 'P_'+IntToStr(j)+'_'+IntToStr(h+1);
                       for i := 0 to Self.ComponentCount - 1 do
                         begin
                           if Self.Components[i].Name = g then
                             Panel:=TPanel(Self.Components[i]);
                         end;
                     Panel.Caption:=IntToStr(mf[h+1,j]);
                     if Panel.Caption='0then Panel.Caption:='_';
                     end;

                   if (h+1>=0) and (h+1<=14) and (j+1>=0) and (j+1<=14) then
                     begin
                       g := 'P_'+IntToStr(j+1)+'_'+IntToStr(h+1);
                       for i := 0 to Self.ComponentCount - 1 do
                         begin
                           if Self.Components[i].Name = g then
                             Panel:=TPanel(Self.Components[i]);
                         end;
                     Panel.Caption:=IntToStr(mf[h+1,j+1]);
                     if Panel.Caption='0then Panel.Caption:='_';
                     end;

                   if (h>=0) and (h<=14) and (j+1>=0) and (j+1<=14) then
                     begin
                       g := 'P_'+IntToStr(j+1)+'_'+IntToStr(h);
                       for i := 0 to Self.ComponentCount - 1 do
                         begin
                           if Self.Components[i].Name = g then
                             Panel:=TPanel(Self.Components[i]);
                         end;
                     Panel.Caption:=IntToStr(mf[h,j+1]);
                     if Panel.Caption='0then Panel.Caption:='_';
                     end;

                   if (h-1>=0) and (h-1<=14) and (j+1>=0) and (j+1<=14) then
                     begin
                       g := 'P_'+IntToStr(j+1)+'_'+IntToStr(h-1);
                       for i := 0 to Self.ComponentCount - 1 do
                         begin
                           if Self.Components[i].Name = g then
                             Panel:=TPanel(Self.Components[i]);
                         end;
                     Panel.Caption:=IntToStr(mf[h-1,j+1]);
                     if Panel.Caption='0then Panel.Caption:='_';
                     end;

                   if (h-1>=0) and (h-1<=14) and (j>=0) and (j<=14) then
                     begin
                       g := 'P_'+IntToStr(j)+'_'+IntToStr(h-1);
                       for i := 0 to Self.ComponentCount - 1 do
                         begin
                           if Self.Components[i].Name = g then
                             Panel:=TPanel(Self.Components[i]);
                         end;
                     Panel.Caption:=IntToStr(mf[h+1,j]);
                     if Panel.Caption='0then Panel.Caption:='_';
                     end;

                   if (h-1>=0) and (h-1<=14) and (j-1>=0) and (j-1<=14) then
                     begin
                       g := 'P_'+IntToStr(j-1)+'_'+IntToStr(h-1);
                       for i := 0 to Self.ComponentCount - 1 do
                         begin
                           if Self.Components[i].Name = g then
                             Panel:=TPanel(Self.Components[i]);
                         end;
                     Panel.Caption:=IntToStr(mf[h-1,j-1]);
                     if Panel.Caption='0then Panel.Caption:='_';
                     end;

                   if (h>=0) and (h<=14) and (j-1>=0) and (j-1<=14) then
                     begin
                       g := 'P_'+IntToStr(j-1)+'_'+IntToStr(h);
                       for i := 0 to Self.ComponentCount - 1 do
                         begin
                           if Self.Components[i].Name = g then
                             Panel:=TPanel(Self.Components[i]);
                         end;
                     Panel.Caption:=IntToStr(mf[h,j-1]);
                     if Panel.Caption='0then Panel.Caption:='_';
                     end;

                   if (h+1>=0) and (h+1<=14) and (j-1>=0) and (j-1<=14) then
                     begin
                       g := 'P_'+IntToStr(j-1)+'_'+IntToStr(h+1);
                       for i := 0 to Self.ComponentCount - 1 do
                         begin
                           if Self.Components[i].Name = g then
                             Panel:=TPanel(Self.Components[i]);
                         end;
                     Panel.Caption:=IntToStr(mf[h+1,j-1]);
                     if Panel.Caption='0then Panel.Caption:='_';
                     end;

                 end;
             end;
         end;
     end;


  end;
 if mf[A,B]=9 then //Falls Mine getroffen wurde..
  begin
   ShowMessage('Du hast Verloren!');
   close;
  end;
end;

Geändert von saii (22. Mär 2015 um 17:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Minesweeper

  Alt 22. Mär 2015, 23:24
Macht es Sinn über Self.Compenents auf die Panels zuzugreifen?
Hast Du eigentlich meine Antwort gelesen?

Delphi-Quellcode:
procedure TForm1.CannonFire(var A,B,m:integer); //Procedure für Linksklick
var h,j:integer;
begin
if mf[A,B]<>9 then //Falls keine Minen...
  begin
   m:=mf[A,B];
   if mf[A,B]=0 then
     begin
       h:=A;
...
OMG... Was für ein Codemonster...

Warum auch immer Du unbedingt 10000 Zeilen tippen willst, wenn es auch in 25 geht...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.360 Beiträge
 
Delphi 12 Athens
 
#8

AW: Minesweeper

  Alt 23. Mär 2015, 00:24
Wenn jemand nicht auf uns und auch nicht auf den Compiler hört, dann hat er halt Pech.

Zitat:
Delphi-Quellcode:
h:=A;
j:=B;
for h:= 0 to 14 do
  begin
    for j:=0 to 14 do
Hier sollte der Compiler doch eigentlich auch eine Warnung ausgeben, aber wer liest das schon.
Zitat:
Delphi-Quellcode:
for i := 0 to Self.ComponentCount - 1 do
  begin
    if Self.Components[i].Name = g then
      Panel:=TPanel(Self.Components[i]);
  end;
Panel.Caption...
Auch hier sollte der Compiler meckern, denn für ihn ist es klar, daß Panel eventuell nicht zugewiesen sein könnte, falls Name = g nichts treffen würde.

9 Mal der selbe Code, nur durch ein +/-1 unterscheidend ... ja, das sieht nach einer zwei Schleifen aus.
Aber wenn ich das genau seh, dann frag ich mich, wieso man jedem einzelnem Panel bis zu 9 Mal den selben Text zuweisen sollte, denn genau das macht der Code, durch die h+j-Schleife und die inneren IFs/Schleifen.

FindCompoment wurde ja auch erwähnt, aber wenn man die Komponenten einmal einem zweidimensionalem Array zuweist, beim Programmstart, oder das Zeug garnicht erst umständlich in die Form geklickt hätte, sondern es dynamisch erzeugen und dabei gleich in dem Array speichern würde, was ja auch schon genannt wurde, dann wäre alles so viel einfacher.

Und warum werden A und B als Var-Parameter eingegeben, wo sie doch nur ausgelesen, aber niemals gesetzt werden?
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (23. Mär 2015 um 00:34 Uhr)
  Mit Zitat antworten Zitat
puderle
(Gast)

n/a Beiträge
 
#9

AW: Minesweeper

  Alt 25. Mär 2015, 13:11
FILL-Algorithmus

"FLOODFILL" z.b. - so habe ich mein Minesweeper gemacht.

genau das passiert wenn du auf ein Feld klickst das keine Mine ist und andere umliegende Felder auch aufgedeckt werden müssen.

lass dich von den spaghetticode noobs hier nicht verwirren.. habe mir mal erlaubt deine frage zu beantworten xD

http://de.wikipedia.org/wiki/Floodfill

rekursiv(kürzer):
http://www.tutego.de/blog/javainsel/...llalgorithmen/

Geändert von puderle (25. Mär 2015 um 13:18 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Minesweeper

  Alt 25. Mär 2015, 13:39
habe mir mal erlaubt deine frage zu beantworten xD
Nein. Du hast lediglich die Anwesenden beleidigt:

lass dich von den spaghetticode noobs hier nicht verwirren
Herzlichen Dank auch.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Antwort Antwort


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 15: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