Werte aus einer Textdatei in ein Array schreiben

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Gray Fox

Betreff: Werte aus einer Textdatei in ein Array schreiben

BeitragSa, Aug 12, 2006 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bastel grad an einem Kartenspiel im Stile von Magic (im WIP vorgestellt) und nun möchte ich, dass alle Kartenwerte, wie z.B. Name, Stärke, Kosten, BonusID,Grafikpfad aus einer Textdatei gelesen und in ein Array geschrieben werden soll.
Damit soll es möglich sein, neue Karten ohne Programmierarbeit einbinden zu können.

Mein Testcode sieht so aus:

Code: [AUSKLAPPEN]
Graphics 800,600,16,2

Global stelle = 0

Global name$
Global staerke
Global verteitigung
Global kosten
Global bonusid
Global leerstelle
Global grafik$

Dim kartenfeld(10,10,10,10,10,10)

Repeat

If KeyHit(59) Then

datei =ReadFile("cards.txt")
While Not Eof(datei)

name$ = ReadLine(datei)

kartenfeld(stelle,0,0,0,0,0) = name$

staerke = ReadLine$(datei)

kartenfeld(0,stelle,0,0,0,0) = staerke

verteitigung = ReadLine$(datei)

kartenfeld(0,0,stelle,0,0,0) = verteitigung

kosten = ReadLine$(datei)

kartenfeld(0,0,0,stelle,0,0) = kosten

bonusid = ReadLine$(datei)

kartenfeld(0,0,0,0,stelle,0) = bonusid

grafik$ = ReadLine$(datei)

kartenfeld(0,0,0,0,0,stelle) = grafik$

stelle = stelle + 1

CloseFile(datei)
Wend

For i = 0 To 9

Text 100,100, kartenfeld(i,0,0,0,0,0)
Text 100,125, kartenfeld(0,i,0,0,0,0)
Text 100,150, kartenfeld(0,0,i,0,0,0)
Text 100,175, kartenfeld(0,0,0,i,0,0)
Text 100,200, kartenfeld(0,0,0,0,i,0)
Text 100,125, kartenfeld(0,0,0,0,0,i)
Next
End If

Until KeyHit(1)


Es werden aber nur 0er angezeigt Confused

Jemand nen Tip oder Verbesserungsvorschlag? Smile

Inhalt der Textdatei "cards.txt":

Zombie
1
2
1
0
grafiken\karte_zombie.png

Kabelbinder

Sieger des WM-Contest 2006

BeitragSa, Aug 12, 2006 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Also so wie ich es verstehe, wird die Karte geladen, wenn f1 gedrückt wird. Bei zweimal drücken müsste man aber eigentlich sofort "Array index out of bounds" kriegen, weil stelle ja nicht zurückgesetzt wird.

Noch ein paar Dinge, die mir aufgefallen sind:

-Du kannst keine Zeichenkette (name$/grafik$) in einen Array laden, der als Integer angelegt wurde.
-Die Datei ist du sechs Zeilen lang. Deshalb dürften eigentlich immer nur der erste eintrag jeder Dimension ausgefüllt werden.
Nacher bei der Ausgabe lässt du jedoch alle Einträge ausgeben. Das kannzu Überlagerung kommen, wenn du nacher alle Einträge ausliest (Ist aber nicht so schlimm Smile ).
-Closefile kommt erst hinter Wend
-Und der Grund, warum nur Nullen ausgegeben werden könnte sein:
Du setzt die Einträge
kartenfeld(stelle,0,0,0,0,0)
kartenfeld(0,stelle,0,0,0,0)
kartenfeld(0,0,stelle,0,0,0)
kartenfeld(0,0,0,stelle,0,0)
kartenfeld(0,0,0,0,stelle,0)
und
kartenfeld(0,0,0,0,0,stelle)

da stelle 0 bleibt, wird immer der selbe Eintrag (die selbe Variable) verändert. Immer der Eintrag kartenfeld(0,0,0,0,0,0)

Die sind nachher alle auf dem letzten eintrag (0)[/code]
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

garret

BeitragSa, Aug 12, 2006 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Für die Karten empfiehlt sich Type mehr als Dim:

Code: [AUSKLAPPEN]

Type karte
  Field name$, angriff%, verteidigung%(, etc.)
End Type



Mit

Code: [AUSKLAPPEN]

Dim kartenfeld(10,10,10,10,10,10)

erstellst du übrigens ein 11*11*11*11*11*11 (Null-Variable mitgezählt) = 11 hoch 6 = 1771561 Einträge großes Feld! Felder mit mehr als 3 Dimensionen sollte man nicht benutzen, deswegen lieber Types nehmen, das ist kompakter und dynamisch.


