Archiv verlassen und diese Seite im Standarddesign anzeigen : Snake im Textmodus - Tastaturabrfage
Hiho,
Ich code derzeit Snake und bin auf ein Problem gestoßen.
Und zwar weis ich nicht wie die Eingabe der Richtung realisiert werden soll,
da das Programm bei Readkey oder Readln ja wartet bis was eingeben wurde.
Das Spiel soll aber weitergehen und nicht auf den Spieler warten, sonst wäre das ja doch ein bisschen zu einfach ;).
Im Anhang ist das was ich bis jetzt zusammengeschustert habe.
edit: ups 2 kleine Fehler noch schnell ausgebügelt.
Felix Kaiser
30.04.2007, 16:15
Die CRT Unit bietet eine Funktion KeyPressed. Ich würde dir aber einen anderen Weg vorschlagen. Benutze einfach die BIOS Tastaturfunktionen. Du kannst direkt den Tastaturcode als Word abfragen, das höherwertige Byte repräsentiert den Scancode und das niederwertige Byte das ASCII Zeichen. So lassen sich Pfeiltasten am einfachsten behandeln.
function GetKey: Word; Assembler;
asm
xor ah,ah
int 16h
end;
function HaveKeyCode: Boolean; Assembler;
asm
mov ah,1
int 16h
jz @1
mov al,True
jmp @2
@1:
mov al,False
@2:
end;
Diogenes
30.04.2007, 19:32
ReadKey wartet nur, wenn nichts im Tastaturpuffer steht. Ob dort etwas ist, kann man mit KeyPressed prüfen. (Borland/Turbo Unit CRT.) Um bei nicht gedrückter Taste weiter zu machen, daher folgendes Codesnippet.
if KeyPressed
then Taste := ReadKey {Liest ASCII-Code}
else Taste := '';
Hallo :)
sitze zufällig am gleichen Problem (ebenfalls Snake, nur Aufbau ein wenig anders).
Die Key-Abfrage sieht bei mir im Moment folgendermaßen aus:
IF keypressed THEN BEGIN
aktion := readkey;
IF (aktion = 'd') AND (richtung <> 'l') THEN
richtung := 'r';
IF (aktion = 's') AND (richtung <> 'o') THEN
richtung := 'u';
IF (aktion = 'a') AND (richtung <> 'r') THEN
richtung := 'l';
IF (aktion = 'w') AND (richtung <> 'u') THEN
richtung := 'o';
IF aktion = 'z' THEN
ende := true;
END;
Allerdings habe ich mit dieser Abfrage das Problem, dass mir die Schlange beim Start des Programms direkt "aus dem Fenster schießt".
Ich bräuchte also eine kleine Verzögerung, wärend(!) der aber die Richtungsabfrage weiterläuft!
Wenn ich einfach nur ein delay einfüge, wird wärend dieses delays nämlich nicht die Taste abgefragt - den richtigen Zeitpunkt zu erwischen wird dadurch verdammt schwer x_X
Kennt jmd. vlt. einen geeigneten Ansatz?
Mit freundlichen Grüßen,
Uepfel
Felix Kaiser
18.05.2007, 08:43
Du könntest die Schlange über einen Timer steuern. Den Systemtimer kannst du über einen Speicherzugriff abfragen, den du auf eine Variable legst:
var SystemTicks: LongInt absolute $40:$6C;
Du müsstest zu Beginn eine Variable mit dem Timerwert initialisieren und dann immer die Differenz zum aktuellen Systemtimer bestimmen. Der Timer tickt standardmäßig mit ca. 18,2Hz. Eine Differenz von 9 Ticks entspricht ca. einer halben Sekunde. Wenn die Differenz deiner Meinung nach groß genug ist kannst du die Schlange eine Bewegung durchführen lassen, setzt deine Zwischenwertvariable wieder auf den aktuellen Systemtimer und das Spiel beginnt von neuem.
Vielen Dank, das hat mir sehr geholfen! :)
Gruß,
Uepfel
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.