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:

kleines Spiel
Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter
 
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
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 19.02.2008, 22:09    Titel: Antworten mit Zitat

Aber wie weiß das Programm, wann und welche Zeile eingelesen werden muss?
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 19.02.2008, 22:12    Titel: Antworten mit Zitat

Warum willst du wissen wie das Programm funktioniert durchgeknallt ?
Eine Ergänzung:
Wenn du die Daten von Anfang an wieder lesen willst, nimmst du
Code:
restore

_________________
Zitat:
1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein.


Zuletzt bearbeitet von raph ael am 29.03.2008, 23:13, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4709
Wohnort: ~/

BeitragVerfasst am: 19.02.2008, 22:16    Titel: Antworten mit Zitat

Habe meinen letzten Beitrag noch etwas erweitert (falls das untergegangen ist).
READ liest immer den nächsten Datensatz, einfach der Reihe nach. Wenn du den Datenzeiger woanders hinsetzen willst, musst du (wie raph ael ja gerade sagte) RESTORE nehmen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 19.02.2008, 22:22    Titel: Antworten mit Zitat

Wie muss ich dann den Code in mein Programm einbauen?
Und wie kann man die Level unterscheiden?
Ich weiß jetzt nicht, wo was hinkommt und was ich dazumachen muss...
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 19.02.2008, 22:27    Titel: Antworten mit Zitat

Die DATA- Abschnitte packst du am besten am Ende des Programms (aber setze ein 'End' davor). Ist wie in ASM. Die Levels kannst du mit Labels unterscheiden (aber komm nicht auf die Idee ein GoTo zu verwenden zwinkern )

Edit:
Siehe Restore
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4709
Wohnort: ~/

BeitragVerfasst am: 19.02.2008, 22:36    Titel: Antworten mit Zitat

Zum Unterscheiden der Levels lies dir vielleicht erstmal die Befehlsreferenz zu RESTORE durch (und zu DATA und READ, falls noch nicht geschehen).

Zum Einbau in dein Programm:
Du kannst ja statt meiner Zahlen 1 und 0 erst einmal die bisherigen Werte 219 (Wand) und 32 (frei) nehmen, für das Ziel außerdem den ASCII-Code von "O" (bin zu faul, nachzusehen). Dann kannst du den größten Teil des Programms lassen und musst nur die Routine zum Level-einlesen neu schreiben:
Code:
DO
COLOR 14
FOR a = 1 TO 10
  FOR b = 1 TO 10
    READ feldnummer
    LOCATE b, a
    PRINT CHR$(feldnummer)
  NEXT
NEXT

' der Rest des Programms
DO
   Xpos% = -1
   SELECT CASE INKEY$
   ' usw usf
LOOP UNTIL Xx% = 9 AND Xy% = 9

' und dann noch die Felddaten, im Augenblick 10x10 Stück pro Level
DATA [...]


Das erst einmal für ein Level. Für mehrere Level kannst du das ganze nochmal in eine Schleife packen und mehr DATA-Zeilen einfügen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 19.02.2008, 22:48    Titel: Antworten mit Zitat

So?:
Code:
DO
COLOR 14
FOR a = 1 TO 10
  FOR b = 1 TO 10
    READ 1 TO 10
    LOCATE b, a
    PRINT CHR$(219)
  NEXT
NEXT

   Xpos% = -1
   SELECT CASE INKEY$
      CASE CHR$(0) + CHR$(&H4B)
         Xpos% = 0
      CASE CHR$(0) + CHR$(&H4D)
         Xpos% = 1
      CASE CHR$(0) + CHR$(&H48)
         Xpos% = 2
      CASE CHR$(0) + CHR$(&H50)
         Xpos% = 3
   END SELECT
   SELECT CASE Xpos%
      CASE 0: Xx% = Xx% - 1
      CASE 1: Xx% = Xx% + 1
      CASE 2: Xy% = Xy% - 1
      CASE 3: Xy% = Xy% + 1
   END SELECT
   IF Xx% < 1 THEN Xx% = 1
   IF Xx% > 10 THEN Xx% = 10
   IF Xy% < 1 THEN Xy% = 1
   IF Xy% > 10 THEN Xy% = 10