Und zu deinem Problem mit dem Auslesen: Umklammere das Readline() mit Int(), dadurch wird das Eingelesene in eine Ganzzahl umgewandelt. Oder nimm einfach ReadInt(). Wenn du mit Types arbeitest, sieht das dann so aus:

Code: [AUSKLAPPEN]

Type karte
  Field name$, angriff%, verteidigung%
End Type

k.karte = New karte
k\name$ = ReadLine(datei$)
k\angriff = Int(ReadLine(datei$))
k\verteidigung% = Int(ReadLine(datei$))


MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)
 

Gray Fox

BeitragSa, Aug 12, 2006 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke werde es mal ausprobieren, hatte bis jetzt noch nicht viel mit Types zu tun?

Wie schätzt ihr den Anspruch ein? Ist der Umgang schwer?

garret

BeitragSa, Aug 12, 2006 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man sie einmal verstanden hat, ist es kinderleicht sie zu benutzen. Man sollte jedoch trotzdem prüfen, was je nach Situation besser ist, Types oder Felder/Banks. Types sind gut bei sich ändernden Anzahlen von Einträgen und um verschiedene Datentypen zusammenzufassen. Dims und Banks sind zwar statisch aber etwas schneller (besonders bei hohen Anzahlen an Einträgen).

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Schranz0r

BeitragSo, Aug 13, 2006 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso types, Dim funktioniert doch auch gut ^^

ich schick dir mal was, was ich grad gemacht hab.

MOM
 

Gray Fox

BeitragSo, Aug 13, 2006 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir oder ihm? ^^

Schranz0r

BeitragSo, Aug 13, 2006 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Dir ^^

Das zeigt, wie man aus einer Datei *.dat einen level laden kann.

https://www.blitzforum.de/upload/file.php?id=359
 

Gray Fox

BeitragSo, Aug 13, 2006 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Schranz0r hat Folgendes geschrieben:
Dir ^^

Das zeigt, wie man aus einer Datei *.dat einen level laden kann.

https://www.blitzforum.de/upload/file.php?id=359


Danke Smile, aber so was ähnliches hatte ich auch, aber das Problem ist, wie mache ich am einfachstens aus einem String einen Integer um ihn in einem Array speichern zu können ^^

Schranz0r

BeitragSo, Aug 13, 2006 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso willst das den machen?
 

Gray Fox

BeitragSo, Aug 13, 2006 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Schranz0r hat Folgendes geschrieben:
Wieso willst das den machen?


Damit ich meine Spielkarten besser verwalten kann. z.B. den Namen der Karte etc.

Schranz0r

BeitragSo, Aug 13, 2006 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
das machst mit dem teil was ich dir geposted hab, mit der map.dat
das reicht doch, oder nicht?

Die map.dat kannst du im texteditor öffen.

Was in der Datei was ist, steht ja in dem code Very Happy

Wenn du noch fragen hast, frag ruhig Wink

Code: [AUSKLAPPEN]

Apptitle "Dim map"
Graphics 640,480,0,2
Setbuffer Backbuffer()
frameTimer=CREATETIMER(15)

Global spieler = LoadImage("items\player.png")
Global tiles = LoadImage("items\blocks.png")
Global punkte
Const runter = 208, rauf = 200, rechts = 205, links = 203

;Level aus Datei lesen
Dim Level$(14,19)
leveldatei = ReadFile("map.dat")
 For Zeile=0 To 14
  A$ = ReadLine(leveldatei)
 For Spalte=0 To 19
  Level$(Zeile,Spalte) = Mid$(A$,Spalte+1,1)
 Next
Next

Repeat
WAITTIMER (frameTimer)

For Zeile=0 To 14
 For Spalte=0 To 19
  Select Level$(Zeile,Spalte)
  Case "S"
    DrawimageRect tiles, Spalte*32, Zeile*32, 32, 0, 32, 32
    DrawimageRect spieler, Spalte*32, Zeile*32, 0, 0, 32, 32
    SpielerS = Spalte
    SpielerZ = Zeile
   Case " "
    DrawimageRect tiles, Spalte*32, Zeile*32, 32, 0, 32, 32
   Case "1"
    DrawimageRect tiles, Spalte*32, Zeile*32, 0, 0, 32, 32
  End select
 next
next

If Keydown(runter) And ( Level$(SpielerZ+1,SpielerS) <> "1" ) Then
  Level$(SpielerZ, SpielerS) = " "
  SpielerZ = SpielerZ + 1
  Level$(SpielerZ, SpielerS) = "S"
Endif

If Keydown(rauf)   And ( Level$(SpielerZ-1,SpielerS) <> "1" ) Then
  Level$(SpielerZ, SpielerS) = " "
  SpielerZ = SpielerZ - 1
  Level$(SpielerZ, SpielerS) = "S"
Endif

