Autor Beitrag
barnx
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 03.05.05 13:48 
Hallo Leute!
Ich habe ein kleines Ablaufproblem.

Ich baue ein kleines Spiel nach, bei dem Rennautos auf einem Spielfeld Feld für Feld sich bewegen.
Wenn das eine Auto nun eine 6 würfelt, soll es 6 Felder nach vorne, aber bei jedem Feld überprüfen, ob vor dem Auto jemand ist. Deshalb habe ich es rekursiv programmiert.

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:
procedure TBrett.setzen(spielerid,anzahl:integer);      //hier wird der zug ausgeführt;
var nochzusetzen,nextfeld,i:integer;
begin
nochzusetzen:=anzahl;




//showmessage('Noch ' + IntTosTr(anzahl) + ' Felder für Spieler ID ' + IntToStr(spielerid));
sleep(1000); stats;
if nochzusetzen > 0 then

  begin
                      nextfeld:=Spieler[spielerid].feld+1;
                      sleep(50); stats;
                      if rundenfelder = Spieler[spielerid].feld then nextfeld:=1;
                      case Feld[nextfeld].besetzt of

                      0:  //freie Bahn --> setzen
                          begin
                          dec(Feld[Spieler[spielerid].feld].besetzt);
                          inc(Spieler[spielerid].feld); 
                          //Rundenübergang
                          if Spieler[spielerid].feld = (rundenfelder+1then  begin
                                                                                inc(Spieler[spielerid].runde);
                                                                                Spieler[Spielerid].feld:=Spieler[Spielerid].feld-rundenfelder;
                                                                                end;
                          inc(Feld[Spieler[spielerid].feld].besetzt);

                          if Spieler[spielerid].runde > runden then
                                                                      begin
                                                                      finish(spielerid);
                                                                      end else                        setzen(spielerid,nochzusetzen-1)
                          end;
                      1//einer schon auf dem Feld davor --> daneben und Duell
                          begin
                          dec(Feld[Spieler[spielerid].feld].besetzt);
                          inc(Spieler[spielerid].feld);
                          //Rundenübergang
                          if Spieler[spielerid].feld > (rundenfelder) then  begin
                                                                                inc(Spieler[spielerid].runde);
                                                                                Spieler[Spielerid].feld:=Spieler[Spielerid].feld-rundenfelder;
                                                                                end;
                          inc(Feld[Spieler[spielerid].feld].besetzt);
                          if Spieler[spielerid].runde > runden then
                                                                      begin
                                                                      finish(spielerid);
                                                                      end;

                          //setzen(spielerid,0);
                          if Spieler[spielerid].outofrace = 0 then begin wurftyp:=1;verteidigerwurf:=0;angreiferwurf:=0end;

                                for i:=1 to 4 do begin
                                  if (Spieler[i].feld = Spieler[spielerid].feld) and (Spieler[i].id <> Spieler[spielerid].id)
                                      then begin
                                      angreifer:=spielerid;
                                      verteidiger:=i;
                                      showmessage('DUELL * AngreiferID' + IntToStr(angreifer) + '* VerteidigerID ' + IntToStr(verteidiger));
                                      end;

                                end;
                          end;
                      2:  begin
                          showmessage('musst leider stehenbleiben');
                          setzen(spielerid,0);
                          end;

                      end

  //if nochzusetzen = 0 then
  end else
  begin
    //showmessage('zug zuende')
    // Normal, Benzin, Benzin2, Luder, SafetyCar, Unfall, Kurve, Rain)
    case Feld[Spieler[spielerid].feld].typ of
    Normal:   begin end;
    Benzin:   begin
              showmessage('- 1x Benzin');
              dec(Spieler[spielerid].benzin);
              if  Spieler[spielerid].benzin < 1 then ausfall(spielerid);
              end;
    Benzin2:  begin
              showmessage('- 2x Benzin');
              dec(Spieler[spielerid].benzin);
              dec(Spieler[spielerid].benzin);
              if  Spieler[spielerid].benzin < 1 then ausfall(spielerid);
              end;
    VIP:      begin
              showmessage('VIP-Feld');
              wurftyp:=6;
              VIPfahrerID:=spielerID;
              end;
    SafetyCar:begin
              safetycarspielerid:=spielerid;
              showmessage('SafetyCar? Bei 9-12');
              wurftyp:=3;

              end;
    Unfall:   begin
              showmessage('Unfall?');
              wurftyp:=5;
              unfallfahrerID:=spielerID;
              end;
    Kurve:    begin
              showmessage('Hochgeschwindigkeitskurve');
              kurvenfahrerID:=spielerid;
              wurftyp:=4;
              end;
    Regenfeld:begin
              regen:=1;
              showmessage('Regen');
              end;

    end;
  end;
end;


Bisher war es so, dass das Auto halt auf seine entsprechende Entpositon direkt sprang. Aber nun, da ich den Grafikmodus programmiere, sollte man die einzelnen Feldsprünge auch sehen.

Also hab ich ziemlich an den Anfang "sleep(100); stats" eingefügt, wobei stats die Bildpositionen der Autos aktualisiert. Jedoch ist es so, dass bei 10 Feldern z.B. das Programm nun 1 Minute wartet und dann alles auf einmal macht, so wie es ja gerade nicht sein sollte.

Wenn ich an der selben Stelle ein "showmessage" zusätzlich noch einbinde, kommt das Messagefeld und ich sehe, dass die Autos sich wirklich bewegen. Aber ohne nicht!

Ich bin ratlos und über jeden Rat erfreut

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt.
Grendel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Di 03.05.05 13:53 
Dann setz statt des ShowMessage() mal ein Application.ProcessMessages().

Bis neulich ...
barnx Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 03.05.05 13:58 
Titel: Danke
vielen Dank für so schnelle Hilfe

so, thread geschlossen, bis denne
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 03.05.05 14:16 
ausblenden Delphi-Quelltext
1:
2:
  dec(Spieler[spielerid].benzin); 
  dec(Spieler[spielerid].benzin);

ich glaube da kann man
ausblenden Delphi-Quelltext
1:
 dec(Spieler[spielerid].benzin, 2);					

machen