IF SCREEN(Xy%, Xx%) = 32 OR SCREEN(Xy%, Xx%) = ASC("X") THEN
   IF Xpos% > -1 THEN
   CLS
   COLOR 13
   LOCATE Xy%, Xx%
   PRINT CHR$(1)
   COLOR 12
   LOCATE 9, 9
   PRINT "X"
   END IF
ELSE
   SELECT CASE Xpos%
      CASE 0: Xx% = Xx% + 1
      CASE 1: Xx% = Xx% - 1
      CASE 2: Xy% = Xy% + 1
      CASE 3: Xy% = Xy% - 1
   END SELECT
END IF
LOOP UNTIL Xx% = 9 AND Xy% = 9

DATA 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
DATA 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
DATA 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
DATA 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
DATA 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
DATA 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
DATA 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
DATA 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
DATA 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
DATA 1, 1, 1, 1, 1, 1, 1, 1, 1, 1

_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4709
Wohnort: ~/

BeitragVerfasst am: 19.02.2008, 22:53    Titel: Antworten mit Zitat

Das DO in der ersten Zeile habe ich übersehen, das muss raus.

Ersetze doch, wie ich geschrieben habe, in den DATA-Zeilen 1 durch 219 und 0 duch 32.

edit: und nach den FOR...NEXT-Schleifen muss das DO dann rein.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.


Zuletzt bearbeitet von nemored am 19.02.2008, 22:54, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 19.02.2008, 22:53    Titel: Antworten mit Zitat

Was macht denn das "to" im "read" Kopf schütteln
To
Read
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 19.02.2008, 22:57    Titel: Antworten mit Zitat

Code:
DO
COLOR 14
FOR a = 1 TO 10
  FOR b = 1 TO 10
    READ 1, 10
    LOCATE b, a
    PRINT CHR$(219)
  NEXT
NEXT

DO
   Xpos% = -1
   SELECT CASE INKEY$
      CASE CHR$(0) + CHR$(&H4B)
         Xpos% = 0
      CASE CHR$(0) + CHR$(&H4D)
         Xpos% = 1
      CASE CHR$(0) + CHR$(&H48)
         Xpos% = 2
      CASE CHR$(0) + CHR$(&H50)
         Xpos% = 3
   END SELECT
   SELECT CASE Xpos%
      CASE 0: Xx% = Xx% - 1
      CASE 1: Xx% = Xx% + 1
      CASE 2: Xy% = Xy% - 1
      CASE 3: Xy% = Xy% + 1
   END SELECT
   IF Xx% < 1 THEN Xx% = 1
   IF Xx% > 10 THEN Xx% = 10
   IF Xy% < 1 THEN Xy% = 1
   IF Xy% > 10 THEN Xy% = 10
IF SCREEN(Xy%, Xx%) = 32 OR SCREEN(Xy%, Xx%) = ASC("X") THEN
   IF Xpos% > -1 THEN
   CLS
   COLOR 13
   LOCATE Xy%, Xx%
   PRINT CHR$(1)
   COLOR 12
   LOCATE 9, 9
   PRINT "X"
   END IF
ELSE
   SELECT CASE Xpos%
      CASE 0: Xx% = Xx% + 1
      CASE 1: Xx% = Xx% - 1
      CASE 2: Xy% = Xy% + 1
      CASE 3: Xy% = Xy% - 1
   END SELECT
END IF
LOOP UNTIL Xx% = 9 AND Xy% = 9

DATA 219, 219, 219, 219, 219, 219, 219, 219, 219, 219
DATA 219, 32, 32, 32, 32, 32, 32, 32, 32, 219
DATA 219, 32, 32, 32, 32, 32, 32, 32, 32, 219
DATA 219, 32, 32, 32, 32, 32, 32, 32, 32, 219
DATA 219, 32, 32, 32, 32, 32, 32, 32, 32, 219
DATA 219, 32, 32, 32, 32, 32, 32, 32, 32, 219
DATA 219, 32, 32, 32, 32, 32, 32, 32, 32, 219
DATA 219, 32, 32, 32, 32, 32, 32, 32, 32, 219
DATA 219, 32, 32, 32, 32, 32, 32, 32, 32, 219
DATA 219, 219, 219, 219, 219, 219, 219, 219, 219, 219

???
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4709
Wohnort: ~/

BeitragVerfasst am: 19.02.2008, 23:02    Titel: Antworten mit Zitat

Hast du den Referenzbeitrag zu READ inzwischen schon durchgelesen? lächeln