If Keydown(rechts) And ( Level$(SpielerZ,SpielerS+1) <> "1" ) Then
  Level$(SpielerZ, SpielerS) = " "
  SpielerS = SpielerS + 1
  Level$(SpielerZ, SpielerS) = "S"
Endif

If Keydown(links) And ( Level$(SpielerZ,SpielerS-1) <> "1" ) Then
  Level$(SpielerZ, SpielerS) = " "
  SpielerS = SpielerS - 1
  Level$(SpielerZ, SpielerS) = "S"
Endif

Flip

Until Keyhit(1)




End


map.dat
Code: [AUSKLAPPEN]

11111111111111111111
1S                 1
1                  1
1                  1
1                  1
1                  1
1                  1
1                  1
1                  1
1                  1
1                  1
1                  1
1                  1
1                  1
11111111111111111111
  • Zuletzt bearbeitet von Schranz0r am So, Aug 13, 2006 17:40, insgesamt 2-mal bearbeitet
 

Gray Fox

BeitragSo, Aug 13, 2006 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kann aber keine Namen in ein Arrayfeld schreiben z.B.

Textdatei:

Zombie
1
2
1
grafiken\karte_zombie.png

verstehste was ich meine oder müssen da "" um den Text?

Schranz0r

BeitragSo, Aug 13, 2006 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh nicht wieso du das willst??


es reicht doch sich in den Code zu schreiben:

Code: [AUSKLAPPEN]


....
tiles = Loadimage("items.png") ; 1 = Stuhl, 2 = Gras, 3 = Baum
....


dann weist du doch auch was welche Zahl bedeudtet!!!
Wieso dann so umständlich??

Kartenspiele kannst so normal acuh machen, ist dann halt ne sache der programmierung selbst
  • Zuletzt bearbeitet von Schranz0r am So, Aug 13, 2006 17:48, insgesamt einmal bearbeitet
 

Gray Fox

BeitragSo, Aug 13, 2006 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Schranz0r hat Folgendes geschrieben:
Ich versteh nicht wieso du das willst??


es reicht doch sich in den Code zu schreiben:

Code: [AUSKLAPPEN]


....
tiles = Loadimage("items.png") ; 1 = Stuhl, 2 = Gras, 3 = Baum
....


dann weist du doch auch was welche Zahl bedeudtet!!!
Wieso dann so umständlich??


Ich glaube ich sollte dir erklären, dass ich keine Tilemaps sondern, Spielkarten im Sinne von Magic - The Gathering meine Wink

Schranz0r

BeitragSo, Aug 13, 2006 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Gray Fox hat Folgendes geschrieben:
Schranz0r hat Folgendes geschrieben:
Ich versteh nicht wieso du das willst??


es reicht doch sich in den Code zu schreiben:

Code: [AUSKLAPPEN]


....
tiles = Loadimage("items.png") ; 1 = Stuhl, 2 = Gras, 3 = Baum
....


dann weist du doch auch was welche Zahl bedeudtet!!!
Wieso dann so umständlich??


Ich glaube ich sollte dir erklären, dass ich keine Tilemaps sondern, Spielkarten im Sinne von Magic - The Gathering meine Wink


Jo habs grad nochmal gelesen OMG wie peinlich ^^

Also du willst an einer bestimmten stelle einen Wert haben.
z.B HP = 250 usw

und das soll aus der txt gelesen werden, richtig?

hmm ich schau mal ob ich was machen kann Very Happy


EDIT:

Ist es nicht besser immer eine bb zu includen?


    Ist relativ schreibgeschützt <<---HAHA LOL aber wer die endung nicht kennt ^^
    kannst du auch dazu schnell machen, quasi als update
 

Gray Fox

BeitragSo, Aug 13, 2006 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Was hat das unter dem Edit zu bedeuten (nicht das mit "include"?

Mein Problem neber dem Laden von Werten ist, dass ich in Arrays keine Strings speichern kann und ich haber Strings habe z.B. die Namen der "Spielkarten".

Schranz0r

BeitragSo, Aug 13, 2006 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt verstehst du mich nicht Very Happy

Du lädst informationen aus einer TXT richtig?

Versuchs mal mit :

"Zombie"
1
2
1
0
LoadImage("grafiken\karte_zombie.png")

evtl dann?
ist halt immer so ne sache mit den txt.
deshalb sag ich ja include doch einfach eine *.bb datei, dann gibts doch keine probleme, und du kannst auch super updates(in form von Karten) für
dein Spiel machen
 

Gray Fox

BeitragSo, Aug 13, 2006 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach das meinste mit include, die Sache is ja die, es war angedacht, dass "Externe" ohne Programmierkenntnisse, einfach neue Karten(sets) hinzufügen können und zwar mit der txt Wink

Schranz0r

BeitragSo, Aug 13, 2006 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
achsooo

hmmm... da schau ich morgen mal ob ich was machen kann.
hab da schon eine idee Very Happy

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group