Delphi-PRAXiS
Seite 2 von 14     12 3412     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Minesweeper (https://www.delphipraxis.net/184385-minesweeper.html)

himitsu 22. Mär 2015 14:27

AW: Minesweeper
 
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.

saii 22. Mär 2015 14:51

AW: Minesweeper
 
Vielen Dank Popov. Soweit funktioniert's :)

Das macht die Aktivierung von 225 Panels VIEL einfacher :-D

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

saii 22. Mär 2015 17:47

AW: Minesweeper
 
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='0' then 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='0' then 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='0' then 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='0' then 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='0' then 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='0' then 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='0' then 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='0' then 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;

Mavarik 22. Mär 2015 23:24

AW: Minesweeper
 
Zitat:

Zitat von saii (Beitrag 1294408)
Macht es Sinn über Self.Compenents auf die Panels zuzugreifen?

Hast Du eigentlich meine Antwort gelesen?

Zitat:

Zitat von saii (Beitrag 1294429)
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...

himitsu 23. Mär 2015 00:24

AW: Minesweeper
 
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
Delphi-Quellcode:
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?

Mavarik 23. Mär 2015 14:12

AW: Minesweeper
 
Zitat:

Zitat von himitsu (Beitrag 1294442)
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...

Das ist doch an sich schon gruselig mit dem OI die ganzen Panels aufs Form zu klicken...

Popov 23. Mär 2015 16:50

AW: Minesweeper
 
@Mavarik

Für dich ist es gruselig. Ein Anfänger sieht da nur die Vorteile, der da einer wäre: da ist ein Feld, da klickt man drauf, da erhält man ein Ereignis. Man muss zwar 255 Panele plazieren und auswerten, aber der Hauptvorteil ist, man spart sich vier Zeilen Code über den man drei Minuten komplex nachdenken muss.

Ich persönlich hätte noch nicht mal Panels genommen.

Mavarik 23. Mär 2015 17:02

AW: Minesweeper
 
Zitat:

Zitat von Popov (Beitrag 1294546)
aber der Hauptvorteil ist, man spart sich vier Zeilen Code

Nein ganz im Gegenteil...

Stundenlanges Panel's auf dem Form platzieren was man in 10 Sekunden und 2 for schleifen machen kann...

Abgesehen davon wird das Form auch in "endlicher" Zeit in die IDE geladen...

Außerdem habe ich die Pannels direct in meinem Array und muss die nicht erst wieder mühsam über die Componentenliste suchen...

Abgesehen von 200 onclick Handlern

himitsu 23. Mär 2015 17:51

AW: Minesweeper
 
100 (10*10) Panels hab ich in nichtmal 20-30 Sekunden auf der Form platziert (Copy&Paste) ... aber dann muß/sollte man den Dingern auch noch einen Namen verpassen. :stupid:

Popov 23. Mär 2015 18:10

AW: Minesweeper
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Mavarik

Ich hab nicht gesagt, dass man sich Code und Zeit spart, sondern, dass man sich paar Zeilen komplexen Code spart.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 Uhr.
Seite 2 von 14     12 3412     Letzte »    

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