---
# System prepended metadata

title: 'Labb 1: Filhantering - Character Creator'
tags: [inlämningsuppgift]

---

# Labb 1: Filhantering - Character Creator

I den här programmeringslabben ska vi öva på att både skriva och läsa till filer. Labben går ut på att bygga ett konsolbaserat program där man kan skapa enkla rollspelskaraktärer. Varje karaktär ska ha ett namn, en klass och tre attribut: strength, agility och intelligence. Karaktärerna ska sparas i en fil på datorn.

I labben får du ett skal till ett program där det finns 3 metoder du ska implementera:

* `ViewCharacters`
* `CreateCharacter`
* `DeleteCharacter`

Du rekomenderas att göra dem i den ordningen. Skalet får du tillgång till när du accepterar uppgiften i Github classroom och gör en klon till din egna dator. **Gör en commit till github i slutet av varje lektion.**

Hela programmet utgår från en fil som heter `characters.txt`. I skalet finns det en exempelfil att utgå ifrån som innehåller följande text:

```
Alice;Mage;4;2;9
Bob;Warrior;9;5;3
Charlie;Archer;5;9;4
```

Här finns alltså tre karaktärer. Första karaktären har namnet *Alice*, klassen *Mage* och attributen *STR: 4, AGI: 2, och INT: 9*. 

### Del 1 - ViewCharacters

Börja med att implementera metoden `ViewCharacters`. Den här metoden ska läsa filen utifrån argumentet `filePath` och skriva ut varje karaktär till konsolen. Utskriften ska vara formaterad på följande sätt:

#. Namn: ... Klass: ... STR: .. AGI: .. INT: ..

``` csharp
static void ViewCharacters(string filepath)
{
    
}
```

Kör vi programmet med exempelfilen ska vi alltså få följande output till konsolen:

```
--- Character Creator ---
1. View Characters
2. Create New Character
3. Delete Character
4. Exit
Choice: 1
1. Namn: Alice Klass: Mage STR: 4 AGI: 2 INT: 9
2. Namn: Bob Klass: Warrior STR: 9 AGI: 5 INT: 3
3. Namn: Charlie Klass: Archer STR: 5 AGI: 9 INT: 4
```

**Tips:**
* använd metoden `File.ReadAllLines` för att läsa in varje rad i text-filen.
* använd [sträng-metoden `Split`](https://https://www.geeksforgeeks.org/c-sharp/string-split-method-in-c-sharp-with-examples/) för att dela upp varje rad vid `;`

### Del 2 - CreateCharacter

Metoden `CreateCharacter` ska be användaren skriva in namn, klass och 3 siffror för attributen och sedan spara detta i korrekt format i filen. En körning av programmet kan till exempel se ut så här:

```
--- Character Creator ---
1. View Characters
2. Create New Character
3. Delete Character
4. Exit
Choice: 2
Skriv ett namn
Johan
Skriv en klass
Warrior
Skriv attributpoäng [0-20]
STR:
20
AGI:
15
INT:
10
```

Filen `characters.txt` borde efter det se ut så här:

```
Alice;Mage;4;2;9
Bob;Warrior;9;5;3
Charlie;Archer;5;9;4
Johan;Warrior;20;15;10
```

**Tips:**
* Tänk på att inte skriva över hela filen när du sparar din nya karaktär. Använd till exempel `File.AppendAllText` istället för `File.WriteAllText` 
* Tänk på att avsluta din nya rad med en så kallad *new line character* så att nästa gång en karaktär skapas görs det på en ny rad i filen. En sådan karaktär skriver man `\n`.

### Del 3 - DeleteCharacter

Metoden `DeleteCharacter` ska ta bort en karaktär från filen. Metoden ska först visa alla karaktärer som finns genom att anropa `ViewCharacters`, be användaren om en siffra för den karaktär som ska tas bort, och sedan ta bort karaktären.

En körning av programmet kan till exempel se ut så här:

```
--- Character Creator ---
1. View Characters
2. Create New Character
3. Delete Character
4. Exit
Choice: 3
1. Namn: Alice Klass: Mage STR: 4 AGI: 2 INT: 9
2. Namn: Bob Klass: Warrior STR: 9 AGI: 5 INT: 3
3. Namn: Charlie Klass: Archer STR: 5 AGI: 9 INT: 4
4. Namn: Johan Klass: Warrior STR: 20 AGI: 15 INT: 10
Skriv vilken karaktär du vill ska tas bort [1-4]
2
```

Filen `characters.txt` borde då innehålla alla karaktärer förutom Bob, och alltså se ut så här:

```
Alice;Mage;4;2;9
Charlie;Archer;5;9;4
Johan;Warrior;20;15;10
```

**Tips:**
* Läs in alla karaktärer och lägg dem i en lista. Du kan då använda [listmetoden `RemoveAt`](https://www.geeksforgeeks.org/c-sharp/c-sharp-how-to-remove-the-element-from-the-specified-index-of-the-list/) för att ta bort ett element på en specifik plats.
* Tänk på att list index börjar på noll, men att användaren skriver in en plats som börjar på 1.


### Utveckla programmet

När metoderna `ViewCharacters`, `CreateCharacter` och `DeleteCharacter` är implementerade finns det flera saker att utveckla.

* Lägg till validering för vad användaren skriver för klass till sin karaktär och låt användaren bara skriva in en av ett begränsat antal alternativ. (Till exempel *Warrior, Mage, Archer, Rogue, Priest*)
* Lägg till validering för attributpoängen som användaren skriver in och se till att användaren bara får skriva en siffra mellan 0 och 20.
* Lägg till en metod `EditCharacter` som låter användaren redigera en karaktär. Metoden ska visa alla karaktärer, be användaren om en siffra för vilken karaktär som ska redigeras och sedan låta användaren skriva namn, klass och attributpoäng. Om användaren lämnar ett av inputen tomt ska det gamla värdet behållas. Metoden ska sedan skriva över den gamla karaktären med den nya.