Autor Beitrag
Éde1987
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 23.12.06 17:07 
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:
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 23.12.06 17:48 
Bitte kann mir nicht einer helfen?
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: 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 ...

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!