Probiere doch mal in den FOR...NEXT-Schleifen den Code aus, den ich weiter oben gepostet habe. Oder, noch besser - überleg mal, was bei deinem Code wohl passieren würde (wenn das READ funktionieren würde).
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
raph ael



Anmeldungsdatum: 12.04.2006
Beiträge: 472

BeitragVerfasst am: 19.02.2008, 23:04    Titel: Antworten mit Zitat

Ähem...
Da sind 2 DOs aber nur ein LOOP...

UND: Beitrag 333!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


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

BeitragVerfasst am: 19.02.2008, 23:37    Titel: Antworten mit Zitat

Empfehlung von mir: Levels würde ich besser in Dateien auslagern, der Vorteil ist eine vollständige Entkopplung von Programm und Daten, was die ganze Software viel flexibler macht. Von mir in diesem Bereich etliche Beispiele:

http://www.dreael.ch/Deutsch/Download/Wurmi.html
http://www.dreael.ch/Deutsch/Download/Zelda.html
http://beilagen.dreael.ch/QB/SOKOBAN.ZIP

In all diesen Beispielen habe ich sogar einen Leveleditor hineingenommen. Für Deinen Fall würde ich ein texteditorfreundliches Dateiformat definieren, z.B. die Alt+219-Blöcke als "*" darstellen, von mir aus noch die Buchstaben "S" und "Z" als Start- und Zielpunkt.

Umsetzungstechnisch ist es von READ + DATA ein kleiner Schritt: Anstelle von
Code:
DIM level%(1 TO 40, 1 TO 25)
FOR i%=1 TO 25
  FOR j%=1 TO 40
    READ level%(j%, i%)
  NEXT j%
NEXT i%

wird daraus ein (ungetestetes Beispiel)
Code:
OPEN "level" + TRIM$(STR$(levelNr%)) + ".dat" FOR INPUT AS 1
FOR i%=1 TO 25
  LINE INPUT#1, z$
  FOR j%=1 TO 40
    SELECT CASE MID$(z$, j%, 1)
    CASE "*"
      level%(j%, i%) = 219
    CASE " "
      level%(j%, i%) = 32
    CASE "S"
      xPosStart% = j%
      yPosStart% = i%
      level%(j%, i%) = 32   ' Dort, wo man zu Beginn steht, hat es auch Boden!
    CASE "Z"
      zielX% = j%
      zielY% = i%
      level%(j%, i%) = 32
    END SELECT
  NEXT j%
NEXT i%
CLOSE 1

=> Levels würde ich mit NOTEPAD.EXE (Texteditor) erstellen:
Code:
****************************************
*                                      *
*                                      *
*                                      *
*                                      *
*      *****                           *
*     S*                               *
********                               *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*       ******                         *
*           Z*                         *
*            *                         *
****************************************

Weiterer Vorteil dieser Lösung: Das ganze RESTORE-Handling mit zig Labels und irgend einem unschönen
Code:
SELECT CASE levelNr%
CASE 1
  RESTORE level1
CASE 2
  RESTOPE level2
CASE 3
  ...
END SELECT

entfällt komplett. Siehe dazu auch meinen Anfängerartikel.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 20.02.2008, 17:10    Titel: Antworten mit Zitat

dreael hat Folgendes geschrieben:
Empfehlung von mir: Levels würde ich besser in Dateien auslagern, der Vorteil ist eine vollständige Entkopplung von Programm und Daten, was die ganze Software viel flexibler macht. Von mir in diesem Bereich etliche Beispiele:

http://www.dreael.ch/Deutsch/Download/Wurmi.html
http://www.dreael.ch/Deutsch/Download/Zelda.html
http://beilagen.dreael.ch/QB/SOKOBAN.ZIP

In all diesen Beispielen habe ich sogar einen Leveleditor hineingenommen. Für Deinen Fall würde ich ein texteditorfreundliches Dateiformat definieren, z.B. die Alt+219-Blöcke als "*" darstellen, von mir aus noch die Buchstaben "S" und "Z" als Start- und Zielpunkt.

Umsetzungstechnisch ist es von READ + DATA ein kleiner Schritt: Anstelle von
Code:
DIM level%(1 TO 40, 1 TO 25)
FOR i%=1 TO 25
  FOR j%=1 TO 40
    READ level%(j%, i%)
  NEXT j%
NEXT i%

