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:)
 

Capucius

Komplett-PC-Aufrüster(in)
Funktioniert das Input auslesen und verarbeiten denn in einer Nicht-Echtzeitanwendung im selben Setup problemlos?
 

Capucius

Komplett-PC-Aufrüster(in)
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?
 
TE
TE
M

Marley5556

Schraubenverwechsler(in)
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:

Capucius

Komplett-PC-Aufrüster(in)
Ich wüsste nicht, warum das verboten sein sollte, mach mal, vielleicht probiere ich es einfach auch mal aus. :) Find die Idee nett.
 
TE
TE
M

Marley5556

Schraubenverwechsler(in)
Sehr gerne. Hier ist der Link:
Recommented content - Youtube 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. For more information go to the privacy policy.
 
TE
TE
M

Marley5556

Schraubenverwechsler(in)
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:

gamerexitus

Schraubenverwechsler(in)
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:
Oben Unten