[Free Pascal] Readkey Prozedur nur nach Bedarf aufrufen, geht das?

#1
Also ich bin gerade dabei (mit Turbo Pascal, aber wenn es jemand nicht kennt, sollte es keine Rolle spielen, deswegen ja auch der Pseudocode) ein einfaches, sagen wir mal Snake Spiel zu schreiben.
Das Problem ist, das das Programm jedes mal nach der richtung(z.B. ASDW) abfragt UND DANN ERST sich der Schlangenkopf bewegt.
Es soll aber so sein, dass das Programm nicht ständig nach der Richtung fragen soll(sonst wäre das Spiel nur so schnell, wie man tippen kann) sondern das das Spiel läuft und man jederzeit die Richtung bestimmen kann.
Z.B. bewegt sich die Schlange nach Rechts und dass jede 200ms. und nach 1sec. drücke ich 'S' und die Schlange bewegt sich nach unten.
Bei mir ist dass so, die Schlange bewegt sich gar nicht, ich drücke 's' und dann bewegt sich die Schlange 1 Schritt nach unten, dann drücke ich noch mal 'S' und dann bewegt sich die Schlange noch einen Schrit nach unten.

Pseudocode:

Code:
Procedure Check {
eingabe von einer Taste
warte(50 Millisekunden); }

Procedure Move {
abfrage von Char 'Check'
je nach 'Char' soll das Programm die Richtung um 1 ändern
warte(150 Millisekunden); }

Main{
solange das Spiel läuft tue {
LeereBildschirm;
Check;
Move;
sonst tue
GameOver; }
Der Pseudocode von mir ist eigendlich gar nicht so relevant um zu verstehen, was mein Problem ist.
Es ist ganz einfach, also das Programm fragt jedes mal nach den Benutzer nach einem Buchstaben, der wird abgespeichert und in der nächsten Prozedur wird geprüft welcher Buchstabe das ist und dann bestimmt es die Richtung in der sich die Sclange(bestehend nur aus 1 Teil) bewegen soll.
 

Mat

Well-Known Member
c-b Experte
#2
Coole Idee. So ganz unwichtig ist die Sprache nicht, wenn es um Prozesse/Threads, "Animationen" und Events (Tastendruck usw) geht. Pseudocode sieht erstmal ok aus, mein erste Gedanke für mögliche Problemquellen: (vielleicht ist ein Denkanstoß dabei)
  • Check:
    • Blockiert die Eingabeaufforderung den weiteren Ablauf oder geht es auch ohne Eingabe weiter?
  • Move:
    • Legt die Wartezeit den gesamten Prozess schlafen oder läuft Check als Thread im Hintergrund weiter?
  • Main:
    • Gibt es einen Unterschied, wenn die Wartezeiten in Main stecken, statt in den procedures?
Turbopascal hatte ich mir nie so ganz angeschaut, wollte ich aber mal machen. Deswegen kann das alles, was ich hier schreibe auch erstmal nur Quatsch sein ^^

Edit: Vielleicht wäre der Thread im Pascal-Forum besser aufgehoben, wenn die Problemlösung nicht algorithmisch sondern Pascal-spezifisch sein könnte.
 

Xpyder

Well-Known Member
c-b Experte
#3
Um festzustellen, ob überhaupt eine Taste gedrückt wurde, kann die funktion KEYPRESSED (in der Unit CRT) benutzt werden. (Diese gibt TRUE aus, wenn das der Fall ist, sonst FALSE.)
Beispiel (Taste ist eine Variable von Typ char)
Code:
if keypressed then Taste:=readkey else Taste:=#0;
Falls man die Unit CRT nicht nutzen will, kann man sich auch behelfen, indem man testet, ob der Tastaturpuffer (ein Ringpuffer) belegt ist - was der Fall ist, wenn Kopf und Schwanz unterschiedliche Werte haben.
Code:
if memW[64:28]<>memW[64:26] then Taste:=readkey else Taste:=#0;
Natürlich kann man das auch über Variablen lösen:
Code:
var Head:word absolute 64:28; Tail:word absolute 64:26;
begin
if Head<>Tail then Taste:=readkey else Taste:=#0;
end.
oder mit einer eigenen keypressed-Funktion, die o.g. enthält.
Man kann übrigens auch die Cursortasten u.ä. benutzen - bestimmte Tasten erzeugen "zwei Tastendrücke" im Tastaturpuffer, die erste ist dann #0 (also chr(0) ), die zweite dann ein anderer Wert (ausprobieren!) Soweit ich mich erinnere sind es #72 (hoch), #75 (links), #77 (rechts), #80 (runter), (entspricht H, K, M, P),

Anmerkung:
Natürlich könnte man das Ganze viel eleganter (und für Spiele brauchbarer) lösen, indem man sich in den Tastatur-IRQ "einklinkt" und dieTasten selbst (als sog. Scancodes) abfragt. Damit kann man auch das Drücken mehrerer Tasten gleichzeitig abfragen und auch Tasten erreichen, die man sonst so nicht nutzen kann. Falls Interesse an solchen Dingen besteht, kannst Du gern "auf mich zukommen". Ich bin sozusagen ein "DOS-Spieleprogrammierer".

Achja, und: Der Thread wäre wohl wirklich besser im Pascal-Forum aufgehoben.
@Admins: Vielleicht könnt Ihr den dahin verschieben.
 
Gefällt mir: Mat
Oben