Probleme mit QBasic Programm

Marley5556

Schraubenverwechsler(in)
Hallo liebe Community. Weiß nicht so recht ob ich hier an der richtigen Adresse bin aber da das Chipforum geschlossen und
das offizielle QBasic Forum nur sehr klein ist dachte ich mir ich versuche es einfach mal hier. Und zwa habe ich vor ein paar Tagen
ein kleines onlinetutorial zur Programmierung mit QBasic gemacht bei der es darum ging ein einfaches Snake Spiel zu Programmieren.
Da ich ein aktuelles Betriebssystem verwende musste ich dazu natürlich die seperat zu installierende Dosbox verwenden. So weit so
gut. Eigentlich lief alles nach plan bis es darum ging die Schlange nach oben und unten zu bewegen. Dies war trotz verschiedener
Tastenbelegungen und verringerung des CPU Speeds in der Dosbox einfach nicht möglich. Im besten Fall zog die Schlange einfach
nur quer über den Bildschirm und das ohne die möglichkeit einer vernünftigen Kontrolle. Habe den Code bereits in QBasic 1.1 der Vollversion von Quick Basic 4.5 und der aktuellen Version von Qb64 laufen lassen wobei letzteres allein schon daran scheiterte das
das Programm darin viel zu schnell ablief und eine vernünftige Kontrolle alleine schon deshalb unmöglich war. Habe das ganze bereits
mehrfach auf Fehler überprüft konnte aber Trotz aller Mühe keine Fehler im Code entdecken. Falls irgendjemand noch eine Idee
hätte wie ich die Sache ob in der alten oder neuen Version von Qbasic vernünftig zum laufen bringen kann wäre ich ihm wirklich dankbar. Das besagte Codefragment sieht folgendermaßen aus:

Screen 1
Type Coord
X As Integer
Y As Integer
End Type
Dim C(64) As Coord
Dim U As Integer, V As Integer, M As Integer
C(0).X = 6
C(0).Y = 5
mainloop:
Select Case InKey$
Case Chr$(27): End
Case Chr$(0) + "H": U = 0: V = -1
Case Chr$(0) + "P": U = 0: V = 1
Case Chr$(0) + "K": U = -1: V = 0
Case Chr$(0) + "M": U = 1: V = 0
End Select
U = 1
C(0).X = C(0).X + U
C(0).Y = C(0).Y + V
Line (C(0).X * 8, C(0).Y * 8)-(C(0).X * 8 + 7, C(0).Y * 8 + 7), 1, BF
For delay% = 1 To 1600: Next delay%
GOTO mainloop:

Danke schon mal fürs zeitnehmen:)
 
Also in einer Zeile setzt du ja U fest auf 1, wenn das deine vertikale Koordinate ist, dann kein Wunder, dass sich da nichts ändert. Oder ist das die Horizontale und du wolltest es absichtlich nur hoch und runter bewegen?
 
Also was das Koordinaten und Steuerungssystem in Qbasic angeht bin ich ehrlich gesagt leider nicht sehr erfahren
und gerade beim Versuch das alles besser zu verstehen. Alles was ich sagen kann ist das im Video bis hierhin alles reibungslos funktioniert hat und zwar die Steuerung in alle richtungen. Nehme allerdings fast an das er auf
Original Hard und Software programmiert hat und er daher natürlich von möglichen Programmierfehlern in
der Dosbox ausgenommen wäre. Für den Fall das ich doch etwas übersehen hätte könnte ich dir falls es hier
erlaubt sein sollte aber natürlich gerne den Link des tutorials schicken.
 
Zuletzt bearbeitet:
Ich wüsste nicht, warum das verboten sein sollte, mach mal, vielleicht probiere ich es einfach auch mal aus. :) Find die Idee nett.
 
Sehr gerne. Hier ist der Link:
Eingebundener Inhalt
An dieser Stelle findest du externe Inhalte von Youtube. Zum Schutz deiner persönlichen Daten werden externe Einbindungen erst angezeigt, wenn du dies durch Klick auf "Alle externen Inhalte laden" bestätigst: Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit werden personenbezogene Daten an Drittplattformen übermittelt.
Für mehr Informationen besuche die Datenschutz-Seite.
 
Danke für eure Aufmerksamkeit Leute. Habe vor kurzem eine kleine Animation in QBasic 64 gemacht bei
der Gott sei dank alles funktioniert hat. Denke ich werde wohl umsteigen. Vielleicht freut sich der ein ein
oder andere mit einem etwas älteren System hier aber ja trotzdem über ein kleines Codebeispiel.;)
 
Zuletzt bearbeitet:
Hi,

ich weiß nicht ob Dir das noch was nutzt, wenn Du sowieso auf "QB64" umsteigen willst, stelle Dir aber trotzdem mal einen rudimentären Sourcecode ein, der die Steuerung mittels Cursortasten beinhaltet.
Viel Spaß damit ;-)

