 |
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 |
WinterStorm

Anmeldungsdatum: 14.11.2005 Beiträge: 198 Wohnort: Linz
|
Verfasst am: 15.06.2006, 17:11 Titel: Problem mit ASCII Wand |
|
|
moin,
also ich habe folgendes problem:
ich möchte ein spiel proggen,
bei dem man mit einem ascii smiley herumlaufen kann.
natürlich soll es auch wände geben, in die man nicht hineinlaufen darf.
bis jetzt hab ich alles schon, also fast. mein problem ist, dass
ich bei einer wand immer nur von einer seite gestoppt werde.
achwas, schaut euch einfach mal den code an:
Code: |
CLS
SCREEN 9
SCREEN 0
x = 1
y = 1
'WAND
LOCATE 9, 33
COLOR 8, 7
PRINT "²"
'SCHLEIFE
DO
LOCATE x, y
COLOR 14, 0
PRINT CHR$(1)
DO: t$ = INKEY$: LOOP UNTIL t$ <> ""
LOCATE x, y
PRINT " "
SELECT CASE RIGHT$(t$, 1)
CASE "H": x = x - 1: schri% = schri% - 1
CASE "K": y = y - 1: schri% = schri% - 1
CASE "M": y = y + 1: schri% = schri% - 1
CASE "P": x = x + 1: schri% = schri% - 1
CASE CHR$(27): END
END SELECT
'Bediengungen
IF x = 9 AND y = 33 THEN x = 8: y = 33
'
LOOP
|
in diesem fall bleibt der smiley nur stehen, wenn ich von oben komme.
danke schon mal für alle antworten.
mfg
WinterStorm _________________ Me
lastfm...
 |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 15.06.2006, 17:29 Titel: |
|
|
Hallo
Der Fehler ist der, dass du den Smilie immer auf die gleiche x-y-Position zurücksetzt wenn er die Wand berührt, egal aus welcher Richtung er kommt. Übrigens wird bei LOCATE zuerst die Zeile dann die Spalte angegeben, x und y sind bei dir also vertauscht wenn man es genau nimmt. Du musst also prüfen, ob das Zielfeld frei ist bevor du die Spielfigur dorthin verschiebst.
Mit der SCREEN-Funktion (nicht Anweisung!) kannst du übrigens prüfen welches Zeichen an einer bestimmten Bildschirmposition angezeigt wird. Wenn du das benutzt, brauchst du nicht die Koordinaten aller Wandelement in der Schleife einzeln durchzuprüfen.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
WinterStorm

Anmeldungsdatum: 14.11.2005 Beiträge: 198 Wohnort: Linz
|
Verfasst am: 15.06.2006, 17:38 Titel: |
|
|
ok, danke für die antwort.
dass x und y bei mir vertauscht sind weiß ich, bin allerdings im moment zu
faul um es zu ändern
die screen funktion kenne ich leider nicht, da ich noch ziemlicher anfänger bin. ich dachte eigentlich eher an eine leichtere lösung,
etwas in der art wie:
Code: |
IF x = 8 AND y = 33 AND INKEY$ = CHR$(0) + "P" THEN x = 9: y = 33
|
...und dann eben von jeder seite eine bediengung einbauen.
allerdings funzt das nicht, kp warum... oder kennt ihr vllt. noch eine andere leichte lösung?
mfg _________________ Me
lastfm...
 |
|
Nach oben |
|
 |
Manuel

