대학원 일기

로스트아크 어빌리티 스톤 세공 프로젝트 본문

Computer programming/c#

로스트아크 어빌리티 스톤 세공 프로젝트

대학원생(노예) 2021. 12. 22. 01:57

이전글

2021.12.22 - [개발 공부/c#] - C#으로 만드는 로스트아크 어빌리티 스톤 세공

 

C#으로 만드는 로스트아크 어빌리티 스톤 세공

서론  요즘 취미 생활로 재미있게 플레이하고 있는 게임 "로스트아크"의 캐릭터의 능력을 강화해주는 컨텐츠인 어빌리티 스톤 세공을 구현해보려고 한다. 프로젝트 내용은 실제 로스트아크의

kys0411.tistory.com

 

 

개발환경

- 운영체제: 윈도우10

- 개발도구: Visial Studio 2019

- 개발언어: C#

 

 

소스코드

Program.cs

더보기
using System;
using System.Threading;

namespace Project
{
    class Program
    {
        static void Main(string[] args)
        {
            Mococo mococo = new Mococo();
            Menu menu = new Menu();
            Console.WriteLine("\n------------------------------------------------모두 로아 하자------------------------------------------------\n\n");
            mococo.printMococo();
            Thread.Sleep(300);
            Console.Clear();
            menu.First();
            mococo.printMococo();
            Console.WriteLine("\n------------------------------------------------모두 로아 하자------------------------------------------------\n\n");
            Thread.Sleep(300);
        }
    }
}

 

Menu.cs

더보기
using System;
using System.Threading;

namespace Project
{
    class Menu
    {
        Output output = new Output();
        Random random = new Random();
        IncreaseAbility ability1 = new IncreaseAbility();
        IncreaseAbility ability2 = new IncreaseAbility();
        DecreaseAbility ability3 = new DecreaseAbility();
        Chance chance = new Chance();

        public void First()
        {
            int opp = 0;
            bool mainout = false;

            while (true)
            {
                Console.WriteLine("\n┌────────────────────────  돌깎기 게임 ─────────────────────────┐\n│\t\t\t\t\t\t\t\t│");
                for (int i = 0; i < 3; i++)
                {
                    Console.Write("│\t");
                    if (i == 0)
                    {
                        if (ability1.Name != null)
                            Console.Write(ability1.Name + (ability1.Name.Length <= 3 ? "\t" : ""));
                        else
                            Console.Write("\t");
                    }
                    else if (i == 1)
                    {
                        if (ability2.Name != null)
                            Console.Write(ability2.Name + (ability2.Name.Length <= 3 ? "\t" : ""));
                        else
                            Console.Write("\t");
                    }
                    else
                    {
                        if (ability3.Name != null)
                            Console.Write(ability3.Name + (ability3.Name.Length <= 3 ? "\t" : ""));
                        else
                            Console.Write("\t");
                    }
                    Console.Write("\t     ");
                    if (opp != 0)
                    {
                        for (int j = 0; j < opp; j++)
                        {
                            Console.Write("◈ ");
                        }
                        if (opp == 6)
                            Console.Write("\t\t\t│");
                        else
                            Console.Write(opp == 8 ? "\t\t│" : "\t│");
                    }
                    else
                        Console.Write("\t\t\t\t\t│");
                    Console.WriteLine();
                }
                Console.WriteLine("│\t\t\t\t\t\t\t\t│\n└───────────────────────────────────────────────────────────────┘");
                Console.WriteLine("\n1. 세공");
                Console.WriteLine("2. 설정(세공기회)");
                Console.WriteLine("3. 설정(각인종류)");
                Console.WriteLine("4. 초기화");
                Console.WriteLine("5. 종료");
                Console.Write("선택: ");

                int result = output.NumCheck(1, 5);

                if (result == 0)
                {
                    Thread.Sleep(1000);
                    Console.Clear();
                    continue;
                }
                switch (result)
                {
                    case 1:
                        if (ability1.Name != null && ability2.Name != null && ability3.Name != null)
                        {
                            if (opp != 0)
                            {
                                Console.Clear();
                                Second();
                            }
                            else
                            {
                                Console.WriteLine("\n\n아직 세공 기회를 설정하지 않았습니다!");
                                Thread.Sleep(1000);
                                Console.Clear();
                            }
                        }
                        else
                        {
                            Console.WriteLine("\n\n아직 각인을 전부 설정하지 않았습니다!");
                            Thread.Sleep(1000);
                            Console.Clear();
                        }
                        break;
                    case 2:
                        Console.Clear();
                        WorkOpportunityScreen();
                        opp = ability1.Opportunity;
                        break;
                    case 3:
                        Console.Clear();
                        AbilityScreen();
                        break;
                    case 4:
                        ability1.Name = null;
                        ability2.Name = null;
                        ability3.Name = null;
                        opp = 0;
                        break;
                    case 5:
                        Console.Clear();
                        mainout = true;
                        break;
                }
                if (mainout)
                    break;
                Console.Clear();
            }
        }

        public void WorkOpportunityScreen()
        {
            int workopp = 0;

            while (true)
            {
                Console.WriteLine("   6   |   8   |   9   |   10   ");
                Console.Write("중에 선택: ");
                bool abilitynumcheck = int.TryParse(Console.ReadLine(), out workopp);
                if (abilitynumcheck)
                {
                    if (workopp != 6 && workopp < 8 || workopp > 10)
                    {
                        Console.WriteLine("\n범위 내에서 선택해주세요.");
                        Thread.Sleep(1000);
                        Console.Clear();
                        continue;
                    }
                    break;
                }
                else
                {
                    Console.WriteLine("\n범위 내에서 선택해주세요.");
                    Thread.Sleep(1000);
                    Console.Clear();
                }
            }
            ability1.Opportunity = workopp;
            ability2.Opportunity = workopp;
            ability3.Opportunity = workopp;
        }

        public void AbilityScreen()
        {
            bool first = false;
            while (true)
            {
                Console.WriteLine("1. 증가 능력");
                Console.WriteLine("2. 증가 능력");
                Console.WriteLine("3. 감소 능력");
                Console.WriteLine("4. 나가기");
                Console.Write("선택: ");

                int result = output.NumCheck(1, 4);

                if (result == 0)
                {
                    Thread.Sleep(1000);
                    Console.Clear();
                    continue;
                }
                else if (result == 4)
                    break;
                if ((result == 1 && ability1.Name != null) || (result == 2 && ability2.Name != null) || (result == 3 && ability3.Name != null))
                {
                    while (true)
                    {
                        Console.Write("\n\n이미 선택됐습니다. 다시 선택하겠습니까? (y or n) :");
                        string again = Console.ReadLine();
                        if (again == "y")
                        {
                            Console.Clear();
                            break;
                        }
                        else if (again == "n")
                        {
                            Console.Clear();
                            first = true;
                            break;
                        }
                        else
                        {
                            Console.WriteLine("\n잘못 입력했습니다.");
                            Thread.Sleep(1000);
                            Console.Clear();
                            Console.WriteLine("1. 증가 능력");
                            Console.WriteLine("2. 증가 능력");
                            Console.WriteLine("3. 감소 능력");
                            Console.WriteLine("4. 나가기");
                            Console.WriteLine("선택: ");
                            continue;
                        }
                    }
                    if (first)
                        continue;
                }
                Console.Clear();
                if (result == 1)
                    ability1.SelectAbility(ability2.Name);
                else if (result == 2)
                    ability2.SelectAbility(ability1.Name);
                else if (result == 3)
                    ability3.SelectAbility(null);
            }
        }

        public void Second()
        {
            chance.InitialValue = 75;
            chance.Max = 75;
            chance.Min = 25;
            chance.PlusMinus = 10;
            int opp = ability1.Opportunity;
            ability1.Success = new int?[opp];
            ability2.Success = new int?[opp];
            ability3.Success = new int?[opp];
            int abilitynum = 0;

            while (true)
            {
                Console.WriteLine("┌───────────────────────────  세 공 ─────────────────── {0,0}%─────┐", chance.InitialValue);

                Console.Write("│  1. ");
                Console.Write(ability1.Name + (ability1.Name.Length >= 6 ? "\t " : "\t\t "));
                for (int i = 0; i < opp; i++)
                {
                    if (ability1.Success[i] == null)
                        Console.Write("◈ ");
                    else
                        Console.Write(ability1.Success[i] == 0 ? "◆ " : "◇ ");
                }
                if (abilitynum == 1)
                {
                    if (opp == 6)
                        Console.Write("\t");
                    if (ability1.Success[ability1.Sub - 1] == 0)
                        Console.Write("\t성공\t│");
                    else
                        Console.Write("\t실패\t│");
                }
                else
                {
                    if (opp == 6)
                        Console.Write("\t\t\t│");
                    else
                        Console.Write("\t\t│");
                }
                Console.Write("\n├───────────────────────────────────────────────────────────────┤\n│  2. ");
                Console.Write(ability2.Name + (ability2.Name.Length >= 6 ? "\t " : "\t\t "));
                for (int i = 0; i < opp; i++)
                {
                    if (ability2.Success[i] == null)
                        Console.Write("◈ ");
                    else
                        Console.Write(ability2.Success[i] == 0 ? "◆ " : "◇ ");
                }
                if (abilitynum == 2)
                {
                    if (opp == 6)
                        Console.Write("\t");
                    if (ability2.Success[ability2.Sub - 1] == 0)
                        Console.Write("\t성공\t│");
                    else
                        Console.Write("\t실패\t│");
                }
                else
                {
                    if (opp == 6)
                        Console.Write("\t\t\t│");
                    else
                        Console.Write("\t\t│");
                }
                Console.Write("\n├───────────────────────────────────────────────────────────────┤\n│  3. ");
                Console.Write(ability3.Name + (ability3.Name.Length >= 6 ? "\t " : "\t\t "));
                for (int i = 0; i < opp; i++)
                {
                    if (ability3.Success[i] == null)
                        Console.Write("◈ ");
                    else
                        Console.Write(ability3.Success[i] == 0 ? "◆ " : "◇ ");
                }
                if (abilitynum == 3)
                {
                    if (opp == 6)
                        Console.Write("\t");
                    if (ability3.Success[ability3.Sub - 1] == 0)
                        Console.Write("\t성공\t│");
                    else
                        Console.Write("\t실패\t│");
                }
                else
                {
                    if (opp == 6)
                        Console.Write("\t\t\t│");
                    else
                        Console.Write("\t\t│");
                }
                Console.WriteLine("\n└───────────────────────────────────────────────────────────────┘");
                //모든 각인의 세공이 완료됐을 때, 결과 창으로 이동
                if (ability1.Success[opp - 1] != null && ability2.Success[opp - 1] != null && ability3.Success[opp - 1] != null)
                {
                    ability1.Sub = 0;
                    ability2.Sub = 0;
                    ability3.Sub = 0;
                    Thread.Sleep(1000);
                    Console.Clear();
                    ResultScreen();
                    break;
                }
                Console.WriteLine("\n\n1. 1번 세공");
                Console.WriteLine("2. 2번 세공");
                Console.WriteLine("3. 3번 세공");
                Console.WriteLine("4. 초기화");
                Console.WriteLine("5. 나가기");
                Console.Write("\n\n세공하고 싶은 능력을 선택: ");
                int result = output.NumCheck(1, 5);
                if (result == 0)
                {
                    Thread.Sleep(1000);
                    Console.Clear();
                    continue;
                }
                else if (result == 5)
                {
                    ability1.Sub = 0;
                    ability2.Sub = 0;
                    ability3.Sub = 0;
                    Console.Clear();
                    break;
                }
                switch (result)
                {
                    case 1:
                        //각인의 세공이 끝났는지 확인(2, 3도 동일)
                        if (ability1.Success[opp - 1] == null)
                        {
                            chance = ability1.Work(chance);
                            abilitynum = 1;
                        }
                        else
                        {
                            Console.WriteLine("\n\n1번 각인의 세공이 끝났습니다.");
                            abilitynum = 0;
                            Thread.Sleep(1000);
                        }
                        break;
                    case 2:
                        if (ability2.Success[opp - 1] == null)
                        {
                            chance = ability2.Work(chance);
                            abilitynum = 2;
                        }
                        else
                        {
                            Console.WriteLine("\n\n2번 각인의 세공이 끝났습니다.");
                            abilitynum = 0;
                            Thread.Sleep(1000);
                        }
                        break;
                    case 3:
                        if (ability3.Success[opp - 1] == null)
                        {
                            chance = ability3.Work(chance);
                            abilitynum = 3;
                        }
                        else
                        {
                            Console.WriteLine("\n\n3번 각인의 세공이 끝났습니다.");
                            abilitynum = 0;
                            Thread.Sleep(1000);
                        }
                        break;
                    case 4:
                        for (int i = 0; i < opp; i++)
                        {
                            ability1.Success[i] = null;
                            ability2.Success[i] = null;
                            ability3.Success[i] = null;
                        }
                        ability1.Sub = 0;
                        ability2.Sub = 0;
                        ability3.Sub = 0;
                        chance.InitialValue = 75;
                        abilitynum = 0;
                        break;
                }
                Console.Clear();
            }
        }
        public void ResultScreen()
        {
            int count;
            int opp = ability1.Opportunity;
            Console.WriteLine("\n┌────────────────  결과 ────────────────┐\n│\t\t\t\t\t│");
            for (int i = 0; i < 3; i++)
            {
                count = 0;
                if (i == 0)
                {
                    Console.Write("│   {0,0}", ability1.Name);
                    for (int j = 0; j < opp; j++)
                        if (ability1.Success[j] == 0)
                            count += 1;
                    if (ability1.Name.Length <= 6)
                        Console.Write("\t\t");
                    else
                        Console.Write("\t");
                    Console.Write("◆ (성공) x {0,0}\t│", count);
                }
                else if (i == 1)
                {
                    Console.Write("│   {0,0}", ability2.Name);
                    for (int j = 0; j < opp; j++)
                        if (ability2.Success[j] == 0)
                            count += 1;
                    if (ability2.Name.Length <= 6)
                        Console.Write("\t\t");
                    else
                        Console.Write("\t");
                    Console.Write("◆ (성공) x {0,0}\t│", count);
                }
                else
                {
                    Console.Write("│   {0,0}", ability3.Name);
                    for (int j = 0; j < opp; j++)
                        if (ability3.Success[j] == 0)
                            count += 1;
                    if (ability3.Name.Length <= 6)
                        Console.Write("\t\t");
                    else
                        Console.Write("\t");
                    Console.Write("◆ (성공) x {0,0}\t│", count);
                }
                Console.WriteLine("\n│\t\t\t\t\t│");
            }
            Console.WriteLine("└───────────────────────────────────────┘\n\nEnter 눌러주세요...");
            Console.ReadLine();
        }
    }
}

 

Ability.cs

더보기
using System;
using System.Threading;

namespace Project
{
    interface IAbility
    {
        string Name { get; set; }
        // 각인 이름
        int Opportunity { get; set; }
        // 각인 세공 횟수
        void SelectAbility(string over);
        // 한 가지 각인 선택, 매개변수는 동일한 각인 선택했는지 확인하기 위해
    }
    interface IUpgrade
    {
        int Sub { get; set; }
        //몇번째 세공인지
        int?[] Success { get; set; }
        //몇번 성공, 실패했는지 기록
        Chance Work(Chance chance);
        //세공작업
    }
    class Ability
    {
        protected string[] increase = { "각성", "강령술", "강화 방패", "결투의 대가", "구슬동자", "굳은 의지", "급소 타격", "기습의 대가", "달인의 저력", "돌격대장", "마나의 흐름", "마나 회복 증가", "바리케이드", "번개의 분노", "부러진 뼈", "분쇄의 주먹", "불굴", "선수필승", "슈퍼 차지", "승부사", "실드 관통", "안정된 상태", "약자무시", "여신의 가호", "에테르 강화", "예리한 둔기", "원한", "위기 모면", "저주받은 인형", "정기 흡수", "중갑 착용", "최대 마나 증가", "탈출의 명수", "폭발물 전문가" };
        protected string[] decrease = { "공격력 감소", "공격속도 감소", "방어력 감소", "이동속도 감소" };
        // 좋은 각인과 나쁜 각인 종류
    }
    class IncreaseAbility : Ability, IAbility, IUpgrade
    {
        public string Name { get; set; }
        public int Opportunity { get; set; }
        public int Sub { get; set; }
        public int?[] Success { get; set; }
        public void SelectAbility(string over)
        {
            int selectnum;
            while (true)
            {
                Console.WriteLine("\n-----------------------------------증가 능력-----------------------------------\n");
                for (int i = 0; i < increase.Length / 3 + 1; i++)
                {
                    if (i == 11)
                    {
                        Console.WriteLine("\t34. {0,0}\n", increase[33]);
                        break;
                    }
                    Console.Write("\t{0,0}. {1,0}", i * 3 + 1, increase[i * 3]);
                    if (i == 0)
                        Console.Write("\t");
                    Console.Write("\t\t{0,0}. {1,0}", i * 3 + 2, increase[i * 3 + 1]);
                    if (i != 9 && i != 10)
                        Console.Write("\t");
                    Console.WriteLine("\t{0,0}. {1,0}\n", i * 3 + 3, increase[i * 3 + 2]);
                }
                Console.Write("선택: ");
                bool abilityselect = int.TryParse(Console.ReadLine(), out selectnum);
                if (abilityselect)
                {
                    if (selectnum >= 1 && selectnum <= 34)
                    {
                        if (over != increase[selectnum - 1])
                        {
                            this.Name = increase[selectnum - 1];
                            //객체의 Name에 선택한 좋은 각인 대입
                            break;
                        }
                        else
                        {
                            Console.WriteLine("\n\n중복된 각인(능력)은 설정할 수 없습니다.");
                            Thread.Sleep(1000);
                            Console.Clear();
                        }
                    }
                    else
                    {
                        Console.WriteLine("\n\n범위 내에서 선택해주세요.");
                        Thread.Sleep(1000);
                        Console.Clear();
                    }
                }
                else
                {
                    Console.WriteLine("\n\n범위 내에서 선택해주세요.");
                    Thread.Sleep(1000);
                    Console.Clear();
                }
            }
            Console.Clear();
        }
        public Chance Work(Chance chance)
        {
            bool success;
            this.Sub += 1;
            success = chance.prob();
            if (success)
                this.Success[this.Sub - 1] = 0;
            else
                this.Success[this.Sub - 1] = 1;
            return chance;
        }
    }
    class DecreaseAbility : Ability, IAbility, IUpgrade
    {
        public string Name { get; set; }
        public int Opportunity { get; set; }
        public int Sub { get; set; }
        public int?[] Success { get; set; }
        public void SelectAbility(string over)
        {
            int selectnum;
            while (true)
            {
                Console.WriteLine("\n-----------------------------------감소 능력-----------------------------------\n");
                Console.WriteLine("\t1. {0,0}\t\t2. {1,0}\t3.{2,0}\n", decrease[0], decrease[1], decrease[2]);
                Console.WriteLine("\t4. {0,0}\n", decrease[3]);
                Console.Write("선택: ");
                bool abilityselect = int.TryParse(Console.ReadLine(), out selectnum);
                if (abilityselect)
                {
                    if (selectnum >= 1 && selectnum <= 4)
                    {
                        this.Name = decrease[selectnum - 1];
                        //객체의 Name에 선택한 나쁜 각인 대입
                        break;
                    }
                    Console.WriteLine("\n\n범위 내에서 선택해주세요.");
                    Thread.Sleep(1000);
                    Console.Clear();
                }
                else
                {
                    Console.WriteLine("\n\n범위 내에서 선택해주세요.");
                    Thread.Sleep(1000);
                    Console.Clear();
                }
            }
            Console.Clear();
        }
        public Chance Work(Chance chance)
        {
            bool success;
            this.Sub += 1;
            success = chance.prob();
            if (success)
                this.Success[this.Sub - 1] = 0;
            else
                this.Success[this.Sub - 1] = 1;
            return chance;
        }
    }
}

 

 

Chance.cs

더보기
using System;

namespace Project
{
    interface IChance
    {
        int InitialValue { get; set; }
        //확률 초기시작값
        int Max { get; set; }
        //확률 최대값
        int Min { get; set; }
        //확률 최소값
        int PlusMinus { get; set; }
        //성공 및 실패 시 플마되는 값
        bool prob();
        //확률 변동해주는 메서드
    }
    class Chance : IChance
    {
        Random random = new Random();
        public int InitialValue { get; set; }
        public int Max { get; set; }
        public int Min { get; set; }
        public int PlusMinus { get; set; }
        public bool prob()
        {
            int x = random.Next(1, 101);
            if (x <= this.InitialValue)
            {
                if (this.InitialValue > this.Min)
                    this.InitialValue -= this.PlusMinus;
                return true;
            }
            else
            {
                if (this.InitialValue < this.Max)
                    this.InitialValue += this.PlusMinus;
                return false;
            }
        }
    }
}

 

 

Other.cs

더보기
using System;
using System.Threading;

namespace Project
{
    class Output
    {
        //숫자로 입력할 때 잘못된 값을 입력하지 않도록 만든 오류검사 메서드
        public int NumCheck(int min, int max)
        {
            int output;
            bool check = int.TryParse(Console.ReadLine(), out output);
            if (check)
            {
                if (output < min || output > max)
                {
                    Console.WriteLine("\n\n{0,0}~{1,0} 중에 선택해주세요.", min, max);
                    return 0;
                }
                else
                    return output;
            }
            else
            {
                Console.WriteLine("\n\n{0,0}~{1,0} 중에 선택해주세요.", min, max);
                return 0;
            }
        }
    }
    class Mococo
    {
        public void printMococo()
        {
            Console.WriteLine("□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□□□□□□□□□■■■■■□□□□□□□□□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□□□□□□■■■■■■■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□□□□□■■■■■■■■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□□□□■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□□□■■■■■■■■■■□□□□□□□□□□■■■□□■□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□□■■■■■■■■■■■□□□□□□□□□■□□□■□■□□□■□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□□■■■■■■■■■■■□□□□□□□□□■□□□■■□□□■□□□□■□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□■■■■■■■■■■■■□□□□□□□□□□■■■□■□■□■□□■■□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□■■■■■■■■■■■□□□□□□□□□□□□□□□■□□□■□■■■□□□□□■");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□■■■■■■■■■■■□□□□□□□□□□□□□■□□□□□□■■□■□□□□■□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■■■■□□□■■■■■■■■■■■□□□□□□□□□□□□□■□□□□□□□□□■□□□■■□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□■■■■■■■■□■■■■■■■■■■□□□□□□□□□□□□□□■■□□□□□■■■□□□□■□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□■■■■■■■■■■■■■■■■■■■■□□□□□□□□□□□□□□□□□■□□□□■□□■□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□■■■■■■■■■■■■■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□■■■□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□■■■■■■■■■■■■■□□□□□□□□□■■■□□□□□□□□□□□□□□□□□□□□□□□□■□□□");
            Thread.Sleep(100);
            Console.WriteLine("□■■■■■■■■■■■■■□□□□□□□□□□□□□■■□□□□□□□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("■■■■■■■■■■■■□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("■■■■■■■■■■■□□□□□□□□□□□□□□□□□□□■■□□□□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□■■□□□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□■■■■■□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□■■□□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□■■□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□□□□□□□□□□□□□□□■■■□□□□□■□□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□□□□□□□□□□□□□□■□■■■□□□■■■■□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□□□□□□□□□□□□□□■□■■■□□□■□□□■□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□□□□□□□□□□□□□□■■■■■□■■□□□□■■□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□□□□□□□□□□□□□□□■■■□■□□□■■□□■□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□■□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□□□■■□□□□□□□□□□□□□□□■□□□□□□■□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□□■■■■□□□□□□■■■□□□□□■□□□□□□■□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□■□□■■■□□□□■□■□□□□□□■□□□□□□■□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□■■■■■□□□■■□□■□□□□□□■□□□□□■■□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■□□□□□□□■■■■□□□□□■■□□□□□□□■□□□□□■□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□■■□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□■□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□■□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□■■□□□□□■□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□■□□□□□□□□□□□□□□□□□□□■■□□□□□□□■□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□■■□□□□□□□□□□□□□□□□□■□□□□□□□□■■□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□■□□□□□□□□□□□□□□■■■□□□□□□□□□■□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□■■□□□□□□□□□□■■□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□■■■□□□■■■■□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□□■■■■□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
            Console.WriteLine("□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□■■□□□□□□□□□□□□□□□□");
            Thread.Sleep(100);
        }
    }
}

 

 

결과화면

프로젝트 실행 GIF

Comments