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:

Klassiker: Tetris (Problem: Steuerung & Platzierung)

 
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
Kritiker82.DE



Anmeldungsdatum: 09.10.2009
Beiträge: 4

BeitragVerfasst am: 09.10.2009, 19:27    Titel: Klassiker: Tetris (Problem: Steuerung & Platzierung) Antworten mit Zitat

Erstmal Hallo, ich bin der Neue zwinkern,
find ich ja klasse, dass es noch eine aktive Community in sachen QuickBasic gibt.
Ich hab mir vor ein paar Tagen mal wieder QuickBasic 4.5 auf dem Rechner installiert (kopiert) und hab gleich mal wieder meine Kenntnisse ein wenig aufgefrischt; nun bin ich gerade dabei ein kleines Tetris zu programmieren, allerdings fehlt es mir hier wohl doch noch an dem nötigen Wissen traurig aber ihr könnt mir ja vielleicht weiterhelfen; also die Figuren hab ich bereits per LINE-Befehl alle erstellt steuer (sprich drehen kann ich sie auch bereits aber ich habe folgende Probleme:

- ich kann die Bausteine entweder nur mit der Tastatur steuern, oder sie automatisch fallen lassen (beides in Kombi funzt leider nicht)
- ich habe noch keine wirklich einfache Lösungs-Idee für di lokalisierung der Bausteine

Ich habe zwar 3-4 Tetris-Varianten im Netz gefunden, aber wirklich durchsteigen tue ich da nicht, ist einfach zu unübersichtlich oder vielleicht auch zu kompliziert. Und da ich ja den Aufbau des Programms kapieren möchte, bin ich nunmal nicht der Copy/Paste-Mensch. Wäre also super, wenn mir der ein oder andere von euch weiterhelfen kann.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 09.10.2009, 19:42    Titel: Antworten mit Zitat

Hallo und willkommen im Forum!

Es gibt ein Buch, das praktisch wie zugeschnitten auf dein Projekt ist: QTris - Darin wird die Umsetzung des Spiels in QBasic als Anleitung erklärt. lächeln Bei Amazon ist das Buch momentan noch günstig in gebrauchtem Zustand zu haben.

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kritiker82.DE



Anmeldungsdatum: 09.10.2009
Beiträge: 4

BeitragVerfasst am: 10.10.2009, 08:19    Titel: Antworten mit Zitat

Hallo Sebastian,
vielen Dank für die schnelle Antwort, aber.... Leider muss ich dir mitteilen, dass ich bisher keine meiner Programmiersprachen (PHP & MySQL) über ein Buch wirklich lernen konnte, sie sind ggf. praktisch als Referenz aber da nutze ich dann doch lieber das Internet, da ich die Erfahrung gesammelt habe, dass man hier eher anhand von verschiedenen Programmschnipseln oder über ein Forum über Anregungen zu einem wirklich selbst entwickelten Programm kommen kann. Ich probiere lieber tagelang aus und hole mir ggf. die ein oder andere Hilfestellung.

z.B. das automatische Fallen der Steine habe ich in einer IF-Abfrage mit TIME stehen, sprich:

Code:
IF TIMER > ZeitX + 0.5 then
  ZeitX=TIMER
  LoescheBlock(x,y,r,a)
  y=y+10
  ZeichneBlock(x,y,r,a)
end if


So und die Tastatur eingabe ist in einer do-loop-select-schleife

Code:
do
  do
    a$ = inkey$
  loop until a$ <> ""
  if len(a$) > 1 then a$=mid$(a$,2,1)
  LoescheBlock(x,y,r,a)
  select case asc(a$)
    case 72
      r=r+1
      if r>4 then r=1
    case 80
      y=y+10
    case 75
      x=x-10
    case 77
      x=x+10
  end select
  ZeichneBlock(x,y,r,a)
... ein paar IF-Abfragen um den Rand des Spielfeldes zu definieren)
loop until inkey$=chr$(27)
screen 0
cls