Code:
DECLARE SUB Verzoegerung (Ziel&)

SCREEN 12: REM 640x480 Pixel

Ziel& = 64342

LINE (0, 0)-(640, 480), 0, BF:   REM Hintergrundfarbe (gefülltes Rechteck)
LINE (1, 1)-(638, 476), 1, B:    REM Begrenzungsrahmen

REM Startpunkt ist in der Bildschirmmitte.
x% = 320
y% = 240
PSET (x%, y%), 0: REM wie Hintergrundfarbe

REM Spielschleife
DO
   eingabe$ = INKEY$
   IF LEN(eingabe$) = 2 THEN taste% = ASC(RIGHT$(eingabe$, 1)): REM 2 Bytes

   REM Cursortasten auswerten
   IF taste% = 75 THEN
                              x% = x% - 1: REM nach links
      ELSEIF taste% = 77 THEN x% = x% + 1: REM nach rechts
      ELSEIF taste% = 80 THEN y% = y% + 1: REM nach unten
      ELSEIF taste% = 72 THEN y% = y% - 1: REM nach oben
   END IF

   REM Die folgende Abfrage ist etwas unsauber, funktioniert aber
   REM einigermaßen. Wenn man eine größere Genauigkeit will, muß man
   REM mehrere IF-Abfragen realisieren.
   IF POINT(x% + 1, y% + 1) = 1 THEN
      anzahlKollisionen% = anzahlKollisionen% + 1
      LOCATE 1, 1: PRINT "Kollision Nr.: "; anzahlKollisionen%
      REM END
   END IF

   REM 1 Punkt "lange" Linien, ausgehend vom Startpunkt, zeichnen.
   'LINE -(x%, y%), 1
   PSET (x%, y%), 1
 
   REM Zum Ausprobieren. PSET-Funktion dann auskommentieren.
   REM Die Abfrage auf Kollision muß auch entsprechend angepaßt werden.
   'LINE (x%, y%)-(x% + 3, y% + 3), 1, BF

'3 verschiedene Arten, um die Abarbeitung des Programmes zu verzögern:
'Verzögerung nur in Sekundenschritten möglich:
'SLEEP (1)
'
'Praktikable Verzögerung, läuft aber auf jedem Rechner unterschiedlich schnell:
'Evtl. brauchbar, wenn man dem Spieler die Möglichkeit einräumt, die
'Verzögerung selbst einzustellen.
'FOR delay% = 1 TO 1600: NEXT delay%

'Hier wird auf den Bildschirm-Refresh gewartet:
'Die Verzögerung ist leider etwas hoch.
'WAIT &H3DA, 8
'WAIT &H3DA, 8, 8

'Siehe SUB Verzoegerung
FOR i% = 0 TO 5
   CALL Verzoegerung(Ziel&)
NEXT i%

LOOP WHILE (eingabe$ <> CHR$(27)): 'Ende, wenn Escapetaste gedrückt wurde.

'Für diese SUB siehe "https://www.franksteinberg.de/pbeisp.htm"
'Als Übergabewert erwartet die "SUB Verzoegerung" den Zählerstand, bei dem
'mit den Schleifen abgebrochen werden soll. Wir wissen, daß der PIT in 54,925
'Millisekunden von 65535 bis Null abwärts zählt. Für einen 10 Millisekun-
'den Delay ist also zu übergeben: 53603.
'Warum? 65536 / 54,925 = 1193,19 (für eine Millisekunde)
               '1193,19 * 10   = 11932   (für 10 Millisekunden)
               '65535 - 11932  = 53603   (gezählt wird abwärts)
'
SUB Verzoegerung (Ziel&)
   OUT (&H43), 52
   OUT (&H40), 255
   OUT (&H40), 255
 
   DO
      OUT (&H43), 0
      a& = INP(&H40)
      b& = INP(&H40)
      T& = a& + b& * 256
   LOOP UNTIL T& <= Ziel&
END SUB

Schönen So noch!

Nachtrag: Das Ganze läuft in Quickbasic 4.5 in der DOSBox unter Windows 10
 
Zuletzt bearbeitet:
Danke. Hätte ehrlich gesagt nicht erwartet das mir noch jemand Antwortet und sich soviel Mühe dabei gibt.
Auch wenn ich Snake inwischen mit anderem Code in Qb64 zum laufen gebracht habe werde ich mir deinen
Code auf jeden Fall mal etwas genauer ansehen. Vielleicht kann ich für die Zukunft ja etwas daraus mitnehmen.
 
Keine Ursache. Mußte mich erstmal vergewissern, daß das Datum relativ aktuell ist ;-)
Hätte nicht gedacht, daß noch soviel Interesse an QB besteht (hab' mich im Netz mal umgesehen)!
QB64 werd' ich mir auch mal ansehen.
 
Zurück