Holz,Nahrung,gold... in einer datei speicher

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

FWeinb

ehemals "ich"

Betreff: Holz,Nahrung,gold... in einer datei speicher

BeitragDi, Jun 20, 2006 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich möchte in einer Datei die Rohstoffe eines spielers speichern. In dem Spiel soll es möglich sein mehrere Speicherstände zu haben, wie ist das zu machen.




Danke für Antwort

skey-z

BeitragDi, Jun 20, 2006 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Onlinehilfe->Dateifunktionen(read.../write...)
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Artemis

BeitragDi, Jun 20, 2006 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
ql:ReadFile, ql:writefile, ql:openfile, ql:readbyte, ql:writebyte, ql:readstring, ql:writestring, ql:readint, ql:writeint, ql:readfloat, ql:writefloat, ql:readline, ql:writeline. Wink
 

FWeinb

ehemals "ich"

BeitragDi, Jun 20, 2006 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja die kenne ich aber ich habe ein proble ich weiß den spielernamen
und die rohstoffe ich speicher das ganze dann so:

SpielerName1000,1000,1000

Nun zu meinem poroblem ich lade mir mit Readline
die Ganze zeile herein und mit instr suche ich dann nach dem namen
wenn dieser Vorhanden ist soll der eintrag gelöschtwerden und mit dem neuen ersetzt werden und da ist mein problem das ersetzen wie soll ich das machen.
 

Dreamora

BeitragDi, Jun 20, 2006 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Indem du die ganze datei einlädst, die zeile änderst die du ändern möchtest (zb indem du alle Zeilen in einem Array speicherst) und dann die Datei wieder schreibst.

Du kannst nicht selektiv daten ersetzen, da B3D keinen sequentiellen Dateizugriff unterstützt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

skey-z

BeitragDi, Jun 20, 2006 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
nach dem laden das file wieder schließen, dann neu öffnen vor dem speichern und er beginnt am anfang und du kannst dieder rein schreiben.

sollte es irgendwo im file stehen, musst du mit seekfile die position angeben, an der er schreiben soll
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

Florian

BeitragDi, Jun 20, 2006 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:

Du kannst nicht selektiv daten ersetzen, da B3D keinen sequentiellen Dateizugriff unterstützt.


Du kennst dich ja mit sequentiellem Dateizugriff besonders gut so

Na wie heißt dieser Dateizugriffsart?
Code: [AUSKLAPPEN]

DateiNr=Readfile("Text.txt")
While not(eof(DateiNr))
 Zeile$=Readline$(DateiNr)
wend
CloseFile DateiNr


Hier wird Zeile für Zeile die Datei gelesen.
Beim sequentiellen zugriff werden die Datensätze fortlauft geschrieben oder gelesen.

MfG

Florian
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0
 

Dreamora

BeitragDi, Jun 20, 2006 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat keinen bestimmten Namen, zumindest kenne ich keinen.

Und ja, beim sequentiellen Datezugriff existieren in der Datei nur Blöcke fester länge (zb 1000 Byte), unabhängig davon, wieviele Daten wirklich in dem Block stehen. Dadurch kann man dynamisch Daten überschreiben ohne das es nachfolgende Daten überschreibt etc.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Hip Teen

BeitragDi, Jun 20, 2006 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Dadurch kann man dynamisch Daten überschreiben ohne das es nachfolgende Daten überschreibt etc.

Sowas geht doch in BB, oder?
Mit SeekFile an die Position, die man überschreiben will, und per Writebyte soviele Bytes überschreiben, wie man will. Wenn ich mich recht erinnere werden die nachfolgenden Bytes dadurch nicht beeinträchtigt.
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger"
 

Florian

BeitragDi, Jun 20, 2006 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Hat keinen bestimmten Namen, zumindest kenne ich keinen.

Und ja, beim sequentiellen Datezugriff existieren in der Datei nur Blöcke fester länge (zb 1000 Byte), unabhängig davon, wieviele Daten wirklich in dem Block stehen. Dadurch kann man dynamisch Daten überschreiben ohne das es nachfolgende Daten überschreibt etc.


Beim sequentiellen Dateizugriff können Blöcke eine unterschiedliche länge haben, deshalb kann man die Datensätze nur fortlaufend lesen ober schreiben.

Random-Dateien haben Datensätze gleicher Länge, deshalb kann man zu jeder Zeit auf einen beliebigen Datensatz zugreifen.

MfG

Florian
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0
 

