오늘은 오전 9시부터 알고리즘에 대한 세션이 있었다.
알고리즘에 대한 정리
알고리즘은 문제해결능력이다.
1) Short Term Memory : 정보의 부족
청킹(chunking)하기
주석 남기기
코드 컨벤션 잘 작성하기
2) long Term Memory : 지식의 부족
플래시 카드 작성 - 토글(접은 글)
인출 강도 높이기
정교화 연습하기
3) Working Memory : 처리능력의 부족
내재적 부하 : 특정 알고리즘의 내부적 원리를 이해하고 있으면 줄어드는 부하
외재적 부하 : 문제 외적이거나 코드의 우발적 복잡성에 기인하는 부하
본유적 부하 : 내재적 부하와 외재적 부하가 가득 차서 LTM(long Term Memory)으로 지식이 저장되는 로드에 걸리는 부하
정신 모델 만들기 : 생각나는 대로 구조를 만들기 (구체적으로 만들수록 좋음)
상태표 만들기 : 변수의 값에 중점을 둔다.
대충 이 정도... 정신없이 작성하니 10시 정도 되어서,
오후 2시에 예정인 팀프로젝트 발제까지 남는 시간에 4주 차 과제였던 TextRpg를 만들어봤다.
using System.Numerics;
using System.Xml.Linq;
using static System.Net.Mime.MediaTypeNames;
using System.Threading;
namespace Text_Rpg
{
internal class Program
{
public static Warrior player;
public static Goblin goblin;
public static Dragon dragon;
public static HealthPotion hppotion;
public static StrengthPotion stpotion;
public bool IsDead = false;
static void Main(string[] args)
{
Stage.StartStage1();
//클리어 보상
Stage.StartStage2();
//클리어 보상
}
public interface ICharacter
{
string Name { get; set; }
int Health { get; set; }
int Attack { get; set; }
bool IsDead { get; set; }
}
public class Warrior : ICharacter
{
public string Name { get; set; }
public int Health { get; set; }
public int Attack { get; set; }
public bool IsDead { get; set; }
public Warrior(string name, int health, int atk)
{
Name = name;
Health = health;
Attack = atk;
}
}
public class Monster : ICharacter
{
public string Name { get; set; }
public int Health { get; set; }
public int Attack { get; set; }
public bool IsDead { get; set; }
}
public class Goblin : Monster
{
public string Name { get; set; }
public int Health { get; set; }
public int Attack { get; set; }
public Goblin(string name, int health, int atk)
{
Name = name;
Health = health;
Attack = atk;
}
}
public class Dragon : Monster
{
public string Name { get; set; }
public int Health { get; set; }
public int Attack { get; set; }
public Dragon(string name, int health, int atk)
{
Name = name;
Health = health;
Attack = atk;
}
}
public interface IItem
{
string Name { get; set; }
public void Use(Warrior warrior);
}
public class HealthPotion : IItem
{
public string Name { get; set; }
public HealthPotion(string name)
{
Name = name;
}
public void Use(Warrior warrior)
{
Console.WriteLine("힐 포션 사용!");
warrior.Health += 10;
if (warrior.Health > 40)
{
warrior.Health = 50;
}
}
}
// 공격력 포션 클래스
public class StrengthPotion : IItem
{
public string Name { get; set; }
public StrengthPotion (string name)
{
Name = name;
}
public void Use(Warrior warrior)
{
Console.WriteLine("힘 포션 사용!");
warrior.Attack += 5;
}
}
public class Stage
{
static public void StartStage1()
{
Console.Clear();
player = new Warrior("워리어", 50, 5);
goblin = new Goblin("고블린", 10, 3);
stpotion = new StrengthPotion("힘 포션");
hppotion = new HealthPotion("힐 포션");
Console.WriteLine("게임이 시작됩니다!");
Console.WriteLine(" 1단계 스테이지 (vs 고블린)\n");
Console.WriteLine(" 플레이어 ");
Console.WriteLine( $"이름 : {player.Name} ");
Console.WriteLine( $"공격력 : {player.Attack}, 체력 : {player.Health}\n ");
Console.WriteLine( " 고블린 ");
Console.WriteLine($"이름 : {goblin.Name} ");
Console.WriteLine($"공격력 : {goblin.Attack}, 체력 : {goblin.Health}\n ");
do
{
Console.WriteLine("플레이어의 턴!!");
Console.WriteLine("원하는 행동을 골라 보세요!");
Console.WriteLine("1.공격");
Console.WriteLine("2.힘 포션 먹기");
Console.WriteLine("3.힐 포션 먹기");
int playerinput = int.Parse(Console.ReadLine());
switch (playerinput)
{
case 1:
Console.WriteLine("몬스터를 공격합니다.");
goblin.Health -= player.Attack;
Console.WriteLine($"{player.Attack}에 피해를 주었습니다");
Console.WriteLine($"고블린의 남은 체력 : {goblin.Health}\n");
break;
case 2:
Console.WriteLine("힘 포션을 먹었습니다.");
stpotion.Use(player);
Console.WriteLine($"현재 공격력 : {player.Attack}");
break;
case 3:
Console.WriteLine("힐 포션을 먹었습니다.");
hppotion.Use(player);
Console.WriteLine($"현재 공격력 : {player.Health}");
break;
default:
Console.WriteLine("잘못된 입력입니다.");
Thread.Sleep(1000);
StartStage1();
break;
}
Thread.Sleep(1000);
if (goblin.Health <= 0)
{
goblin.IsDead = true;
Console.WriteLine("고블린을 무찔렀습니다!");
}
else
{
Console.WriteLine("고블린의 턴!!");
player.Health -= goblin.Attack;
Console.WriteLine($"{goblin.Attack}에 피해를 입었습니다");
Console.WriteLine($"플레이어의 남은 체력 : {player.Health}");
if (player.Health <= 0)
{
player.IsDead = true;
Console.WriteLine("플레이어가 사망하였습니다.");
}
}
Thread.Sleep(1000);
Console.Clear();
}
while (!player.IsDead && !goblin.IsDead);
}//startStage1()
static public void StartStage2()
{
Console.Clear();
player = new Warrior("워리어", 50, 5);
dragon = new Dragon("드래곤", 50, 10);
stpotion = new StrengthPotion("힘 포션");
hppotion = new HealthPotion("힐 포션");
Console.WriteLine("게임이 시작됩니다!");
Console.WriteLine(" 2단계 스테이지 (vs 드래곤)\n");
Console.WriteLine(" 플레이어 ");
Console.WriteLine($"이름 : {player.Name} ");
Console.WriteLine($"공격력 : {player.Attack}, 체력 : {player.Health}\n ");
Console.WriteLine(" 드래곤 ");
Console.WriteLine($"이름 : {dragon.Name} ");
Console.WriteLine($"공격력 : {dragon.Attack}, 체력 : {dragon.Health}\n ");
do
{
Console.WriteLine("플레이어의 턴!!");
Console.WriteLine("원하는 행동을 골라 보세요!");
Console.WriteLine("1.공격");
Console.WriteLine("2.힘 포션 먹기");
Console.WriteLine("3.힐 포션 먹기");
int playerinput = int.Parse(Console.ReadLine());
switch (playerinput)
{
case 1:
Console.WriteLine("몬스터를 공격합니다.");
dragon.Health -= player.Attack;
Console.WriteLine($"{player.Attack}에 피해를 주었습니다");
Console.WriteLine($"드래곤의 남은 체력 : {dragon.Health}\n");
break;
case 2:
Console.WriteLine("힘 포션을 먹었습니다.");
stpotion.Use(player);
Console.WriteLine($"현재 공격력 : {player.Attack}");
break;
case 3:
Console.WriteLine("힐 포션을 먹었습니다.");
hppotion.Use(player);
Console.WriteLine($"현재 공격력 : {player.Health}");
break;
default:
Console.WriteLine("잘못된 입력입니다.");
Thread.Sleep(1000);
StartStage2();
break;
}
Thread.Sleep(1000);
if (dragon.Health <= 0)
{
dragon.IsDead = true;
Console.WriteLine("드래곤을 무찔렀습니다!");
}
else
{
Console.WriteLine("드래곤의 턴!!");
player.Health -= dragon.Attack;
Console.WriteLine($"{dragon.Attack}에 피해를 입었습니다");
Console.WriteLine($"플레이어의 남은 체력 : {player.Health}");
if (player.Health <= 0)
{
player.IsDead = true;
Console.WriteLine("플레이어가 사망하였습니다.");
}
}
Thread.Sleep(1000);
Console.Clear();
}
while (!player.IsDead && !dragon.IsDead);
}//startStage2()
}// class stage
}//~
}//~
정확하게 과제에서 요구하던 게임은 아니지만, 뭔가 코드 작성의 속도가 늘었다는 걸 체감 해버렸다.
이게 반복학습의 결과인가?라고 느끼던 찰나 2시 5분이 되어 서둘러 zoom에 접속해 팀프로젝트 관련 발제를 지켜보았다.
내용은 그간 진행해 온 개인프로젝트 TextDungeon 그리고 지금껏 만들던 TextGame의 합 + 발전이었다.
발제가 끝난 뒤 서둘러 팀원들과 회의를 하고 와이어프레임까지 나아갔다.(시간이 촉박해!)
와이어프레임은 글로만 설명하는 것보다 눈으로 구성을 볼 수 있기 때문에 훨씬 단계 별 진행하는데 도움이 된다.
그리고 이어서 발전 단계에 들어가기 전인 기본이 되는 코드를 내가 작성하기로 했다.
이미 작성해 둔 코드를 합치는 일이라 어려울 것이 없다고 당시 생각했는데, 팀적으로 코드컨벤션이나,
팀원들이 보기에 내가 작성한 코드가 지저분해 보이고 가독성이 떨어진다고 느낄까 봐 먼가? 먼가다.
베이스를 만드는 것이기 때문에 평소보다 깔끔하게 만들어 줘야 한다는 생각이 지배적이어서 회의가 더 필요할 거
같다고 느껴졌다.
P.S 회의는 정말 아무리 해도 부족해..
'Today I Learned' 카테고리의 다른 글
[내일배움캠프] C# 문법 종합반 - 알고리즘 코드카타(짝수와 홀수) (0) | 2023.11.17 |
---|---|
[내일배움캠프] C# 문법 종합반 - 알고리즘 (Big O) (0) | 2023.11.16 |
[내일배움캠프] C# 문법 종합반 - 알고리즘 (0) | 2023.11.14 |
[내일배움캠프] C# 문법 종합반 - 개인 프로젝트 마무리 (0) | 2023.11.13 |
[내일배움캠프] C# 문법 종합반 프로퍼티와 오버라이딩(한탄의 일기) (0) | 2023.11.10 |