wird daraus ein (ungetestetes Beispiel)
Code:
OPEN "level" + TRIM$(STR$(levelNr%)) + ".dat" FOR INPUT AS 1
FOR i%=1 TO 25
  LINE INPUT#1, z$
  FOR j%=1 TO 40
    SELECT CASE MID$(z$, j%, 1)
    CASE "*"
      level%(j%, i%) = 219
    CASE " "
      level%(j%, i%) = 32
    CASE "S"
      xPosStart% = j%
      yPosStart% = i%
      level%(j%, i%) = 32   ' Dort, wo man zu Beginn steht, hat es auch Boden!
    CASE "Z"
      zielX% = j%
      zielY% = i%
      level%(j%, i%) = 32
    END SELECT
  NEXT j%
NEXT i%
CLOSE 1

=> Levels würde ich mit NOTEPAD.EXE (Texteditor) erstellen:
Code:
****************************************
*                                      *
*                                      *
*                                      *
*                                      *
*      *****                           *
*     S*                               *
********                               *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*                                      *
*       ******                         *
*           Z*                         *
*            *                         *
****************************************

Weiterer Vorteil dieser Lösung: Das ganze RESTORE-Handling mit zig Labels und irgend einem unschönen
Code:
SELECT CASE levelNr%
CASE 1
  RESTORE level1
CASE 2
  RESTOPE level2
CASE 3
  ...
END SELECT

entfällt komplett. Siehe dazu auch meinen Anfängerartikel.

Sieht das ganze dann so aus, oder fehlt noch was(auser die Leveldatei)?:
Code:
CLS
COLOR 13
Xy% = 2
Xx% = 2
LOCATE Xy%, Xx%
PRINT CHR$(1)
COLOR 12
LOCATE 9, 9
PRINT "X"

DO
OPEN "level" + TRIM$(STR$(levelNr%)) + ".dat" FOR INPUT AS 1
FOR i%=1 TO 25
  LINE INPUT#1, z$
  FOR j%=1 TO 40
    SELECT CASE MID$(z$, j%, 1)
    CASE "*"
      level%(j%, i%) = 219
    CASE " "
      level%(j%, i%) = 32
    CASE "S"
      xPosStart% = j%
      yPosStart% = i%
      level%(j%, i%) = 32   ' Dort, wo man zu Beginn steht, hat es auch Boden!
    CASE "Z"
      zielX% = j%
      zielY% = i%
      level%(j%, i%) = 32
    END SELECT
  NEXT j%
NEXT i%
CLOSE 1

   Xpos% = -1
   SELECT CASE INKEY$
      CASE CHR$(0) + CHR$(&H4B)
         Xpos% = 0
      CASE CHR$(0) + CHR$(&H4D)
         Xpos% = 1
      CASE CHR$(0) + CHR$(&H48)
         Xpos% = 2
      CASE CHR$(0) + CHR$(&H50)
         Xpos% = 3
   END SELECT
   SELECT CASE Xpos%
      CASE 0: Xx% = Xx% - 1
      CASE 1: Xx% = Xx% + 1
      CASE 2: Xy% = Xy% - 1
      CASE 3: Xy% = Xy% + 1
   END SELECT
   IF Xx% < 1 THEN Xx% = 1
   IF Xx% > 10 THEN Xx% = 10
   IF Xy% < 1 THEN Xy% = 1
   IF Xy% > 10 THEN Xy% = 10
IF SCREEN(Xy%, Xx%) = 32 OR SCREEN(Xy%, Xx%) = ASC("X") THEN
   IF Xpos% > -1 THEN
   CLS
   COLOR 13
   LOCATE Xy%, Xx%
   PRINT CHR$(1)
   COLOR 12
   LOCATE 9, 9
   PRINT "X"
   END IF
ELSE
   SELECT CASE Xpos%
      CASE 0: Xx% = Xx% + 1
      CASE 1: Xx% = Xx% - 1
      CASE 2: Xy% = Xy% + 1
      CASE 3: Xy% = Xy% - 1
   END SELECT
END IF
LOOP UNTIL Xx% = 9 AND Xy% = 9

_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 24.02.2008, 09:33    Titel: Antworten mit Zitat

Weiß jemand, was daran falsch ist?
_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4709
Wohnort: ~/

BeitragVerfasst am: 24.02.2008, 13:27    Titel: Antworten mit Zitat