Anmeldungsdatum: 23.10.2004 Beiträge: 1271 Wohnort: Bayern
|
Verfasst am: 15.06.2006, 17:50 Titel: |
|
|
btw, wenn wir gerade beim Thema sind...
Ganz ehrlich, aber wenn du auf diese Weise versuchst, ein "etwas" komplexes Spiel zu erstellen, wirst du dir wohl früher oder später die Haare ausraufen . Stell dir vor, du möchtest sowas wie ein Labyrinth-Spiel machen... Da bräuchtest du eine Menge an IF-Zeilen. Wenn da ein Fehler dabei rauskommt, muss man an den Spruch "wer suchet, der findet" rechnen... .
Ich empfehle dir, wenn du ein bisschen komplexere Spiele programmieren willst, dieses Tutorial. Da wird über den Verwendungszweck von sog. "Arrays" gesprochen... wenn du das durchhast, kannst du so ziemlich jedes 2D-Draufsicht-Spiel erstellen . _________________ DL Walk (Denkspiel) | DL Malek (Denkspiel) | DL Warrior (ASCII-Adventure) | DL Sokodos (Sokoban-Klon)
---
www.astorek.de.vu |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 15.06.2006, 18:04 Titel: |
|
|
So ist es viel einfacher zum Programmieren:
Code: | SCREEN 0
CLS
x = 1
y = 1
'WAND
LOCATE 9, 33
COLOR 8, 7
PRINT "²"
'SCHLEIFE
DO
LOCATE x, y
COLOR 14, 0
PRINT CHR$(1)
DO: t$ = INKEY$: LOOP UNTIL t$ <> ""
LOCATE x, y
PRINT " "
dx = 0
dy = 0
SELECT CASE RIGHT$(t$, 1)
CASE "H":
dx = -1
schri% = schri% - 1
CASE "K":
dy = -1
schri% = schri% - 1
CASE "M"
dy = 1
schri% = schri% - 1
CASE "P":
dx = 1
schri% = schri% - 1
CASE CHR$(27): END
END SELECT
'Bediengungen
IF SCREEN(x + dx, y + dy) <> ASC("²") THEN
x = x + dx
y = y + dy
END IF
'
LOOP |
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 15.06.2006, 18:14 Titel: |
|
|
Hallo
Ich habe das Programm mal etwas umgeschrieben. Das mit der SCREEN-Funktion ist ganz einfach. Du gibst die Koordinaten an und erhälst den ASCII-Wert des Zeichens zurück, das dort steht. Der ist 178 für dein Wandsymbol das hier im Forum als ² angezeigt wird, anders als im QB-Editor. Zusätzlich kann man nun nicht mehr aus dem Bildschirm laufen.
Code: | 'WAND
LOCATE 9, 33
COLOR 8, 7
PRINT "²"
'SCHLEIFE
DO
LOCATE x, y
COLOR 14, 0
PRINT CHR$(1)
DO: t$ = INKEY$: LOOP UNTIL t$ <> ""
LOCATE x, y
PRINT " "
xtest = x
ytest = y
SELECT CASE RIGHT$(t$, 1)
CASE "H": xtest = x - 1: schri% = schri% - 1
CASE "K": ytest = y - 1: schri% = schri% - 1
CASE "M": ytest = y + 1: schri% = schri% - 1
CASE "P": xtest = x + 1: schri% = schri% - 1
CASE CHR$(27): END
END SELECT
'Bedingungen
IF xtest = 0 THEN xtest = 23
IF xtest = 24 THEN xtest = 1
IF ytest = 81 THEN ytest = 1
IF ytest = 0 THEN ytest = 80
IF SCREEN(xtest, ytest) <> 178 THEN x = xtest: y = ytest
LOOP |
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
WinterStorm

Anmeldungsdatum: 14.11.2005 Beiträge: 198 Wohnort: Linz
|
Verfasst am: 15.06.2006, 22:00 Titel: |
|
|
danke für alle antworten,
jetzt funzt's.
[EDIT]
sorry, dass ich nochmal nachfrage, aber wie kann ich ein 2tes
"objekt" machen, das die gleichen eigenschaften hat, wie die mauer.
also das ich jetzt zb 178 und 177 als mauern habe?
[/EDIT]
mfg
WinterStorm _________________ Me
lastfm...
 |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 16.06.2006, 09:28 Titel: |
|
|
So etwa:
Code: | SCREEN 0
CLS
x = 1
y = 1
'WAND
LOCATE 9, 33
COLOR 8, 7
PRINT "²"
LOCATE 8, 20
COLOR 8, 7
PRINT CHR$(177)
'SCHLEIFE
DO
LOCATE x, y
COLOR 14, 0
PRINT CHR$(1)
DO: t$ = INKEY$: LOOP UNTIL t$ <> ""
LOCATE x, y
PRINT " "
dx = 0
dy = 0
SELECT CASE RIGHT$(t$, 1)
CASE "H":
dx = -1
schri% = schri% - 1
CASE "K":
dy = -1
schri% = schri% - 1
CASE "M"
dy = 1
schri% = schri% - 1
CASE "P":
dx = 1
schri% = schri% - 1
CASE CHR$(27): END
END SELECT
'Bediengungen
IF SCREEN(x + dx, y + dy) <> 178 and SCREEN(x + dx, y + dy) <> 177 THEN
x = x + dx
y = y + dy
END IF
'
LOOP |
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 16.06.2006, 11:55 Titel: |
|
|
Hallo
Du könntest es auch so machen, das er sich grundsätzlich nur auf leere Felder bewegt. Übertragen auf mein Beispiel sähe das so aus:
Code: | ...
IF SCREEN(xtest, ytest) = 32 THEN x = xtest: y = ytest
...
|
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
WinterStorm

Anmeldungsdatum: 14.11.2005 Beiträge: 198 Wohnort: Linz
|
Verfasst am: 16.06.2006, 17:41 Titel: |
|
|
moin,
danke für alles,
ich denke jetzt hab ich alles was ich im moment
benötige, wenn ich was brauch meld ich mich, und wenns
fertig is dann könnt ihrs unter projektvorstellungen bewundern^^...
mfg _________________ Me
lastfm...
 |
|
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.
|
|