 |
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 |
CaPGeti
Anmeldungsdatum: 14.01.2008 Beiträge: 17
|
Verfasst am: 03.02.2008, 23:02 Titel: 2-Dimensionales Datenfeld in einer Schleife Lesen?? |
|
|
Hallo... Ich progge greade ein RPG in QB... Naja, und ich habe gelernt wie man PUT und GET verwendet.... Also hab ich für meine MAP DATA benutzt und so die entsprechende Map erzeugt.
Wenn ich jetzt in meiner Hauptschleife, wo ich meinen Char steuern kann, zwei FOR schleifen deklariere (x,y) und Versuche das Datenfeld mit Read zu lesen, kommt die Fehlermeldung "Außerhalb von DATA". Was hab ich falsch gemacht??
Wenn ich aber außerhalb der Schleife (am anfang) meinen Char 2d einlese, mit read, und dann mit GET speichere, dann kommt nicht die Fehlermeldung..
Weis jemand warum?? Es liegt bei der Map ganz sicher an der Do schleife, aber warum??
Danke im Voraus... |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 03.02.2008, 23:25 Titel: |
|
|
Hi,
ich könnte jetzt ellenlange Vermutungen anstellen, über das was alles schiefgelaufen sein könnte..
..mich in stundenlange Betrachtungen über Programmierstil verlieren..
..(nebenbei darauf hinweisen, daß FreeBASIC sowieso besser ist)
..etc, pp, usw.
Wenn du aber Fregen zu deinem Quälcode hast..
Warum postest du ihn nicht ganz einfach?
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
CaPGeti
Anmeldungsdatum: 14.01.2008 Beiträge: 17
|
Verfasst am: 03.02.2008, 23:45 Titel: |
|
|
*GRINS* naja würd ich ja gern, aber... naja in meiner Akademie lernt man zwar Codingstyle, aber privat, wenn ich selber progge, mach ich das ni.. aber ich versuchs mal schnell zu ändern...trotzdem viel spass...
Code: | 'Autor: Michael Wolter
'Datum: 29.01.08
'Datei: Spiel9.bas
'ToDo: Einlesen der Map in der Hauptschleife --> 'Fehlerbeheben
SCREEN 7
DIM map(5, 5)
DIM pl1(10 * 6)
DIM npc(10 * 6)
FOR y = 1 TO 10
FOR x = 1 TO 6
READ pl1
PSET (x, y), pl1
NEXT
NEXT
GET (1, 1)-(6, 10), npc
CLS 'NPC gespeichert
FOR y = 1 TO 10
FOR x = 1 TO 6
READ pl1
PSET (x, y), pl1
NEXT
NEXT
GET (1, 1)-(6, 10), pl1
CLS ' Spieler1 gespeichert
5 CLS
SCREEN 7, , 0, 1
DO
FOR y = 1 TO 99 STEP 10
FOR x = 1 TO 99 STEP 10
READ map
IF map = 2 THEN PUT (x, y), npc
NEXT
NEXT
PUT (b, a), pl1
ta$ = INKEY$
IF ta$ = "w" THEN a = a - 1
IF ta$ = "s" THEN a = a + 1
IF ta$ = "a" THEN b = b - 1
IF ta$ = "d" THEN b = b + 1
PCOPY 0, 1
CLS
LOOP UNTIL ta$ = CHR$(27)
npc:
DATA ,10,10,10,10,
DATA 10,4,10,10,4,10
DATA ,10,10,10,10,
DATA ,,10,10,,
DATA ,10,3,3,10,
DATA ,10,7,7,10,
DATA ,10,8,8,10,
DATA ,6,0,0,6,
DATA ,6,0,0,6,
DATA ,6,0,0,6,
pl1:
DATA ,10,10,10,10,
DATA 10,4,10,10,4,10
DATA ,10,10,10,10,
DATA ,,10,10,,
DATA ,10,8,8,10,
DATA ,10,8,7,10,
DATA ,10,8,8,10,
DATA ,1,0,0,1,
DATA ,1,0,0,1,
DATA ,5,0,0,5,
map:
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,2,2,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,2,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
|
|
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 04.02.2008, 00:17 Titel: |
|
|
Auf die Schnelle kann ich erstmal sagen, daß es
gibt
und auchDas würde bedeuten, daß eine Variable und ein Label einen identischen Namen haben, so geht's natürlich nicht
Wenn doch, wäre es ein Argument gegen KuhBASIC..  _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
CaPGeti
Anmeldungsdatum: 14.01.2008 Beiträge: 17
|
Verfasst am: 04.02.2008, 00:33 Titel: |
|
|
ja stimmt.... aber deswegen funzt es auch nicht....
Ich hatte auch versucht vorher die npc's in ein array zu speicher, welches ich in der hauptschleife nur auslese, da wird aber nur der 1. npc angezeigt und nicht alle drei....komsich, obwohl 3 werte in Array gespeichert werden.
edit: Ich hab mal die "Kartenlesung" vor der Mainschleife gesetzt und den Wertebereich von x und y geändert, sowie DB weggelassen...
VORHER: Code: |
FOR y = 1 TO 99 STEP 10
FOR x = 1 TO 99 STEP 10
READ map
IF map = 2 THEN PUT (x, y), npc
NEXT
NEXT |
Nachher: Code: |
FOR y = 1 TO 10
FOR x = 1 TO 10
READ map
IF map = 2 THEN PUT (x*10, y*10), npc
NEXT
NEXT |
NUnja, jetzt zeigt es zwar die drei npc's an aber wenn ich den Block wieder in die schleife setzte kommt wieder "Außerhalb von DATA"... Das ist irgentwie doof, weis einer warum??[/quote] |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 04.02.2008, 00:50 Titel: |
|
|
Vergleich mal deinen Code mit meinem und versuche, herauszufinden, wieso meiner durchläuft.. Code: | 'Autor: Michael Wolter
'Datum: 29.01.08
'Datei: Spiel9.bas
'ToDo: Einlesen der Map in der Hauptschleife --> 'Fehlerbeheben
SCREEN 7
DIM map(5, 5)
DIM pl1(10 , 6)
DIM npc(10 , 6)
FOR y = 1 TO 10
FOR x = 1 TO 6
READ Pl1(y,x)
PSET (x, y), Pl1(y,x)
NEXT
NEXT
GET (1, 1)-(6, 10), npc
CLS 'NPC gespeichert
FOR y = 1 TO 10
FOR x = 1 TO 6
READ Pl1(y,x)
PSET (x, y), Pl1(y,x)
NEXT
NEXT
GET (1, 1)-(6, 10), pl1
CLS ' Spieler1 gespeichert
5 CLS
SCREEN 7, , 0, 1
DO
FOR y = 1 TO 99 STEP 10
FOR x = 1 TO 99 STEP 10
READ Map(y,x)
IF map(y,x) = 2 THEN PUT (x, y), npc
NEXT
NEXT
PUT (b, a), pl1
ta$ = INKEY$
IF ta$ = "w" THEN a = a - 1
IF ta$ = "s" THEN a = a + 1
IF ta$ = "a" THEN b = b - 1
IF ta$ = "d" THEN b = b + 1
PCOPY 0, 1
CLS
LOOP UNTIL ta$ = CHR$(27)
ynpc:
DATA ,10,10,10,10,
DATA 10,4,10,10,4,10
DATA ,10,10,10,10,
DATA ,,10,10,,
DATA ,10,3,3,10,
DATA ,10,7,7,10,
DATA ,10,8,8,10,
DATA ,6,0,0,6,
DATA ,6,0,0,6,
DATA ,6,0,0,6,
ypl1:
DATA ,10,10,10,10,
DATA 10,4,10,10,4,10
DATA ,10,10,10,10,
DATA ,,10,10,,
DATA ,10,8,8,10,
DATA ,10,8,7,10,
DATA ,10,8,8,10,
DATA ,1,0,0,1,
DATA ,1,0,0,1,
DATA ,5,0,0,5,
ymap:
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,2,2,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,2,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 |
_________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
CaPGeti
Anmeldungsdatum: 14.01.2008 Beiträge: 17
|
Verfasst am: 04.02.2008, 01:15 Titel: |
|
|
Also ich weis ja ni ob du ihn getestet hast, aber bei mir kommt bei map(y,x) Index außerhalb des Bereiches... naja map(y,x) ist bestimmt die dimension in welcher es gelesen werden soll,bzw das es überhaupt erstmal so gelesen werden soll, aber wie gesagt, bei mir funzt das nicht...Hast du das prog irgentwie anders gestartet oder nur mit QB4.5?? |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 04.02.2008, 01:38 Titel: |
|
|
Code: | DIM map(5, 5)
..
FOR y = 1 TO 99 STEP 10
FOR x = 1 TO 99 STEP 10
READ Map(y,x)
IF map(y,x) = 2 THEN PUT (x, y), npc
NEXT
NEXT
..
ymap:
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,2,2,0,0,0,1
DATA 1,0,0,0,0,0,0,0,0,1
DATA 1,0,0,0,0,0,0,2,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 | Du meinst, ob mir aufgefallen ist, daß die Dimensionierung von Map(5, 5) nicht zu der Schleifensteuerung paßt?
fbc -lang qb hat nicht gemeckert, aber es war nur Schrott zu sehen..
Ich denke, daß die Schleife mehr Elemente einliest, als ins Array hineinpassen, ist ein elementarer Fehler vom ProgrammAutor,
du solltest ihn mal kontaktieren..
Ggfs. Think.Exe bemühen..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
CaPGeti
Anmeldungsdatum: 14.01.2008 Beiträge: 17
|
Verfasst am: 04.02.2008, 02:24 Titel: |
|
|
naja... da muss ich wohl meine alte variante nehmen und die map von einer externen datei hohlen... trotzdem danke wegen den namen und der 10, 6 statt 10 * 10 wie ich
edit:
Warum hast du die Sprungmarke ymap genannt und dann mit Map gelesen?? Muss das nicht der gleiche bezeichner sein? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 04.02.2008, 02:54 Titel: |
|
|
Die Marken finden nur Einsatz, wenn du z. B. den Datenzeiger mit RESTORE darauf setzt. So, wie das Programm im Augenblich aussieht, braucht du die Marken überhaupt nicht. Ist also auch egal, wie sie heißen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
CaPGeti
Anmeldungsdatum: 14.01.2008 Beiträge: 17
|
Verfasst am: 04.02.2008, 03:17 Titel: |
|
|
Aber woher weis das Programm das es zum beispiel npc statt pl1 liest?? der wertebereich ist do der selbe??
PS... Gibt es eine Möglichkeit mehr als 16 farben in screen 7 darzustellen oder gibt es eine möglichkeit DoubleBuffering in screen 13 zu verwenden? ich beforzuge aber ersteres |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 04.02.2008, 03:31 Titel: |
|
|
READ beginnt in der ersten DATA-Zeile zu lesen und liest dann immer Eintrag für Eintrag weiter, bis keine Einträge mehr da sind (das gibt dann eine Fehlermeldung). Willst du nicht den nächsten Eintrag lesen, sondern einen an anderer Stelle, dann kannst du dafür RESTORE marke verwenden.
Laut Referenz gehen unter SCREEN 7 nur 16 Farben (Standardpalette). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
CaPGeti
Anmeldungsdatum: 14.01.2008 Beiträge: 17
|
Verfasst am: 04.02.2008, 03:48 Titel: |
|
|
Cool... dank restore kann ich auch in einer Schleife lesen... einfach in ne sub gepackt und ich erspare mir schreibarbeit:)) Danke...
Schade das sowas nicht in C geht:( |
|
Nach oben |
|
 |
*Andy*
Anmeldungsdatum: 15.12.2007 Beiträge: 9
|
Verfasst am: 04.02.2008, 12:14 Titel: |
|
|
Hallo,
der Fehler ist das deine FOR - Schleife von x 1 - 99 und y 1 - 99 in 10 Schritten Zählt deine Map aber nur 10 * 10 gross ist und nicht 100 * 100.
Versuchs mal so,
Code: |
Restore YMap
FOR y = 1 TO 99 STEP 10
FOR x = 1 TO 99 STEP 10
READ Map(y / 10,x / 10)
IF map(y / 10,x / 10) = 2 THEN PUT (x, y), npc
NEXT
NEXT
|
müsste gehen. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 04.02.2008, 14:47 Titel: |
|
|
CaPGeti hat Folgendes geschrieben: | PS... Gibt es eine Möglichkeit mehr als 16 farben in screen 7 darzustellen oder gibt es eine möglichkeit DoubleBuffering in screen 13 zu verwenden? ich beforzuge aber ersteres |
Es gibt mehrere Libs für den SCREEN 13, die so etwas unterstützen, aber die sind meist recht kompliziert oder laufen nur unter bestimmten Bediungen (z.B. EMS aktiviert, was unter Windows XP standardmäßig nicht der Fall ist). Du kannst dir allerdings mal FreeBASIC anschauen, welches QBasic ziemlic ähnlich ist und so etwa von Haus aus unterstützt, auch bei höhren auflösungen und mit mehr farben  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 04.02.2008, 15:30 Titel: |
|
|
@CaPGeti:
Naja, in C könntest du dir ein char-Array schnappen und gleich bei der Deklaration initialisieren, also die Map reinpacken. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 04.02.2008, 15:51 Titel: |
|
|
Ähnliches Projekt von mir aus der Vergangenheit (auch QB und sogar mit SCREEN 7):
http://beilagen.dreael.ch/QB/SOKOBAN.ZIP
d.h. ist ein kleines Sokoban-Spiel mit ebenfalls Tile-Grafik.
@CaPGeti: Ich würde Dir übrigens ebenfalls die Verwendung von Dateien empfehlen, also Deine kleinen Grafiken alle als .BMPs in einem Malprogramm gestalten und ebenso die Levels selber in Dateien unterbringen.
Zu Deinem Titelproblem übrigens: Die Sache mit zweidimensionalen Arrays ist die, dass man speichertechnisch wissen muss, dass der erste Index die niederwertigen Speicherschritte macht und somit die Elemente zusammenhängend im RAM liegen und der zweite die grossen Sprünge macht, was man mit
Code: | DIM a%(10, 10)
PRINT VARPTR(a%(0, 0))
PRINT VARPTR(a%(1, 0))
PRINT VARPTR(a%(0, 1)) |
sehr leicht selber nachvollziehen kann. => Folglich also
Code: | DIM tiles%(Speicherbedarf%,anzahlTiles%)
GET (x%, y%)-STEP(groesseXMinus1%, GroesseYMinus1%), tiles%(0, BildNr%)
PUT (x%, y%), tiles%(0, BildNr%), PSET |
in Deiner Anwendung verwenden.
Weiteres Anwendungsbeispiel:
http://forum.qbasic.at/viewtopic.php?t=4812
d.h. dort lade ich die Bilder auch als ein grosser .BMP-"Bastelbogen" und "schneide" die Bilder "aus"... _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
CaPGeti
Anmeldungsdatum: 14.01.2008 Beiträge: 17
|
Verfasst am: 04.02.2008, 21:54 Titel: |
|
|
@*Andy*
Ja ich weis, das ist mir auch aufgfallen ich hab aber die schleifen einfach von 1 bis 10 laufen und dann bei PUT (x * 10, y * 10), npc es so gemacht...
@Jojo
Ich kanns leider nicht downloade, wegen den lahmen I-net hier, halt aus einen bestimmten grund, werd es aber in schule loaden....Ist der Syntax sehr anders?? wie ZUm Beispiel bei meinen Beispiel??
@Mao
Ja das würde gehen, aber ich mein eigentlich die Grafik=( naja opengl vieleicht. Ach ne...ich bleib erstmal bei qb, bzw fb...C/C++ lern ich erst...
@dreael
Naja das mit den bmp loader hab ich schon gesehen, aber da ist das Problem wieder mit der Palette in screen 7... muss ich wohl doch scr13 oder fb nehmen. Das was du dann noch geschrieben hast, hab ich aber nicht verstanden |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 04.02.2008, 22:57 Titel: |
|
|
Zitat: | Ist der Syntax sehr anders?? wie ZUm Beispiel bei meinen Beispiel?? |
Die Syntax ist sogar sehr ähnlich. Du musst allerdings alle verwendeten Variablen bezeichnen, also z. B.
Code: | DIM map(5, 5) AS INTEGER |
(ohne Garantie, dass INTEGER der richtige Datentyp ist), außerdem brauchst du das DIM auch für x, y, ta usw.
Code: | DIM x AS INTEGER, y AS INTEGER, ta AS STRING |
Suffixe bei Variablen sind nicht mehr möglich, also heißt die Variable ta statt ta$.
Das ist soweit alles, was mir in Bezug auf dein Programm auf die Schnelle einfällt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
CaPGeti
Anmeldungsdatum: 14.01.2008 Beiträge: 17
|
Verfasst am: 04.02.2008, 23:21 Titel: |
|
|
naja gut...ist ja kein großer unterschied...
Ich hab ne ganzganz tolle Seite mit diesem Tutorial gefunden...*grins*
naja war ja nich schwer zu finden....
Aber wenn ich ein spiel wie "dark woods" oder "warrior" nur in Grafik machen will brauch ich das verdammte doublebuffering für scr13, denn nur ein "Schwarzes Feld" hintereinen herlaufen zu lassen (hat das auch ein namen?) ist nicht toll, wenn dann ich echtzeit 7 chars rumrennen.
na mal suchen...
edit: verdammt...ich hatte irgentwo mal was gesehen, auf jeden fall hatten die da einen buffer dafür verwendet.... kennt zufällig jemand was ich meine, oder das was ich suche? |
|
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.
|
|