Ja.



Schau mal, wo deine DO-Schleife beginnt und wo sie endet. Dann wirst du feststellen, dass du bei jedem Schleifendurchlauf, der zur Bewegungsabfrage dient, auch wieder komplett neu die Leveldaten einliest.
Außerdem ist das Spielziel immer noch Xx% = 9 und Xy% = 9, und nicht der Punkt, an dem in der Leveldatei das Z markiert ist (wo das ist, steht im Quelltext drin, darfst du selber suchen zwinkern )
Weitere mögliche Fehlerquellen könnten Leveldateien im falschen Format (statt 40x25) oder mit falschem Dateinamen (level0.dat, level1.dat usw.) sein.

Ach ja: die Position Xx% und Xy% solltest du am Anfang auch auf die ausgelesene Startposition setzen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 24.02.2008, 13:43    Titel: Antworten mit Zitat

Also muss ich dann oben die Leveleinlesung vor DO machen(da sieht man aber nach dem 1. Bewegen nichts mehr)?

Das mit dem LOOP UNTIL:
Wie mache ich das?

X und Y:
Muss ich dann in der 3. und 4. Zeile das schreiben?:
Code:
Xy% = 7
Xx% = 7

_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4709
Wohnort: ~/

BeitragVerfasst am: 24.02.2008, 14:08    Titel: Antworten mit Zitat

Zitat:
(da sieht man aber nach dem 1. Bewegen nichts mehr)

hmm, das liegt an dem CLS, dass du noch im Code hast:
Code:
IF Xpos% > -1 THEN
   CLS
   COLOR 13
   LOCATE Xy%, Xx%
   PRINT CHR$(1)
   COLOR 12
   LOCATE 9, 9
   PRINT "X"
END IF

Lass diesen Teil mal raus und programmiere die Grafikänderung da hinein, wo du die Figur bewegst:
Code:
   LOCATE Xy%, Xx%
   PRINT CHR$(level%(Xx%, Xy%))
   SELECT CASE Xpos%
      CASE 0: Xx% = Xx% - 1
      CASE 1: Xx% = Xx% + 1
      CASE 2: Xy% = Xy% - 1
      CASE 3: Xy% = Xy% + 1
   END SELECT
   LOCATE Xy%, Xx%
   PRINT CHR$(1)

Die ersten beiden und die letzten beiden Zeilen wurden neu hinzugefügt. Die ersten löschen deine Figur von der alten Position, die neuen zeichnen sie an der neuen Position neu hin.

Wenn ich das richtig sehe, solltest du noch durch Wände laufen können. Die Überprüfung, ob das Feld, auf das du gehen möchtest, frei ist, musst du auch in den oberen Block schreiben:
Code:
      CASE 0: IF level%(Xx% - 1, Xy%) = 32 THEN Xx% = Xx% - 1

usw.

Zitat:
Muss ich dann in der 3. und 4. Zeile das schreiben?:
Code:
Xy% = 7
Xx% = 7


Start- und Zielpunkt liest du an dieser Stelle aus:
Code:
    CASE "S"
      xPosStart% = j%
      yPosStart% = i%
      level%(j%, i%) = 32
    CASE "Z"
      zielX% = j%
      zielY% = i%
      level%(j%, i%) = 32

Was du jetzt noch tun musst, ist, Xx% und Xy% auf den x- und y-Wert des Startpunktes zu setzen und am Ende beim LOOP zu überprüfen, ob sie den x- und y-Wert des Zielpunktes erreicht haben.

Nochmal zur Strukturierung des Programms: Aussehen sollte es folgendermaßen:
Code:
Setze_allgemeine_Parameter
Lies_Leveldaten
Zeichne_Spielfeld

Wiederhole
    Frage_Tastatur_ab
    Bewege_Figur
Bis Ziel_erreicht

oder für mehrere Level:
Code:
Setze_allgemeine_Parameter

Wiederhole
    Lies_Leveldaten
    Zeichne_Spielfeld

    Wiederhole
        Frage_Tastatur_ab
        Bewege_Figur
    Bis Ziel_erreicht

Bis Letztes_Level_abgeschlossen

_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 24.02.2008, 14:16    Titel: Antworten mit Zitat

Hallo Seb,

