 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
kissinka
Anmeldungsdatum: 25.01.2007 Beiträge: 3
|
Verfasst am: 25.01.2007, 22:30 Titel: laufender strich mit if-then-else befehl? |
|
|
mein toller inf.lehrer gibt uns aufgaben auf, von denen er selbst keine ahnung hat...
wir sollen einen strich zum laufne bringen, ihn aber noch mit den cursern (schreibt man die so?) in verschiedene richtungen bewegen können
der sinn: zum schluss des halbjahres müssen wir das seltsame tennisspiel programmiert haben... kennt ihr bestimmt...
das problem:
ich habe versucht, den strich mit dem randomize timer zum laufen zu bringen, ging auch, nur jetzt kann ioch ihn nur in eine bestimmte richtugn bewegen und kann den if-then-else-befehl nicht anwenden, keine ahnung, was ich falsch mache, anscheinend habe ich mehrere fehler...
kann mir einer helfen, bitte??? *verzweifel*
Lg, kissinka |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 26.01.2007, 11:06 Titel: |
|
|
Wenn du uns das zeigst, was du bereits hast, können wir dir besser helfen.
Ein If-Then-Else-Block ist immer gleich aufgebaut:
Code: |
IF Bedingung THEN
.
.
ELSE
.
.
END IF
|
Für Bedingung muss ein Ausdruck rein, der erfüllt oder nicht erfüllt sein kann, wie zum Beispiel: a > 5, x = 0, v1 > 1 AND v1 < 4. Wird die Bedingung erfüllt, so werden die Befehle nach dem THEN ausgeführt, andernfalls die Befehle nach ELSE.
Code: |
INPUT "Wie geht es dir ", antwort$
IF antwort$ = "gut" OR antwort$ = "super" THEN
PRINT "Das freut mich."
ELSE
PRINT "Das tut mir leid."
END IF
|
_________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
kissinka
Anmeldungsdatum: 25.01.2007 Beiträge: 3
|
Verfasst am: 26.01.2007, 11:41 Titel: |
|
|
Danke für die antwort...
aber so habe ich das doch gemacht...
erst hatte ich folgendes (wie man es im code schreibt, weiß ich nicht, ich füge das mal einfach so ein ):
CLS
SCREEN 12
RANDOMIZE TIMER
i=1
FOR i= 25 TO 300
PSET (30, i+50)
SLEEP 2
NEXT i
jetzt wíll ich, dass der strich nach oben fährt ODER nach unten, je nach dem, welchen cursor ich drücke... dazu muss ich einen if-else-then-befehl machen, wo eigentlich nur im PSET "(30, i-50)", also nur das + zu einem - verädnert wird, wenn ich nach oben drücke... allerdings funktioniert das bei mir nicht so mit dem einfügen der cursor-tasten-funktion...  |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 26.01.2007, 15:27 Titel: |
|
|
willkommen im forum erstmal
also:
die code box geht so:
[code]
Blablabla
[/code]
, nur ohne die leerzeichen am schluss (zewischen
ähh, randomize timer? des erzeut zufallszehlen, aber mit der tastatur nen strich bewegen??? is mir neu... (oder willst du, wass einer zufällig bewegt wird und der andere nicht??)
hm, mit ifthenelse...
den code solltest du posten
wenn du ihn nich mehr siehst, drück F2 und wähö die sub/function/das hauptoprogramm aus, dann siehstes...
könnte es sein, dass du entweder
Code: |
do
if inkey$=[hoch] then mach dies
if inkey$=[runter] then mach jenes
loop
|
oder
Code: |
do
if inkey$=[hoch] then hoch else runter
loop
|
hast?
ersteres geht net, weil inkey den tastaturbuffer ausliest UND DAS ZEICHEN DANN LÖSCHT
daran liegts
es ist [runter] drin, es wird einm,al ausgelesen (/runter löschen) und beim zweiten mal is er leer..
beheben:
Code: |
do
irgendeineDummyVariable$=inkey$
if irgendeinedummyvariable$=[hoch] then mach dies
if irgendeinedummyvariable$=[runter] then mach jenes
loop
|
bei der 2ten lösung isses, wenn keine taste gedrückt ist, is inkey$=""
also, ist es NICHT hoch, wenn es nich hoch ist, wird der andere bölock ausgeführt
lösung:
Code: |
do
dummy$=inkey$
if dummy$=[hoch] then
mach dies
elseif dummy$=[runter] then
mach jenes
end if
loop
|
ansonsten: genauen code posten
(als text abspeichern, mit nem editor laden, strg+a,strg+c,im foru,m: strg+v fertig) _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 26.01.2007, 16:59 Titel: |
|
|
Poste mal bitte den kompletten Source.
Und aus dem Schnipsel ist es nicht ersichtlich, wofür du RANDOMIZE brauchen würdest. Das ist das Initialisieren des Zufallsgenerators. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 26.01.2007, 23:52 Titel: |
|
|
Hallo kissinka,
hast Du dir schon die QB-Monster-FAQ auf www.qbasic.de angesehen? Dort gibt es z.B. einer ganze Rubrik zur Tastatureingabe. Kleiner_hacker hat ja schon die Methode per INKEY$ vorgestellt. Für die Spielsteuerung wie bei dem Tennis, von dem geschrieben hattest, finde ich INP(&h60) besser. Der Unterschied besteht grob gesagt darin, dass mit INP die "Rohdaten" direkt von der Tastatur gelesen werden, während bei INKEY$ die Eingaben schon vorverarbeitet sind.
Das ist vor allem un den Bezug auf den Tastaturpuffer wichtig. Das ist ein kleiner Zwischenspeicher, der sich Tatstatureingaben merkt, wenn der Rechner gerade mit etwas anderem beschäftigt ist. Hat er dann wieder Zeit, holt er sich die Daten aus dem Puffer und leert ihn dabei. Und genau das ist der Knackpunkt. Bei der Abfrage mit INP werden die Daten schon vor dem Tastaturpuffer "abgezweigt", laufen aber weiter in diesem Sspeicher auf, ohne das dieser geleert wird . Der ist somit schnell voll und dann fängt der Rechner an, zu piepsen oder zu pingen. Kennst du ja sicher. Um das zu vermeiden, kann man dann wieder INKEY$ benutzen. Das holt sich die Daten aus dem Puffer und macht dabei jedesmal wieder eine Speicherzelle frei. Das Zeichen, das mit INKEY$ eingelesen wird, braucht man dabei nicht, das Ganze soll wie gesagt nur den Puffer sauberhalten.
Damit wären wir dann schon bei meinem Beispiel. Die Tastatur schickt für jede Taste die gedrückt wird, eine Zahl zwischen 0 und 127 zum Rechner, wird eine Taste losgelassen wird deren Zahl plus 128 gesendet, also im Bereich von 128 bis 255. Und genau diese Werte kann man mit INP(&h60) einlesen. Die Pfeil-nach-oben-Taste z.B. hat den Wert 72, die nach-unten-Taste ist 80 wenn sie gedrückt wird Beim Loslassen werden diese Zahlen jeweils plus 128 gesendet, also 72+128=200 bzw. 80+128=208. Die 1 steht für das betätigen der ESC-Taste.
Nebenbei bemerkt ist &h60 nur eine andere (hexadezimale) Schreibweise für (dezimal) 96. INP(&h60) ist also genau das gleiche wie INP(96). Hier also mein Vorschlag:
Code: | CLS
DO
DO
talt = tneu 'in talt wird der vorige INP-Wert von der Tastatur gespeichert
tneu = INP(96) 'der aktuelle INP-Wert wird in tneu eingelesen
pufferleeren$ = INKEY$ 'damit es nicht anfaengt zu piepen bzw. zu pingen
LOOP WHILE tneu = talt 'so wird gewartet, bis auf der Tastatur was passiert
IF tneu = 72 THEN '72 ist Pfeiltaste nach oben gedrueckt
hoch = 1
ELSEIF tneu = 200 THEN '200 = 72 + 128 also wurde nach oben losgelassen
hoch = 0
ELSEIF tneu = 80 THEN '72 ist Pfeiltaste nach unten gedrueckt
runter = 1
ELSEIF tneu = 208 THEN '208 = 80 + 128 also wurde nach unten losgelassen
runter = 0
END IF
LOCATE 5, 5
PRINT "Hoch:"; hoch; " Runter:"; runter
LOOP UNTIL tneu = 1 '1 ist die ESC-Taste zum beenden
|
Der Ansatz für dich könnte jetzt darin bestehen, statt der Taxtausgabe in der äusseren Schleife, in der inneren die Anzeige deines Strichs einzubauen. Dabei könntest du zu dem y-Wert, der den Anfangspunkt dieses Strichs darstellt, jeweils den Wert von hoch abziehen und den von runter dazuzählen. So würde der Strich auch stehenbleiben, wenn gleichzeitig hoch und runter gedrückt wird. Dabei aber nicht vergessen, den alten Strich zu löschen, zumindest den Teil, der in der neuen Position nicht mehr bedeckt wird. Und natürlich noch dafür sorgen, dass er nicht aus dem Bildschirmbereich herausfährt. Vielleicht wäre ein Rechteck besser als nur ein Strich? Dabei solltest du dir auch überlegen, ob du wirklich SCREEN 12 brauchst. Einen schönen 80er-Jahre-Konsolenlook bekommst du auch in s/w und mit 320x200 in SCREEN 2.
Wenn du herausfinden möchtest, welche Werte INP(96) für andere Tasten ausgibt, kannst du dir ja einfach tneu anzeigen lassen. Mit vier Tasten könnten dann auch zwei Spieler gegeneinander antreten.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|