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

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 24.02.2008, 16:43 Titel: |
|
|
Seb hat Folgendes geschrieben: | Sieht das Programm dann so aus?: |
Nein, nein und nochmals nein. Du hast nur völlig wirr Stücke aus Nemoreds, Dreaels und meinen Beispielen aneinanderkopiert, ohne dir Gedanken darüber zu machen, was du bzw. "dein Programm" da eigentlich tut.
Von kleineren Fehlern wie dass z.B. der Wert von levelNr% nirgendwo festgelegt wird oder es LTRIM$ und nicht TRIM$ heißen muss etc. - du liest mit Dreaels Teil eine Leveldatei ein, aber benutzt sie dann gar nicht (???), sondern zeichnest weiterhin einfach das Kästchen aus meinem Beispiel und bewegst dich darin nach Nemoreds Methode, die ihrerseits aber wieder nicht zu den anderen Teilen passt. So wird z.B. geprüft, ob das Feld, auf das man will im gültigen Bereich liegt, obwohl das unnötig ist, wenn der Rand von Mauer umgeben ist.
Sorry, aber wenn du dir nicht etwas mehr Mühe gibst, zu verstehen, was du da programmierst, kann das nichts werden.
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 24.02.2008, 19:18 Titel: |
|
|
Ich weiß ja nicht, wie ich dann das ganze machen muss und alles am Schluss aussieht  _________________ MfG
Seb |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 24.02.2008, 19:30 Titel: Lauffähiges Beispiel |
|
|
Seb hat Folgendes geschrieben: | Weiß jemand, was daran falsch ist? |
Habe inzwischen eine ganz einfach gehaltene, aber voll lauffähige Version (LABSPIEL.BAS) zusammengestellt:
http://beilagen.dreael.ch/QB/LABSPIEL.ZIP
Hinweis: Levels sind mit einem Generator (als LEV_GEN.BAS ebenfalls dabei) erstellt, diese kannst Du jedoch mit einem beliebigen Texteditor noch anpassen.
Auf aufwändige Grafik und Sound wurde verzichtet. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 24.02.2008, 19:35 Titel: |
|
|
Seb hat Folgendes geschrieben: | Ich weiß ja nicht, wie ich dann das ganze machen muss und alles am Schluss aussieht  |
Wie schon gesagt: versuche nachzuvollziehen, was dir bisher erklärt wurde und mache es dann selbst! Wenn du etwas nicht verstehst, frage ganz konkret nach. Also z.B. "was genau passiert in der und der Zeile", "wie funktioniert dieser Befehl" usw. _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4709 Wohnort: ~/
|
Verfasst am: 25.02.2008, 16:37 Titel: |
|
|
Der Code öffnet eine Datei, um die Leveldaten auszulesen.
Code: | OPEN "level" + TRIM$(STR$(levelNr%)) + ".dat" FOR INPUT AS 1
FOR i%=1 TO 25
LINE INPUT#1, z$
[...]
NEXT i%
CLOSE 1 |
Die FOR-Schleife liest eine Zeile (LINE INPUT) nach der anderen aus der Datei, und das für insgesamt 25 Zeilen (weil i% bei 1 beginnt und bei 25 aufhört; bei jedem Schleifendurchlauf wird i% um 1 erhöht). Das bedeutet nebenbei, dass die Leveldaten auch 25 Zeilen beinhalten müssen.
Code: | FOR j%=1 TO 40
SELECT CASE MID$(z$, j%, 1)
[...]
END SELECT
NEXT j%
|
Die eingelesene Zeile wird jetzt in ihre Einzelbuchstaben zerlegt. MID$(z$, j%, 1) liefert den j-ten Buchstaben des Strings z$, also deiner eingelesenen Zeile. Da j% von 1 bis 40 läuft, folgt daraus, dass jede Levelzeile aus 40 Zeichen bestehen muss.
Code: | CASE "*"
level%(j%, i%) = 219
CASE " "
level%(j%, i%) = 32
CASE "S"
xPosStart% = j%
yPosStart% = i%
level%(j%, i%) = 32
CASE "Z"
zielX% = j%
zielY% = i%
level%(j%, i%) = 32
|
Auswertung des eingelesenen Zeichens: Steht da ein *, dann ist an der Stelle eine Wand (Zeichen 219). Ein Leerzeichen steht für eine freie Stelle (Zeichen 32). Den Buchstaben S und Z haben eine besondere Bedeutung: Sie sind zum einen freie Felder (Zeichen 32), zum anderen der Start- bzw. Zielpunkt. Damit sich das Programm das merken kann, werden hier die Variablen xPosStart%, yPosStart%, zielX% und zielY% angelegt (d. h. du bist am Ziel, wenn du an der Stelle zielX% / zielY% bist).
Die Leveldaten werden im Array level%() gespeichert. Wenn z. B. level%(7, 5) den Wert 219 hat, bedeutet das, dass in der 5. Zeile, 7. Spalte eine Wand steht (beachte dabei, dass normalerweise der x-Wert von links nach rechts geht und der y-Wert von oben nach unten, dass es bei LOCATE aber anders herum ist: da steht erst die Zeile, dann die Spalte).
Probiere doch mal nur diesen Code aus - einfach nur die Daten aus einer Datei einlesen (dreael hat ja ein Beispiellevel gepostet, das kannst du unter level0.dat speichern und/oder modifizieren) und auf den Bildschirm bringen, oder einzelne Felder auslesen. Probier mal ein bisschen rum. Und wenn dieser Teil zu deiner Zufriedenheit funktioniert, kannst du weiterbauen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 27.02.2008, 16:19 Titel: |
|
|
Danke nemored!
Ich habe jetzt einmal bisschen rumprobiert, aber es ist mir immer noch ein Rätsel, wie ich das einbaue?!
Immer kommen Fehler-Meldungen.
Kann bitte evtl. jemand einmal den einlese Code in meinen Code einbauen, weil bei mir wird das noch ewig dauern ?
Ich würde mich freuen.
Danach könne ich auch nachvollziehen, wie man das macht...
Hier wäre nochmal der Code:
Code: | CLS
COLOR 13
Xy% = 2
Xx% = 2
LOCATE Xy%, Xx%
PRINT CHR$(1)
COLOR 12
LOCATE 9, 9
PRINT "X"
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
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 29.02.2008, 14:58 Titel: |
|
|
Aber du hast doch schon ein Beispiel von Dreael bekommen, das nemored ausführlich erklärt hat. Dann schreib doch mal ganz konkret, wenn du was nicht verstehst, am besten mit der Fehlermeldung.
Ich habe dir auch noch mal ein Beispiel geschrieben, der Einfachheit halber kannst du die Leveldateien von Dreael benutzen Ansonsten gehe ich in meinem Programm aber etwas anders vor. Bevor ich mir einen Wolf erkläre, warte ich lieber auf Rückfragen.
Code: | SCREEN 0
CLS
DIM byte AS STRING * 1
level = 1
DO
CLS
datei$ = "level" + LTRIM$(STR$(level)) + ".txt"
OPEN datei$ FOR BINARY AS #1
IF LOF(1) = 0 THEN
LOCATE 1, 1
COLOR 15, 0
PRINT "Leveldatei nicht gefunden."
CLOSE #1
END
END IF
spalte = 1
zeile = 1
FOR zeichen = 1 TO LOF(1)
GET #1, zeichen, byte
IF byte = CHR$(13) THEN
zeile = zeile + 1
spalte = 1
zeichen = zeichen + 1
ELSE
SELECT CASE byte
CASE "*"
byte = CHR$(219)
COLOR 14, 0
CASE "S"
zmerk = zeile
smerk = spalte
merk = ASC(byte)
fmerk = 12
byte = CHR$(1)
COLOR 13, 0
CASE "Z"
byte = "X"
COLOR 12, 0
END SELECT
LOCATE zeile, spalte
PRINT byte;
spalte = spalte + 1
END IF
NEXT
CLOSE #1
zeile = zmerk
spalte = smerk
DO
DO
taste$ = INKEY$
LOOP WHILE taste$ = ""
neuezeile = zeile
neuespalte = spalte
SELECT CASE taste$
CASE CHR$(0) + "K"
neuespalte = spalte - 1
CASE CHR$(0) + "M"
neuespalte = spalte + 1
CASE CHR$(0) + "H"
neuezeile = zeile - 1
CASE CHR$(0) + "P"
neuezeile = zeile + 1
CASE CHR$(27) 'Ende mit Escape
END
END SELECT
IF SCREEN(neuezeile, neuespalte) <> 219 THEN
LOCATE zeile, spalte
COLOR fmerk, 0
PRINT CHR$(merk);
spalte = neuespalte
zeile = neuezeile
merk = SCREEN(zeile, spalte)
fmerk = SCREEN(zeile, spalte, 1)
LOCATE zeile, spalte
COLOR 13, 0
PRINT CHR$(1);
END IF
LOOP UNTIL merk = ASC("X")
level = level + 1
LOOP |
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de !
Zuletzt bearbeitet von Skilltronic am 01.03.2008, 21:07, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 01.03.2008, 09:00 Titel: |
|
|
Danke!
Jetzt weiß ich, was ich falsch gemacht habe!
Ich habe paar Zeilen ausgelassen.
Skilltronic hat Folgendes geschrieben: | Bevor ich mir einen Wolf erkläre, warte ich lieber auf Rückfragen. |
OK
Eins verstehe ich nicht:
Was macht...
...??? _________________ MfG
Seb |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.03.2008, 13:45 Titel: |
|
|
Was hab ich gesagt? F1 drücken! Die QB-hilfe erklärt das soooo toll... Deswegen verzichte ich jetzt auf eine Erklärung  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 01.03.2008, 19:08 Titel: |
|
|
Oh, stimmt!
Das muss ich mir jetzt mal merken  _________________ MfG
Seb |
|
Nach oben |
|
 |
