160 lines
3.8 KiB
Markdown
160 lines
3.8 KiB
Markdown
# Clean Code Demo (C# Console)
|
||
|
||
En liten, självständig C#‑konsolapplikation som demonstrerar ett turordningsbaserat stridssystem mellan en **Player** och olika **Enemy**‑typer. Fokus ligger på enkla domänobjekt, gränssnitt och en tjänst som orkestrerar striden.
|
||
|
||
---
|
||
|
||
## Innehåll
|
||
|
||
- Strider mellan spelare och fiender (med boss‑modifierad skada)
|
||
- Enkelt loot‑system (t.ex. _gold_, _dragon_scale_)
|
||
- Inventarie som påverkar skada (_sword_) och helning (_potion_)
|
||
- Klara, separata ansvarsområden via gränssnitt (`IAttackable`, `IDescribable`)
|
||
|
||
---
|
||
|
||
## Arkitekturöversikt
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class Player {
|
||
+string Name
|
||
+bool IsDead
|
||
+void TakeDamage(int)
|
||
+void Heal()
|
||
+int CalculateDamage()
|
||
+void AddToInventory(string)
|
||
+void Describe()
|
||
}
|
||
class Enemy {
|
||
+string Name
|
||
+bool IsDead
|
||
+int Damage
|
||
+EnemyType Type
|
||
+void TakeDamage(int)
|
||
+string GetLoot()
|
||
+void Describe()
|
||
}
|
||
class BattleService {
|
||
+void PlayerAttacks(Player, Enemy)
|
||
+void EnemyAttacks(Enemy, Player)
|
||
}
|
||
class GameRunner {
|
||
+static void Main(string[])
|
||
}
|
||
IAttackable <|.. Player
|
||
IAttackable <|.. Enemy
|
||
IDescribable <|.. Player
|
||
IDescribable <|.. Enemy
|
||
EnemyType <.. Enemy
|
||
EnemyType <.. BattleService
|
||
GameRunner --> Player
|
||
GameRunner --> Enemy
|
||
GameRunner --> BattleService
|
||
```
|
||
|
||
- **`GameRunner`** skapar spelare och fiender och kör igenom några rundor.
|
||
- **`BattleService`** innehåller stridslogik åt båda håll och hanterar boss‑modifierad skada.
|
||
- **`Player`** och **`Enemy`** implementerar **`IAttackable`** (kan ta skada) och **`IDescribable`** (kan beskrivas/skrivas ut).
|
||
- **`EnemyType`** skiljer på vanliga fiender och bossar för skaleffekt i skada.
|
||
|
||
---
|
||
|
||
## Projektstruktur
|
||
|
||
```
|
||
.
|
||
├─ GameRunner.cs
|
||
├─ BattleService.cs
|
||
├─ Player.cs
|
||
├─ Enemy.cs
|
||
├─ EnemyType.cs
|
||
├─ IAttackable.cs
|
||
└─ IDescribable.cs
|
||
```
|
||
|
||
**Kort om filerna**
|
||
|
||
- `GameRunner.cs` – Programstart; sätter upp spelare/fiender och kör exempelstrider.
|
||
- `BattleService.cs` – Metoder för spelar‑ och fiendeattacker, inklusive boss‑modifiering av skada.
|
||
- `Player.cs` – Spelarens HP, bas‑skada, inventarie (t.ex. `potion`, `sword`), helning och damage‑beräkning.
|
||
- `Enemy.cs` – Fiendens HP, skada, typ och loot‑logik (`gold` eller `dragon_scale`).
|
||
- `EnemyType.cs` – Enum: `Normal` eller `Boss`.
|
||
- `IAttackable.cs` – Gränssnitt för entiteter som kan ta skada.
|
||
- `IDescribable.cs` – Gränssnitt för entiteter som kan beskrivas/skrivas ut.
|
||
|
||
---
|
||
|
||
## Kom igång
|
||
|
||
### Förutsättningar
|
||
|
||
- **.NET SDK 6.0+** (fungerar fint även på nyare versioner).
|
||
|
||
### Klona och kör
|
||
|
||
```bash
|
||
# Klona repo
|
||
git clone <din-repo-url>
|
||
cd <din-repo-mapp>
|
||
|
||
# Bygg & kör (i en mapp med .csproj)
|
||
dotnet build
|
||
dotnet run
|
||
```
|
||
|
||
---
|
||
|
||
## Exempel: flöde och utdata
|
||
|
||
Körningen i `GameRunner` gör ungefär detta:
|
||
|
||
1. Skapa `Player("Hero", 100, 15)` och lägg till `potion` och `sword` i inventariet.
|
||
2. Skapa `Enemy("Goblin", 40, 8, Normal)` och `Enemy("Dragon", 120, 25, Boss)`.
|
||
3. Spelaren och goblinen slåss tills goblinen dör och droppar `gold`.
|
||
4. Spelaren helar sig med `potion`.
|
||
5. Kort boss‑fight mot draken (boss‑skada är 1.5× avrundat nedåt).
|
||
|
||
**Typisk konsolutskrift** (förkortad):
|
||
|
||
```
|
||
=== GAME START ===
|
||
--- Hero ---
|
||
HP: 100
|
||
Base DMG: 15
|
||
Inventory: potion, sword
|
||
--- Goblin (enemy) ---
|
||
HP: 40
|
||
Type: Normal
|
||
|
||
-- Round 1 --
|
||
Hero attackts Goblin for 25
|
||
Goblin attackts Hero for 8
|
||
Hero attackts Goblin for 25
|
||
Goblin is dead
|
||
Hero received: gold
|
||
|
||
-- Round 2 --
|
||
--- Hero ---
|
||
HP: 92
|
||
Base DMG: 15
|
||
Inventory: potion, sword, gold
|
||
Hero healed to 122
|
||
|
||
-- Boss Fight --
|
||
--- Dragon (enemy) ---
|
||
HP: 120
|
||
Type: Boss
|
||
Hero attackts Dragon for 25
|
||
Dragon attackts Hero for 37
|
||
Hero attackts Dragon for 25
|
||
Dragon attackts Hero for 37
|
||
Hero attackts Dragon for 25
|
||
|
||
=== RESULT ===
|
||
--- Hero ---
|
||
HP: 48
|
||
Base DMG: 15
|
||
Inventory: sword, gold
|
||
```
|