Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

laufender strich mit if-then-else befehl?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
kissinka



Anmeldungsdatum: 25.01.2007
Beiträge: 3

BeitragVerfasst am: 25.01.2007, 22:30    Titel: laufender strich mit if-then-else befehl? Antworten mit Zitat

weinen 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 peinlich
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
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 26.01.2007, 11:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
kissinka



Anmeldungsdatum: 25.01.2007
Beiträge: 3

BeitragVerfasst am: 26.01.2007, 11:41    Titel: Antworten mit Zitat

Danke für die antwort...
traurig 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 verlegen ):
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... weinen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 26.01.2007, 15:27    Titel: Antworten mit Zitat

willkommen im forum erstmal grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 26.01.2007, 16:59    Titel: Antworten mit Zitat

Poste mal bitte den kompletten Source. zwinkern
Und aus dem Schnipsel ist es nicht ersichtlich, wofür du RANDOMIZE brauchen würdest. zwinkern Das ist das Initialisieren des Zufallsgenerators.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 26.01.2007, 23:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz