Einzelnen Beitrag anzeigen

Simme

Registriert seit: 8. Jan 2010
31 Beiträge
 
Delphi 7 Personal
 
#1

Allgemeines Problem in meinem Programm/ Threads!?

  Alt 1. Mär 2010, 22:04
Hallo Leute,
ich habe ein Problem. Ich habe schon tausend Sachen probiert, aber mit meinen Informatikkenntnissen komme ich nicht mehr weiter...
Ich weiß nicht, wer von euch das Spiel "Bomberman" kennt. Das versuche ich auf alle Fälle zu programmieren. Ich bin auch schon sehr weit. Das einzige große Problem, für das ich keine Lösung finde, ist das Legen mehrerer Bomben. Wenn ich eine lege, geht alles wunderbar. Doch wenn ich eine weitere lege, bevor die erste gezündet hat, unterbricht er den Prozess zum Legen der ersten Bombe und beginnt den der zweiten Bombe. Ist er damit fertig, beendet er den Prozess der zweiten Bombe. Daraus ergeben sich zwei Probleme:
1. Die Bomben explodieren in entgegengesetzer Reihenfolge, als sie gelegt wurden.
2. Die erste Bombe braucht um einiges länger, als sie benötigen sollte (ist ja logisch, wenn der Prozess unterbrochen wird).

Ich habe einen Freund, der mit Java arbeitet, mir gelegentlich aber auch weiterhilft bei Delphi. Und er meinte, ich müsste mir das Thema "Threads" genauer anschauen. Das habe ich bereits gemacht, nur steige ich dabei überhaupt nicht durch, weil meine Informatikkenntnisse doch (noch) recht beschränkt sind. Deshalb habe ich es erstmal anders probiert.
Delphi-Quellcode:
  If ((GetAsyncKeyState(VK_Shift)) <> 0) And (zuendet = 0) Then //hier, wo man die Taste drückt
    begin
      For zeile := 1 To 11 Do For spalte := 1 To 11 Do
        begin
          links := (spalte - 1) * 65;
          oben := (zeile - 1) * 65;
          If ((links <= maennchen.X) And (links + breite >= maennchen.X) And (oben <= maennchen.Y) And (oben + hoehe >= maennchen.Y)) Then
            begin
              with TImage(FindComponent('Feld' + IntToStr(zeile) + '_' + IntToStr(spalte))) Do
                begin
                  Stretch := True;
                  Proportional := True;
                  Picture.LoadFromFile('Bilder&Animationen\bombe.jpg');
                end;
              x_wert := spalte;
              y_wert := zeile;
            end;
        end;
         bombegelegt := bombegelegt + 1;
         If ((bombegelegt >= laufzahl_bombe1) And (schluss = False)) Then zuendet := 1;
      Repeat
        Application.ProcessMessages;
        oft := oft + 1;
        Label3.Caption := IntToStr(oft);
      Until schluss = True;
      bombespiel := True;
      Label3.Caption := 'Ich bin durch!';
    end;
Also, einfach nur mal der Quellcode zur Reaktion auf einen Tastendruck zum Legen einer Bombe. Eigentlich ist für mein Problem nur der untere Teil von Belangen. In dem oberen Teil wird nur der Ort, an dem die Bombe gelegt werden soll, bestimmt. Legt man dann eine Bombe, kommt er hier ganz normal durch. Er kommt dann in eine If-Funktion, die ich in meinem Versuch ausgelagert habe. Dort wird die Variable schluss auf False gesetzt. Wenn nun also noch eine Bombe gelegt wird, sollte diese sich so lange in der Repeat-Until-Schleife aufhalten, bis die erste Bombe durch ist (denn am Ende dieser If-Funktion wird schluss wieder auf True gesetzt). Dann erst sollte die zweite Bombe da rein gehen. Das Problem: Es funktioniert nicht. Sobald die zweite Bombe gelegt wird, wird wieder der Prozess der ersten unterbrochen, was zu einer Endlosschleife führt, da ja schluss somit nicht auf True gesetzt werden kann.
Konntet ihr mir folgen?
Gibt es eine Möglichkeit, dies auf eine einfache Weise zu machen, wie ich es versucht habe, oder muss ich wirklich mit Threads arbeiten? Wenn ja, dann bräuchte ich eine wirklich richtig einfache Erklärung, damit ich das verstehe...

Es tut mir Leid für diese große Masse an Text. Ich hoffe, ihr könnt mir in irgendeiner Weise weiterhelfen, denn dies ist eine Projektarbeit für die Schule, das heißt, es gibt Noten drauf und ich muss das eigentlich in einer Woche fertig haben...

Liebe Grüße,
Simon =)
  Mit Zitat antworten Zitat