Permalänk
Medlem

Läsa array från fil?

Hej, jag håller på och skapar en väldigt simpel tile-engine i XNA (c#), nu är det så att jag har kört fast
jag har för tillfället en metod som genererar en ny "map" från ett multidimensionelt array jag har direkt i koden.
Jag skulle vilja kunna läsa denna typ av array från en textfil och som senare får representera "map"-en;
(FYI, varje siffra motsvarar en tile, och olika siffror motsvarar olika texturer)

Här är koden som just nu laddar en ny karta;
32 på slutet står för att tiles är 32x32
Tackar för hjälp!

EDIT: Skrymmande kod, så jag gömde den nedan.

map.Generate(new int[,]{ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {2,2,2,2,0,0,2,2,2,0,0,0,0,0,0,0,2,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,0,0,0,0,0,2,2,2,0,0,0,2,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3}, {1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3}, {1,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3}, {1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, }, 32);

Dold text
Visa signatur

2600k @ STOCK <|> GTX 970 Omega!<|> Nån samsung 500gb ssd <|> 16 GB Kingston Hyper X <|> BenQ XL2420t
"Det finns inget skrot, bara gamla delar som kan användas på nya sätt" - Mulle Meck

Permalänk
Inaktiv

Googla lite på att läsa från text-filer så kommer det nog snabbt lösa sig. Separera siffrorna med ett valfritt tecken i texten så är det enkelt att tolka den med.

Permalänk
Medlem
Skrivet av anon150287:

Googla lite på att läsa från text-filer så kommer det nog snabbt lösa sig. Separera siffrorna med ett valfritt tecken i texten så är det enkelt att tolka den med.

Jo, men jag har försökt med en streamReader, men kan inte riktigt förstå hur man "separerar" och sedan sparar det som ett array :/
Men fortsätter att leta..

Visa signatur

2600k @ STOCK <|> GTX 970 Omega!<|> Nån samsung 500gb ssd <|> 16 GB Kingston Hyper X <|> BenQ XL2420t
"Det finns inget skrot, bara gamla delar som kan användas på nya sätt" - Mulle Meck

Permalänk
Medlem
Skrivet av elklazor:

Jo, men jag har försökt med en streamReader, men kan inte riktigt förstå hur man "separerar" och sedan sparar det som ett array :/
Men fortsätter att leta..

Nu skulle det vara passande om jag visste var jag hade mina gamla uppgifter i programmering. Fanns en uppgift om hur man använde streamreader.

Det du skulle kunna göra är att du (antar att du skriver textfilen själv) är att skriva den som något liknande. "1", "1", "2", "3", "0" ... osv. Om du sedan använder streamreader för att spara hela textfilen i en sträng kan du med hjälp av subStr dela upp den mha en loop, hämta ut siffrorna och slänga in dem i din array. Om du kör på upp till 2-siffriga tal så får du väl skriva "01", "02" osv.

Permalänk

http://www.dotnetperls.com/split

bläddra ner till mitten typ, "text files".

Permalänk
Medlem
Skrivet av rarifag:

Nu skulle det vara passande om jag visste var jag hade mina gamla uppgifter i programmering. Fanns en uppgift om hur man använde streamreader.

Det du skulle kunna göra är att du (antar att du skriver textfilen själv) är att skriva den som något liknande. "1", "1", "2", "3", "0" ... osv. Om du sedan använder streamreader för att spara hela textfilen i en sträng kan du med hjälp av subStr dela upp den mha en loop, hämta ut siffrorna och slänga in dem i din array. Om du kör på upp till 2-siffriga tal så får du väl skriva "01", "02" osv.

Tackar, ska genast testa!

Visa signatur

2600k @ STOCK <|> GTX 970 Omega!<|> Nån samsung 500gb ssd <|> 16 GB Kingston Hyper X <|> BenQ XL2420t
"Det finns inget skrot, bara gamla delar som kan användas på nya sätt" - Mulle Meck

Permalänk
Medlem
Skrivet av banankontakt:

http://www.dotnetperls.com/split

bläddra ner till mitten typ, "text files".

Tack!

Visa signatur

2600k @ STOCK <|> GTX 970 Omega!<|> Nån samsung 500gb ssd <|> 16 GB Kingston Hyper X <|> BenQ XL2420t
"Det finns inget skrot, bara gamla delar som kan användas på nya sätt" - Mulle Meck

Permalänk
Medlem

Lägg upp textfilens information typ som nedan:

1, 2, 12, .... , 6; 5, 12, 1, .... , 9; 6, 3, 4, ... , 7;

Bara för visualiseringen. Använd inte enterslag i en textfil.

1, 2, 12, .... , 6;
5, 12, 1, .... , 9;
6, 3, 4, ... , 7;

Dold text

splitta text på varje ';' tecken och loopa varje splittad rad och splitta åter igen (den splittade raden) på varje ',' tecken.

Hint: Använd for-loopar

Visa signatur

Stationär: Fractal Design - R3 Artic | Asus Sabertooth P67 | Intel i7-2600K @ 4.20GHz | Samsung 500GB SSD | Corsair H100i | Corsair - Dominator Platinum 2x8GB @ 1600MHz | Asus GTX770 SLi

Server: Fractal Design - Node 304 | Asus P8Z77-I Deluxe M-ITX | Intel i5-3570K @ 3.40GHz | Corsair - H70 | Corsair - Vengeance 2x4GB @ 1600MHz

Permalänk
Medlem
Skrivet av HazXoD3D:

Lägg upp textfilens information typ som nedan:

1, 2, 12, .... , 6; 5, 12, 1, .... , 9; 6, 3, 4, ... , 7;

Bara för visualiseringen. Använd inte enterslag i en textfil.

1, 2, 12, .... , 6;
5, 12, 1, .... , 9;
6, 3, 4, ... , 7;

Dold text

splitta text på varje ';' tecken och loopa varje splittad rad och splitta åter igen (den splittade raden) på varje ',' tecken.

Hint: Använd for-loopar

Hmm.. Så varje ';' betyder ny rad. Men det jag inte förstår är hur jag : "Cannot implicitly convert type 'string[]' to 'int[*,*]"

Visa signatur

2600k @ STOCK <|> GTX 970 Omega!<|> Nån samsung 500gb ssd <|> 16 GB Kingston Hyper X <|> BenQ XL2420t
"Det finns inget skrot, bara gamla delar som kan användas på nya sätt" - Mulle Meck

Permalänk
Medlem
Skrivet av elklazor:

Hmm.. Så varje ';' betyder ny rad. Men det jag inte förstår är hur jag : "Cannot implicitly convert type 'string[]' to 'int[*,*]"

Du måste då konvertera din sträng till en int. Görs genom Convert.ToInt16(dinSträng), då får självklart endast siffror finnas i strängen.

Edit: Blev lite fel, fixade.

Permalänk
Medlem

Såhär skulle nog min approach vara.
Textfilen skrivs i detta format: 1,2,1,0

Sedan laddas hela textfilen in i en sträng.

Om antalet siffror är statiskt blir det lättare, skulle göra ngt liknande:

int[,] z = new int[32,32];
string textFil;
int x = 0;
int y = 0;
while (x < 32)
{
while (y < 32)
{
z[x, y] = Convert.ToInt16(textFil.Substring((x * 32 + y) * 2 + 1, 1));

y += 1;
}

x += 1;
}

Permalänk
Avstängd

Om det ska vara human readable använd xml, annars en binärfil

Visa signatur
Permalänk
Medlem
Skrivet av CyberVillain:

Om det ska vara human readable använd xml, annars en binärfil

Eller JSON.

Permalänk
Avstängd

Eller json

Visa signatur
Permalänk
Medlem
Skrivet av rarifag:

Såhär skulle nog min approach vara.
Textfilen skrivs i detta format: 1,2,1,0

Sedan laddas hela textfilen in i en sträng.

Om antalet siffror är statiskt blir det lättare, skulle göra ngt liknande:

int[,] z = new int[32,32];
string textFil;
int x = 0;
int y = 0;
while (x < 32)
{
while (y < 32)
{
z[x, y] = Convert.ToInt16(textFil.Substring((x * 32 + y) * 2 + 1, 1));

y += 1;
}

x += 1;
}

Något sådant jag tänkte mig

Visa signatur

2600k @ STOCK <|> GTX 970 Omega!<|> Nån samsung 500gb ssd <|> 16 GB Kingston Hyper X <|> BenQ XL2420t
"Det finns inget skrot, bara gamla delar som kan användas på nya sätt" - Mulle Meck

Permalänk
Medlem

Skulle rekommendera att du fixar någon simple map editor, och sedan spara informationen som .xml istället, (eller json om nu så vill )

Varför just dessa format? Tja till stor del på grund av jag tvivlar på att din spelmotor enbart kommer innehålla titles och inte mer information. T.ex. om det går att gå på denna tile, vilka tiles en AI spelare kan gå över o.s.v. Med hjälp av dessa format kan du bygga på med hur mycket information som helst.

Vist blir det ganska så svårt att editera dessa i notepad o.s.v för det blir svårt att veta exakt vart en tile är du får ingen precis snygg ascii art, men åt andra sidan tar det inte så lång tid att få ihop en simpel tile editor.

Annars för just att läsa in en komma separerad fil o.s.v. löser du med lite LINQ

T.ex.

string map = @1,2,3,4,5,6,7 2,5,6,7,8,9,10 2,4,5,6,1,5,6; var loadedMap = map.Split('\n').Select (x => x.Split(',').Select (y => int.Parse(y)));

Visa signatur

Speldator: i7-8700k, 32GB DDR4, RTX2080
Server 1: SB 2500k, MZI -P67GD55, 32GB DDR3, Corsair MX 240GB SSD
Surface Pro 2017, Konsoler: Typ alla, Oculus Rift

Permalänk
Medlem
Skrivet av MugiMugi:

Skulle rekommendera att du fixar någon simple map editor, och sedan spara informationen som .xml istället, (eller json om nu så vill )

Varför just dessa format? Tja till stor del på grund av jag tvivlar på att din spelmotor enbart kommer innehålla titles och inte mer information. T.ex. om det går att gå på denna tile, vilka tiles en AI spelare kan gå över o.s.v. Med hjälp av dessa format kan du bygga på med hur mycket information som helst.

Vist blir det ganska så svårt att editera dessa i notepad o.s.v för det blir svårt att veta exakt vart en tile är du får ingen precis snygg ascii art, men åt andra sidan tar det inte så lång tid att få ihop en simpel tile editor.

Sant...
http://www.mapeditor.org/
Finns en massa open source som läser och visar deras format också.

Permalänk
Medlem
Skrivet av elklazor:

Något sådant jag tänkte mig

Dock kommer den koden läsa in kolumnerna, inte raderna.