Dreamora

BeitragMi, Jun 21, 2006 8:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Flo hat natürlich recht. Verwechslung meinerseits. Confused


Was das schreiben betrifft: Dachte Blitz hat einen Datenstream der Datei (darum auch Seek)? Sprich wenn man mitten drin ein Byte schreibt wird das Byte an der Stelle ersetzt und nicht der Stream erweitert an der Position.
Aber vielleicht nutze ich auch schon zu lange BM etc ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

x-pressive

BeitragMi, Jun 21, 2006 8:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum denn immer so kompliziert? Es reicht doch völlig, die ganze Datei einfach neu zu erstellen.

Und wenn du schon die alte Datei extra vorher einlesen möchtest, um sie zu ändern (was ja gar nicht nötig ist), würde es reichen, Zeile für Zeile in ein String-Array einzulesen. Dann loopt man eben durch das Array, findet die gewünschte Zeile, ersetzt diese und speichert das ganze Array wieder ab (alte Datei überschreiben). Ist doch kein Problem.

Um ganz gezielt Fragmente inerhalb eines Strings zu extrahieren, würde ich die gute alte Str_Explode benutzen:

Code: [AUSKLAPPEN]
;---------------------------------------------------
; EXTRACT SECTIONS OF A STRING
; SECTION = FRAGMENT TO RETURN (0 - ...) -1 FOR LAST
;---------------------------------------------------
Function Str_Explode$(txt$, divider$, section%)

   Local i%, char$, sec%, tmp$, sections%
   
   ; COUNT FRAGMENTS
   For i = 1 To Len(txt$)
      If Mid(txt$,i,1) = divider$ Then sections = sections + 1
   Next

   ; RETURN LAST FRAGMENT?
   If section = -1 Then section = sections
   For i% = 1 To Len(txt$)
      char$    = Mid(txt$,i,1)
      If char$ = divider$ Then sec = sec + 1 : i = i + 1 : char$ = Mid(txt$,i,1)
      If sec   = section  Then tmp$ = tmp$ + char$
   Next
   Return tmp$

End Function


Arrow Beispiel:

Code: [AUSKLAPPEN]
zeile$  = ReadLine(File) ; "Spielername|5004|400|3002"
name$   = Str_Explode(zeile$,"|",0)
gold$   = Str_Explode(zeile$,"|",1)
silber$ = Str_Explode(zeile$,"|",2)
erz$    = Str_Explode(zeile$,"|",3)


Arrow Allerdings sollten die Daten natürlich verschlüsselt sein, ansonsten wäre es ja eine Versuchung, der man einfach nicht wiederstehen kann.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL
 

FWeinb

ehemals "ich"

BeitragMi, Jun 21, 2006 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Funktion ist nicht schlecht aber ich weis nicht wie du das mit dem Dim Feld meinest wie soll ich jede zeile dort hienein speichern oder wass meist du damit



Ach ja danke für die vielen Antworten

x-pressive

BeitragMi, Jun 21, 2006 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Fangen wir doch mal so an: musst du unbedingt die alte Datei voher öffnen, einlesen, verändern und wieder abspeichern -oder reicht es nicht, einfach die Datei vom Spiel aus komplett neu zu schreiben? Im Normalfall genügt doch letzteres.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Toby

BeitragMi, Jun 21, 2006 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
x-pressive hat Folgendes geschrieben:
Fangen wir doch mal so an: musst du unbedingt die alte Datei voher öffnen, einlesen, verändern und wieder abspeichern -oder reicht es nicht, einfach die Datei vom Spiel aus komplett neu zu schreiben? Im Normalfall genügt doch letzteres.


Eben,
ich weiß zwar nicht, ob das jetzt hier passt.
Aber warum machst dus nicht einfach so:

Code: [AUSKLAPPEN]

datei=WriteFile("blabla.sav")
WriteString$(datei,spielername$)
WriteInt(datei,holz)
WriteInt(datei,nahrung)
WriteInt(datei,gold)
CloseFile datei


und auslesen mit:

Code: [AUSKLAPPEN]

datei=ReadFile("blabla.sav")
spielername$=ReadString$(datei)
holz=ReadInt(datei)
nahrung=ReadInt(datei)
gold=ReadInt(datei)
CloseFile datei
Member of
Terra Multimedia
 

FWeinb

ehemals "ich"

BeitragSa, Jun 24, 2006 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
habs hinbekommen
Danke x-pressiv

Für dise split engine

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group