Files
CleanCode/README.md
2026-03-08 12:06:47 +01:00

160 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 bossmodifierad skada)
- Enkelt lootsystem (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 bossmodifierad 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 bossmodifiering av skada.
- `Player.cs` Spelarens HP, basskada, inventarie (t.ex. `potion`, `sword`), helning och damageberäkning.
- `Enemy.cs` Fiendens HP, skada, typ och lootlogik (`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 bossfight mot draken (bossskada ä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
```