vielleicht solltest du einfach etwas anders an die Sache herangehen. So wie ich das sehe, versuchst du nur, verschiedene Programmschnippsel, die dir von unterschiedlichen Leuten als Beispiel gegeben wurden, aneinander zu kleben. Dass das nicht so richtig klappt, siehst du ja.

Ich glaube, es wäre besser wenn du versuchst, erst ganz genau zu verstehen, wie diese Beispielprogramme arbeiten und verschiedene Funktionen nach und nach in dein Programm übernimmst. Also erst dann, wenn alles so läuft wie du willst, eine neue Sache einbauen und dein Programm so Schritt für Schritt erweitern. Vor allem darfst du diese neuen Funktionen nicht nur einfach kopieren und einfügen, sondern du solltest sie verstehen und dann, angepasst an das, was du schon hast, selbst nachprogrammieren. Dabei gibt es oft unterschiedliche Möglichkeiten, ein Problem zu lösen. Wie z.B. das Spielfeld entweder in einem Array zu speichern wie in level%(j%,i%) oder mit SCREEN das angezeigte Zeichen abzufragen. Was für dich besser ist und was deiner Art zu programmieren mehr entspricht, kannst du nur herausfinden, wenn du beides mal ausprobierst. Mit SCREEN ist es einfacher, ein Array bietet mehr Möglichkeiten wie z.B. nur Felder innerhalb eines Sichtbereichs anzuzeigen. So, genug gelabert... zwinkern

Gruß
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Seb



Anmeldungsdatum: 29.11.2006
Beiträge: 120
Wohnort: Henfenfeld

BeitragVerfasst am: 24.02.2008, 14:21    Titel: Antworten mit Zitat

Sieht das Programm dann so aus?:
Code:
CLS
COLOR 13
Xy% = 2
Xx% = 2
LOCATE Xy%, Xx%
PRINT CHR$(1)
COLOR 12
LOCATE 9, 9
PRINT "X"

OPEN "level" + TRIM$(STR$(levelNr%)) + ".dat" FOR INPUT AS 1
FOR i%=1 TO 25
  LINE INPUT#1, z$
  FOR j%=1 TO 40
    SELECT CASE MID$(z$, j%, 1)
    CASE "*"
      level%(j%, i%) = 219
    CASE " "
      level%(j%, i%) = 32
    CASE "S"
      xPosStart% = j%
      yPosStart% = i%
      level%(j%, i%) = 32   ' Dort, wo man zu Beginn steht, hat es auch Boden!
    CASE "Z"
      zielX% = j%
      zielY% = i%
      level%(j%, i%) = 32
    END SELECT
  NEXT j%
NEXT i%
CLOSE 1

DO
COLOR 14
FOR a = 1 TO 10
LOCATE 1, a
PRINT CHR$(219)
LOCATE 10, a
PRINT CHR$(219)
NEXT

FOR b = 2 TO 9
LOCATE b, 1
PRINT CHR$(219)
LOCATE b, 10
PRINT CHR$(219)
NEXT

   Xpos% = -1
   SELECT CASE INKEY$
      CASE CHR$(0) + CHR$(&H4B)
         Xpos% = 0
      CASE CHR$(0) + CHR$(&H4D)
         Xpos% = 1
      CASE CHR$(0) + CHR$(&H48)
         Xpos% = 2
      CASE CHR$(0) + CHR$(&H50)
         Xpos% = 3
   END SELECT
   LOCATE Xy%, Xx%
   PRINT CHR$(level%(Xx%, Xy%))
   SELECT CASE Xpos%
      CASE 0: IF level%(Xx% - 1, Xy%) = 32 THEN Xx% = Xx% - 1
      CASE 1: IF level%(Xx% - 1, Xy%) = 32 THEN Xx% = Xx% - 1
      CASE 2: IF level%(Xx% - 1, Xy%) = 32 THEN Xy% = Xy% - 1
      CASE 3: IF level%(Xx% - 1, Xy%) = 32 THEN Xy% = Xy% - 1
   END SELECT
   LOCATE Xy%, Xx%
   PRINT CHR$(1)
   IF Xx% < 1 THEN Xx% = 1
   IF Xx% > 10 THEN Xx% = 10
   IF Xy% < 1 THEN Xy% = 1
   IF Xy% > 10 THEN Xy% = 10
LOOP UNTIL Xx% = 9 AND Xy% = 9

_________________
MfG
Seb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger MSN Messenger
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
Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter
Seite 3 von 5

 
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