티스토리 뷰
C# 클래스의 상속과 람다 함수에 대해 배웠고 과제는 아무 게임을 클래스를 구현하기였는데 생각보다 고민이 많이 필요했다.. 도움이 된 것 같다
💻 C#
Lambda
var names = new List<string> { "Charlie", "Alice", "Bob" };
var sortedNames = names.OrderBy(n => n);
foreach (var name in sortedNames)
{
Console.WriteLine(name);
}
var firstName = names.First(n => n.StartsWith("A"));
Console.WriteLine($"First name starting with A: {firstName}");
int[] nums = { 5, 3, 8, 1 };
//메서드구문
var sortedMeshod = nums.OrderByDescending(n => n);
//쿼리 구문
var sortedQuery = from n in nums
orderby n
select n;
Console.WriteLine("Meshod syntax:");
foreach (var n in sortedMeshod)
Console.Write(n + " "); // 8 5 3 1
Console.WriteLine();
Console.WriteLine("Query syntax:");
foreach (var n in sortedQuery)
{
Console.Write(n + " "); // 1 3 5 8
}
클래스와 상속
class Animal
{
public string Name { get; set; }
public virtual void Speak() // 자식 클래스에서 재정의 가능
{
Console.WriteLine("동물이 소리를 냅니다.");
}
}
class Dog: Animal
{
public override void Speak()
{
Console.WriteLine($"{Name}이(가) 멍멍 짖습니다.");
}
}
var animal = new Animal();
animal.Name = "일반동물";
animal.Speak(); // 동물이 소리를 냅니다.
var dog = new Dog();
dog.Name = "바둑이";
dog.Speak(); // 바둑이이(가) 멍멍 짖습니다.
UpCasting, DownCasting
class Animal
{
public void Speak()
{
Console.WriteLine("동물이 소리를 냅니다.");
}
}
class Dog: Animal
{
public void Bark()
{
Console.WriteLine("멍멍!");
}
}
// UpCasting
var dog = new Dog();
Animal animal = dog;
animal.Speak(); // 동물이 소리를 냅니다.
// DownCasting
var animal2 = new Animal();
var dog2 = animal as Dog;
var dog3 = animal2 as Dog;
if (dog2 != null)
{
dog2.Bark(); // 멍멍
}
else
{
Console.WriteLine("dog2 다운캐스팅 실패!");
}
if (dog3 != null)
{
dog2.Bark();
}
else
{
Console.WriteLine("dog3 다운캐스팅 실패!"); // dog3 다운캐스팅 실패!
}
업캐스팅 | 다운캐스팅 |
자식 → 부모 변환 | 부모 → 자식 변환 |
자동 변환 가능 | 명시적 변환 필요 ((타입)) |
안전한 변환 | 업캐스팅된 객체만 변환 가능 |
부모 기능만 사용 가능 | 자식 기능까지 사용 가능 |
📝 과제
게임 클래스, 상속 구현하기
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace study31
{
class Skill
{
public string Name { get; set; }
public int ManaCost { get; set; }
public int Cooldown { get; set; }
public int LastUsedTime { get; set; }
public Skill(string name, int manaCost, int cooldown)
{
Name = name;
ManaCost = manaCost;
Cooldown = cooldown * 1000;
LastUsedTime = 0;
}
public bool CanActiveSkill(int playerMana)
{
int currentTime = Environment.TickCount;
if (playerMana < ManaCost)
{
Console.WriteLine($" 마나가 부족합니다! (필요 MP: {ManaCost}");
return false;
}
if (currentTime - LastUsedTime < Cooldown)
{
int remainingTime = (Cooldown - (currentTime - LastUsedTime)) / 1000;
Console.WriteLine($" {Name} 스킬은 아직 사용할 수 없습니다.(남은 시간 : {remainingTime}초)");
return false;
}
return true;
}
public void ActivateSkill(ref int playerMana)
{
if (!CanActiveSkill(playerMana)) return;
playerMana -= ManaCost;
LastUsedTime = Environment.TickCount;
Console.WriteLine($"⚔️ {Name} 발동 ! (MP - {ManaCost})");
}
public void ShowSkillInfo()
{
Console.WriteLine($"{Name} (필요 MP: {ManaCost} | 쿨타임: {Cooldown / 1000})");
}
}
class BaseGroup
{
public string Name { get; set; }
public List<Skill> Skills { get; set; }
public BaseGroup(string name, List<Skill> commonSkills)
{
Name = name;
Skills = commonSkills;
}
public void ShowSkillInfo()
{
Console.WriteLine($"{Name} 스킬");
for (int i = 0; i < Skills.Count; i++)
{
Console.Write($"{i}) ");
Skills[i].ShowSkillInfo();
}
Console.WriteLine();
}
}
class OccupationLine: BaseGroup // 직업계열 (모험가, 영웅, ...)
{
public OccupationLine(string name, List<Skill> Skills) : base(name, Skills)
{
}
}
class Class: BaseGroup // 전직계열 (전사, 궁수, ...)
{
public Class(string name, List<Skill> Skills) : base(name, Skills)
{
}
}
class Occupation: BaseGroup // 직업
{
public Occupation(string name, List<Skill> Skills) : base(name, Skills)
{
}
}
class Player
{
public string NickName { get; set; }
public Occupation PlayerOccupation { get; set; }
public OccupationLine PlayerOccupationLine { get; set; }
public Class PlayerClass { get; set; }
public int Level { get; set; }
public int Hp { get; set; }
public int Mana { get; set; }
public int Meso { get; set; }
public Player(string nickname, Occupation playerOccupation, OccupationLine occupationLine, Class playerClass)
{
NickName = nickname;
PlayerOccupation = playerOccupation;
PlayerOccupationLine = occupationLine;
PlayerClass = playerClass;
Level = 10;
Hp = 30000;
Mana = 2000;
Meso = 1000000;
}
public void ShowPlayerInfo()
{
Console.WriteLine("---------- 👤 캐릭터 정보 ----------");
Console.WriteLine($"직업\\t\\t{PlayerOccupation.Name}");
Console.WriteLine($"직업계열\\t{PlayerOccupationLine.Name}");
Console.WriteLine($"전직계열\\t{PlayerClass.Name}");
Console.WriteLine($"레벨\\t\\t{Level}");
Console.WriteLine($"체력\\t\\t{Level}");
Console.WriteLine($"마나\\t\\t{Level}");
Console.WriteLine($"메소\\t\\t{Level}");
Console.WriteLine("------------------------------------");
}
public void ShowPlayerSkillInfo()
{
Console.WriteLine("----------- ⚔️ 스킬 정보 -----------");
PlayerOccupation.ShowSkillInfo();
PlayerOccupationLine.ShowSkillInfo();
PlayerClass.ShowSkillInfo();
Console.WriteLine("------------------------------------");
}
}
class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.UTF8;
var adventurerSkills = new List<Skill>();
adventurerSkills.Add(new Skill("블리츠 실드", 200, 20));
adventurerSkills.Add(new Skill("이블브", 200, 20));
adventurerSkills.Add(new Skill("언스태이블 메모라이즈", 200, 20));
var heroSkills = new List<Skill>();
heroSkills.Add(new Skill("프리드의 가호", 600, 100));
var warriorSkills = new List<Skill>();
warriorSkills.Add(new Skill("오라 웨폰", 300, 30));
warriorSkills.Add(new Skill("바디 오브 스틸", 300, 20));
var archerSkills = new List<Skill>();
archerSkills.Add(new Skill("크리티컬 리인포스", 300, 30));
archerSkills.Add(new Skill("가이디드 애로우", 300, 20));
var aranSkills = new List<Skill>();
aranSkills.Add(new Skill("비욘더", 10, 1));
aranSkills.Add(new Skill("아드레날린", 300, 70));
aranSkills.Add(new Skill("헌터즈 타겟팅", 300, 70));
var occupations = new List<Occupation>()
{
new Occupation("아란", aranSkills)
};
var occupationLines = new List<OccupationLine>()
{
new OccupationLine("모험가", adventurerSkills),
new OccupationLine("영웅", heroSkills)
};
var classes = new List<Class>()
{
new Class("전사", warriorSkills),
new Class("궁수", archerSkills)
};
var player = new Player("z지존아란z", occupations[0], occupationLines[1], classes[0]);
player.ShowPlayerInfo();
Console.WriteLine();
player.ShowPlayerSkillInfo();
}
}
}
'Unity > 멋쟁이사자처럼' 카테고리의 다른 글
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 11일차 회고 (0) | 2025.03.07 |
---|---|
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 10일차 회고 (0) | 2025.03.07 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 8일차 회고 (0) | 2025.03.07 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 7일차 회고 (0) | 2025.03.07 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 6일차 회고 (0) | 2025.03.07 |