Demo på Clean Code

This commit is contained in:
2026-03-08 11:55:18 +01:00
parent fe9a1e6400
commit f966c97d32
10 changed files with 227 additions and 0 deletions

47
.gitignore vendored Normal file
View File

@@ -0,0 +1,47 @@
############################
# Build results
############################
bin/
obj/
out/
############################
# Rider
############################
.idea/
*.sln.iml
############################
# User-specific files
############################
*.user
*.userosscache
*.suo
*.userprefs
############################
# Mono / macOS
############################
*.pidb
*.booproj
*.svd
.DS_Store
############################
# Logs
############################
*.log
.vscode/
############################
# NuGet
############################
packages/
*.nupkg
*.snupkg
############################
# Publish output
############################
publish/

16
CleanDemo.sln Normal file
View File

@@ -0,0 +1,16 @@
Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CleanDemo", "CleanDemo\CleanDemo.csproj", "{7A8AC146-FADF-47E1-8DA7-92FCA2C19354}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{7A8AC146-FADF-47E1-8DA7-92FCA2C19354}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7A8AC146-FADF-47E1-8DA7-92FCA2C19354}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7A8AC146-FADF-47E1-8DA7-92FCA2C19354}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7A8AC146-FADF-47E1-8DA7-92FCA2C19354}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,30 @@
public class BattleService {
public void PlayerAttacks(Player player, Enemy enemy) {
int totalDamage = player.CalculateDamage();
enemy.TakeDamage(totalDamage);
Console.WriteLine($"{player.Name} attackts {enemy.Name} for {totalDamage}");
if (enemy.IsDead) {
Console.WriteLine($"{enemy.Name} is dead");
string loot = enemy.GetLoot();
player.AddToInventory((loot));
Console.WriteLine($"{player.Name} received: {loot}");
}
}
public void EnemyAttacks(Enemy enemy, Player player) {
if(enemy.IsDead) return;
int totalDamage = CalculateEnemyDamage(enemy);
player.TakeDamage(totalDamage);
Console.WriteLine($"{enemy.Name} attackts {player.Name} for {totalDamage}");
if (player.IsDead) {
Console.WriteLine($"{player.Name} is dead");
}
}
private int CalculateEnemyDamage(Enemy enemy) {
return enemy.Type == EnemyType.Boss
? (int)(enemy.Damage * 1.5)
: enemy.Damage;
}
}

View File

@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

30
CleanDemo/Enemy.cs Normal file
View File

@@ -0,0 +1,30 @@
public class Enemy : IAttackable, IDescribable{
public string Name { get; }
public bool IsDead { get; private set; }
public int Damage { get; }
public EnemyType Type { get; }
private int _health;
public Enemy(string name, int health, int damage, EnemyType type) {
Name = name;
_health = health;
Damage = damage;
Type = type;
}
public void TakeDamage(int amount) {
_health -= amount;
if (_health <= 0)
IsDead = true;
}
public string GetLoot() {
return Name == "Dragon" ? "dragon_scale" : "gold";
}
public void Describe() {
Console.WriteLine($"--- " + Name + " (enemy) ---");
Console.WriteLine($"HP: {_health}");
Console.WriteLine($"Type: {Type}");
}
}

4
CleanDemo/EnemyType.cs Normal file
View File

@@ -0,0 +1,4 @@
public enum EnemyType {
Normal,
Boss
}

37
CleanDemo/GameRunner.cs Normal file
View File

@@ -0,0 +1,37 @@
public class GameRunner {
static void Main(string[] args) {
Player player = new Player("Hero", 100, 15);
player.AddToInventory("potion");
player.AddToInventory("sword");
Enemy goblin = new Enemy("Goblin", 40, 8, EnemyType.Normal);
Enemy dragon = new Enemy("Dragon", 120, 25, EnemyType.Boss);
var battle = new BattleService();
Console.WriteLine("=== GAME START ===");
player.Describe();
goblin.Describe();
Console.WriteLine("\n-- Round 1 --");
battle.PlayerAttacks(player, goblin);
battle.EnemyAttacks(goblin, player);
battle.PlayerAttacks(player, goblin);
Console.WriteLine("\n-- Round 2 --");
player.Describe();
player.Heal();
Console.WriteLine("\n-- Boss Fight --");
dragon.Describe();
battle.PlayerAttacks(player, dragon);
battle.EnemyAttacks(dragon, player);
battle.PlayerAttacks(player, dragon);
battle.EnemyAttacks(dragon, player);
battle.PlayerAttacks(player, dragon);
Console.WriteLine("\n=== RESULT ===");
player.Describe();
}
}

5
CleanDemo/IAttackable.cs Normal file
View File

@@ -0,0 +1,5 @@
public interface IAttackable {
string Name { get; }
bool IsDead { get; }
void TakeDamage(int amount);
}

View File

@@ -0,0 +1,3 @@
public interface IDescribable {
void Describe();
}

45
CleanDemo/Player.cs Normal file
View File

@@ -0,0 +1,45 @@
public class Player : IAttackable, IDescribable{
public string Name { get; }
public int _health;
public readonly int _baseDamage;
public bool IsDead { get; private set; }
public readonly List<string> _inventory = new List<string>();
public Player(string name, int health, int baseDamage) {
Name = name;
_health = health;
_baseDamage = baseDamage;
}
public void TakeDamage(int amount) {
_health -= amount;
if (_health <= 0)
IsDead = true;
}
public void Heal() {
if (_inventory.Contains("potion")) {
_health += 30;
_inventory.Remove("potion");
Console.WriteLine($"{Name} healed to {_health}");
}
else {
Console.WriteLine("No potion available");
}
}
public int CalculateDamage() {
int totalDamage = _baseDamage;
if (_inventory.Contains("sword")) totalDamage += 10;
return totalDamage;
}
public void AddToInventory(string item) {
_inventory.Add(item);
}
public void Describe() {
Console.WriteLine($"--- {Name} ---");
Console.WriteLine($"HP: {_health}");
Console.WriteLine($"Base DMG: {_baseDamage}");
Console.WriteLine($"Inventory: {string.Join(", ", _inventory)}");
}
}