Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Mein Programm läuft nicht Cronologisch ab! Warum?


Éde1987 - Sa 23.12.06 17:07
Titel: Mein Programm läuft nicht Cronologisch ab! Warum?
Also ich wollte Schiffe versenken programmieren...
Ich habe mein Programm wie folgt aufgeteilt!

1.Schiffe setzen(1.Button)
1.1 Schiffe vom Spieler werden gesetzt
1.2 Schiffe vom Computer werden gesetzt

2.Ende(2.Button)

3.Schießen(3.Button) <--Hier liegt das Problem!
3.1 Der Spieler setzt seine Schüsse mithilfe einer Eingabe (2x Edit-Fenster (A-H / 1-8))
3.2 Der Computer setzt seine Schüsse mithilfe von Zufallszahlen
3.3 Gewinner Abfrage kommt
3.3.1 Es wird getestet ob der Spieler alle Schiffe erledigt hat
3.3.2 Es wird getestet ob der Computer alle Schiffe erledigt hat

--> nun sollte man denken in dieser Reinfolge arbeitet er die Sachen auch ab im 3.Button, aber er macht zuerst 3.1 und dann 3.3 und zum Schluss schießt der PC nochmal.
Ich erkenne das daran, weil wenn ich gewonnen habe, dann kommt nach der Abfrage ob ich nochmal Spielen will erstmal noch ein weiterer Schuss des Pc's...warum?

Ich poste mal meinen Quelltext des 3.Buttons:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
//Feuer Frei
procedure TForm1.Button3Click(Sender: TObject);
var   x:char;
      q,a,b,i,j,y,z,k,l,g,h:integer;
      Label EingabeSpieler, EingabeComputer, GewinnerSpieler, GewinnerComputer;
Begin
  Randomize;
{~~Spieler~~}
EingabeSpieler:
  x:=Edit1.text[1];
  Case x of
    'A': z:=1;
    'B': z:=2;
    'C': z:=3;
    'D': z:=4;
    'E': z:=5;
    'F': z:=6;
    'G': z:=7;
    'H': z:=8;
    'a': z:=1;
    'b': z:=2;
    'c': z:=3;
    'd': z:=4;
    'e': z:=5;
    'f': z:=6;
    'g': z:=7;
    'h': z:=8;
  end;
  y:=strtoint(edit2.Text);
  if Feld[y,z]='s' then
    begin
      Feld[y,z]:='T';
       StringGrid1.Canvas.Brush.Color := clRed;
       StringGrid1.Canvas.Rectangle(y*31,z*31,(y+1)*31,(z+1)*31);
    end
  else
    Begin
      Feld[y,z]:='X';
      For i:=1 to 8 do
        For j:=1 to 8 do
          StringGrid1.Cells[j,i]:=Feld[j,i];
    end;
  Edit1.Clear;
  Edit2.Clear;

{~~Computer~~}
EingabeComputer:
  a:=Random(8)+1;
  b:=Random(8)+1;
  if Feld2[a,b]='s' then
    begin
      Feld2[a,b]:='T';
       StringGrid2.Canvas.Brush.Color := clRed;
       StringGrid2.Canvas.Rectangle(a*31,b*31,(a+1)*31,(b+1)*31);
    end
  else
    Begin
      Feld2[a,b]:='X';
      For i:=1 to 8 do
        For j:=1 to 8 do
          StringGrid2.Cells[j,i]:=Feld2[j,i];
    end;

{~~Gewinner Abfrage~~}
{~~~~Spieler gewinnt~~~~}
  GewinnerSpieler:
  h:=0;
  g:=0;
  For i:=1 to 8 do
    For j:=1 to 8 do
      if Feld[j,i]='s' then inc(h);
    if h=0 then
      begin
        For k:=1 to 8 do
          begin
            for i:=1 to 100000000 do
            inc(q);
            StringGrid2.Canvas.Brush.Color := clRed;
            StringGrid2.Canvas.Rectangle(k*31,k*31,(k+1)*31,(k+1)*31);
          end;
        For l:=8 downto 1 do
          begin
            for i:=1 to 100000000 do
            inc(q);
            inc(g);
            StringGrid2.Canvas.Brush.Color := clRed;
            StringGrid2.Canvas.Rectangle(l*31,g*31,(l+1)*31,(g+1)*31);
          end;
        if(MessageDlg('Nochmal Spielen?',mtConfirmation, [mbYes, mbNo], 0 ))=mrYes then
        FormCreate(Sender)
        else close;
      end;

{~~~~Computer gewinnt~~~~}
  GewinnerComputer:
  h:=0;
  g:=0;
  For i:=1 to 8 do
    For j:=1 to 8 do
      if Feld2[j,i]='s' then inc(h);
        if h=0 then
          begin
            For k:=1 to 8 do
                begin
                  for i:=1 to 100000000 do
                  inc(q);
                  StringGrid2.Canvas.Brush.Color := clRed;
                  StringGrid2.Canvas.Rectangle(k*31,k*31,(k+1)*31,(k+1)*31);
                end;
              For l:=8 downto 1 do
                begin
                  for i:=1 to 100000000 do
                  inc(q);
                  inc(g);
                  StringGrid2.Canvas.Brush.Color := clRed;
                  StringGrid2.Canvas.Rectangle(l*31,g*31,(l+1)*31,(g+1)*31);
                end;
       if(MessageDlg('Nochmal Spielen?',mtConfirmation, [mbYes, mbNo], 0 ))=mrYes then  
       FormCreate(Sender)
       else close;
end;
end;


Éde1987 - Sa 23.12.06 17:48

Bitte kann mir nicht einer helfen?


Coder - Sa 23.12.06 17:55

Setz mal am Anfang der Prozedur einen Haltepunkt und starte.
Dann kannst du jeden Schritt mit F8 verfolgen.

MfG


zuma - Sa 23.12.06 18:15

ganz einfach gesagt: weil du's so programmiert hast ;)

versuchs mal so :

1. neues Label deklarieren z.B. Frage
2. ans ende von Button3Click den code von
if mess bis close hinschreiben, in etwa so:

Frage:
if Message...
Formcreate..
else
close

3. da wo jetzt die beiden if messa.. stehen, ersetzt
du die 3 zeilen da mit:

goto frage

sollte klappen, aber mit labeln zu arbeiten ist nicht
sehr sauber, du solltest dir prozedurale programmierung
anschauen. ein wenig beschäftigung mit dem debugger wäre
sicherlich auch hilfreich ...