 |
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 |
Kritiker82.DE
Anmeldungsdatum: 09.10.2009 Beiträge: 4
|
Verfasst am: 09.10.2009, 19:27 Titel: Klassiker: Tetris (Problem: Steuerung & Platzierung) |
|
|
Erstmal Hallo, ich bin der Neue ,
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 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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Kritiker82.DE
Anmeldungsdatum: 09.10.2009 Beiträge: 4
|
Verfasst am: 10.10.2009, 08:19 Titel: |
|
|
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 |
|
 |
Kritiker82.DE
Anmeldungsdatum: 09.10.2009 Beiträge: 4
|
Verfasst am: 10.10.2009, 08:46 Titel: |
|
|
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 . 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 |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 10.10.2009, 10:00 Titel: |
|
|
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 |
|
 |
Kritiker82.DE
Anmeldungsdatum: 09.10.2009 Beiträge: 4
|
Verfasst am: 10.10.2009, 14:26 Titel: |
|
|
also das mit dem CASE "zwei" hab ich nicht ganz verstanden, aber mit CASE 27 funzt es ... 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 Ich taste mal ein wenig herum, ich halte euch auf dem laufenden  |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 10.10.2009, 21:48 Titel: |
|
|
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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 12.10.2009, 08:55 Titel: |
|
|
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
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 12.10.2009, 13:06 Titel: |
|
|
Bei FB wird als Escapezeichen FF$ benutzt. |
|
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.
|
|