RatsDevSoftware
Anmeldungsdatum: 22.11.2007 Beiträge: 48
|
Verfasst am: 01.03.2008, 21:10 Titel: |
|
|
kauf dir ne seniorentastatur, die die üblichen funktionen gleich mit auf den tasten hat grmll... _________________ visit our Homepage!
shift ist verschwendung...
...o gott - ich fang schon wieder an zu spammen... |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 01.03.2008, 21:26 Titel: |
|
|
Seb hat Folgendes geschrieben: | Jetzt weiß ich, was ich falsch gemacht habe!
Ich habe paar Zeilen ausgelassen. |
Nur mal so aus Interesse - wie meinst du das? Mein Beispiel, also sowohl das Laden als auch die Steuerung, funktioniert doch ganz anders als die vorigen. Wie kann dir das zeigen, dass du ein paar Zeilen ausgelassen hast und welche Zeilen meinst du? Ist dir denn aufgefallen, dass ich z.B. kein Array benutze, und der Hintergrund trotzdem erhalten bleibt, wenn man drüber läuft, wie beim Startsymbol "S"? Dass das Laden der Leveldatei unabhängig von der Grösse funktioniert und die Steuerung über die Pfeiltasten - wie ich finde - weniger umständlich ist, als die, die du bisher hattest?
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.03.2008, 21:28 Titel: |
|
|
RatsDevSoftware hat Folgendes geschrieben: | kauf dir ne seniorentastatur, die die üblichen funktionen gleich mit auf den tasten hat grmll... |
hattest du nicht mal was von einem neuanfang ohne sinnlose postings gesagt...? Ô_ò _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 02.03.2008, 08:52 Titel: |
|
|
Skilltronic hat Folgendes geschrieben: | Nur mal so aus Interesse - wie meinst du das? Mein Beispiel, also sowohl das Laden als auch die Steuerung, funktioniert doch ganz anders als die vorigen. Wie kann dir das zeigen, dass du ein paar Zeilen ausgelassen hast und welche Zeilen meinst du? |
Da hab ich mich vll. bisschen falsch ausgedrückt.
Ich meinte, dass ich viele Teile des Codes anders hatte und ab dem CLOSE #1 viel flasch... _________________ MfG
Seb |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 03.03.2008, 18:21 Titel: |
|
|
Ich möchte jetzt noch machen, dass man Punkt(oder was auch immer) einsammeln muss, um ins Ziel zu kommen.
Hab mal probiert:
Zitat: | Zitat: | P% = <hier Anzahl der "P"s, die in der jeweiligen Leveldatei vorhanden sind>
OPEN% = 0 |
Zitat: | IF byte = CHR$(13) THEN
zeile = zeile + 1
spalte = 1
zeichen = zeichen + 1
ELSE
SELECT CASE byte
CASE "P"
COLOR 15
P% = P% - 1
IF P% = 0 THEN OPEN% = 1
CASE "*"
byte = CHR$(219)
COLOR 14, 0
CASE "S"
zmerk = zeile
smerk = spalte
merk = ASC(byte)
fmerk = 12
byte = CHR$(1)
COLOR 13, 0
CASE "Z"
byte = "X"
COLOR 12, 0
END SELECT |
Zitat: | LOOP UNTIL merk = ASC("X") AND OPEN% = 1 |
|
Wie kann das Programm "zählen", wie viele "P"s da in der jeweiligen Leveldatei sind?
Das mit den "P" einsammeln weiß ich jetzt nicht mehr weiter...
Kann mir jemand helfen? _________________ MfG
Seb |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4709 Wohnort: ~/
|
Verfasst am: 03.03.2008, 21:38 Titel: |
|
|
Das Zählen der Punkte kannst du machen, wenn du das Level am Anfang zeichnest. Allerdings werde ich aus dem geposteten Codeabschnitt nicht schlau - was passiert denn an dieser Stelle? Mir kommt es so vor, als ob dieser Abschnitt für das anfängliche Zeichnen zuständig ist, dann scheint mir aber der rot markierte Abschnitt nicht reinzupassen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 03.03.2008, 23:40 Titel: |
|
|
Ich sehe bereits, Dein kleines Spieleprojekt nähert sich meinem Zelda... :-)
Sonst zum Vorgehen: Soweit hast Du dies bereits korrekt erkannt mit dem zusätzlichen CASE-Abschnitt. Das Ganze aber schaut grob wie folgt aus.
1.) Leveldatei: Wir definieren ein Symbol, z.B. grosses "P" für Perle oder Punktelement (reiner Analyse & Design-Schritt)
2.) Beim Einlesen der Leveldatei: Zu Beginn unmittelbar vor dem OPEN definierst Du z.B.
Code: | restlichePerlen% = 0 |
und zählst diese bei jedem Vorkommen eines "P"s hoch, so dass nach dem CLOSE das Spiel "weiss", wieviele Juwelen einzusammeln sind.
3.) Spiel selber: Perlenfeld muss von Wand und Leerraum abweichender Code in Level%() bzw. SCREEN-Bildschirmspeicher besitzen, aber von der Bewegung her wie Leerfeld, z.B. zugelassen werden. Dabei aber Feld auf Perle prüfen, falls ja, Einsammelsound abspielen, restlichePerlen% um 1 erniedrigen + Level% an dieser Stelle mit Wert für Leerfeld füllen. Je nach Geschmack lässt Du beim Einsammeln der letzten Perle noch einen "Jetzt nur noch Ziel!"-Sound ertönen + je nach Geschmack das Zielfeld blinken (dies war z.B. beim Klassiker Boulder Dash auf dem Commodore 64 so).
4.) Ziel selber: Da gibt es zwei Varianten, wenn der Spieler noch nicht alle Perlen eingesammelt hat:
a) Du behandelst die Zielfelder wie Leerraum, d.h. man kann hineinlaufen, aber es bewirkt noch nichts. Evtl. Fehler "Noch nicht alles eingesammelt!" o.ä. erscheinen lassen
b) Du behandelst die Zielfelder wie Wand, d.h. man kann noch nicht hineinlaufen, solange man noch nicht alles hat
(Ob a oder b ist reine Geschmackssache von Dir)
Falls für Dich zum Umsetzen dies alles ein wenig kompliziert tönt, kann ich Dir sonst gerne mein LABSPIEL.BAS-Beispiel passend erweitern. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Seb

Anmeldungsdatum: 29.11.2006 Beiträge: 120 Wohnort: Henfenfeld
|
Verfasst am: 04.03.2008, 19:24 Titel: |
|
|
Also im groben hab ichs so verstanden...
(nur das Umsetzen nicht)
dreael hat Folgendes geschrieben: | Falls für Dich zum Umsetzen dies alles ein wenig kompliziert tönt, kann ich Dir sonst gerne mein LABSPIEL.BAS-Beispiel passend erweitern. |
Ja, gerne, falls es geht. _________________ MfG
Seb |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 05.03.2008, 13:41 Titel: |
|
|
Hallo
Ich habe das Laden der Leveldatei mal durch einen "Levelgenerator" ersetzt, der Labyrinthe nach dem Zufallsprinzip erzeugt.
http://www.skilltronics.de/runterlader/klspiel.rar
So etwas wie Spielspaß käme aber wohl erst dann auf, wenn man immer nur einen begrenzten Bereich rund um die Spielfigur sehen würde oder man durch ein Spielfeld scrollen könnte, das größer ist, als der Bildschirm.
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
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.
|
|