So, wenn ich nun den ganzen do-loop-select-teil in die Abfrage stelle, bekomme ich eine fehlermeldung, und wenn ich den If-Teil unter endselect setze, dann läuft der "Stein" nur dann runter wenn ich eine Taste drücke, aber dann immer in 20er-Schritten (sprich: 10 wg. Taste drücken und 10 wg. Timer>ZeitX+.5 wo muss ich denn nun meine IF-Abfrage hinsetzen, damit sie wie gewünscht abläuft, oder ist es der komplett falsche ansatz von mir, und man könnte es eleganter lösen (z.B. als Case-Punkt?
Vielen Dank für eure Hilfe!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kritiker82.DE



Anmeldungsdatum: 09.10.2009
Beiträge: 4

BeitragVerfasst am: 10.10.2009, 08:46    Titel: Antworten mit Zitat

So, nun habe ich meine IF-Abfrage in die zweite DO-Schleife gesetzt und es funktioniert bis hierhin eigentlich, nun ist allerdings mein Problem, dass ich das Programm nicht mehr beenden kann, ich schine nun in einer Endlosschleife fest zu hängen traurig. Ich kann mir allerdings nicht erklären wieso, hat hier jemand eine Idee dazu?

Code:
do
  do
    a$ = inkey$
      IF TIMER > ZeitX + 0.5 then
        ZeitX=TIMER
        LoescheBlock(x,y,r,a)
        y=y+10
        ZeichneBlock(x,y,r,a)
      end if
  loop until a$ <> ""
  if len(a$) > 1 then a$=mid$(a$,2,1)
  LoescheBlock(x,y,r,a)
  select case asc(a$)
    case 72
      r=r+1
      if r>4 then r=1
    case 80
      y=y+10
    case 75
      x=x-10
    case 77
      x=x+10
  end select
  ZeichneBlock(x,y,r,a)
... ein paar IF-Abfragen um den Rand des Spielfeldes zu definieren)
loop until inkey$=chr$(27)
screen 0
cls
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 10.10.2009, 10:00    Titel: Antworten mit Zitat

Du fragst in der Schleife zweimal mit INKEY$ die gedrückte Taste ab. Statt "loop until inkey$=chr$(27)" baue einfach einen neuen CASE zwei ein mit "exit do"
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kritiker82.DE



Anmeldungsdatum: 09.10.2009
Beiträge: 4

BeitragVerfasst am: 10.10.2009, 14:26    Titel: Antworten mit Zitat

also das mit dem CASE "zwei" hab ich nicht ganz verstanden, aber mit CASE 27 funzt es zwinkern... vielen Dank!!!

So, nun muss ich also "nur noch" hinbekommen, dass das programm weiss, wo ein Stein sitzt dass es diesen nicht überschreiben darf, ist das richtig? muss ich dafür jeden Block der gesetzt wurde in eine Matrix schreiben oder ist es einfacher ein gitter mit 0en und 1en zu erstellen 1 = belegt 0=frei, wenn gitter(a,b) = 1 dann block=stopp? aufzählung entspricht meinem gedanken-quelltext grinsen Ich taste mal ein wenig herum, ich halte euch auf dem laufenden zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 10.10.2009, 21:48    Titel: Antworten mit Zitat

tschuldigung, Tippfehler. Das sollte natürlich "CASE Zweig" heißen.

Auf die schnelle würde ich für dein Spielfeld ein 2-dimensionales Array vorschlagen ("DIM Spielfeld(5, 10) as Integer") das du eben wie eine Matrix betrachtest und jedes Feld seinen Wert hat. Ich würde z.B. 0 für "Feld frei" und "<> 0" für "belegt" definieren. Damit kannst du dann z.B. 1 = Blau, 2 = Rot, 3 = Grün, ... verwenden.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 12.10.2009, 08:55    Titel: Antworten mit Zitat

Zum Thema "Multitasking" (Tastatur abfragen und Zeitereignis steuern) der passende Artikel:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/EreignisSchleife.html

Hinweis CPU-Schonung: In die Schleife am besten noch einen CALL INTERRUPT auf 2Fh/AX=1680h nehmen, dann macht QB den CPU-Rechenzeitslot jeweils nach Abfrage wieder frei, ein nicht grün leuchtender Windows-Taskmanager und damit längere Akku-Laufzeit am Notebook wird es Dir dankbar belohnen...

Zur Tastatur: Habe dort immer etwas Mühe mit diesen auf dem ASCII-Wert basierten SELECT-Beispielen, da dies häufig falsch gemacht wird. Cursortasten haben nämlich immer INKEY$-Werte der Form
Code:
CHR$(0) + "H"
CHR$(0) + "K"
CHR$(0) + "M"
CHR$(0) + "P"

Problem in Deinem Code: Mit einem ASC() auf diesen String bekommst Du nur immer den Wert vom ersten Zeichen, also würde ein "CASE 0" gleich auf alle Spezialtasten ansprechen. Daher lasse dieses
Code:
SELECT CASE ASC(a$)

besser weg und nimmt einfach ein
Code:
SELECT CASE a$


Für eine Komplettübersicht sämtlicher Tastencodes gibt es von mir unter

http://beilagen.dreael.ch/QB/Tastenbelegung.xls

eine ziemlich vollständige Tabelle, welche in der Vergangenheit einmal experimentell(!) entstanden ist.

Hinweis FreeBasic: Dort scheinen andere Strings zu gelten + auch Nicht-Tastendrucke (z.B. Fenster schliessen) werden laut anderen Forenbeispielen per INKEY$ geliefert.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 12.10.2009, 13:06    Titel: Antworten mit Zitat

Bei FB wird als Escapezeichen FF$ benutzt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
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