2024-04-23

이재형·2024년 4월 23일
0

코팅 테스트 정리

프로그래머스 (입력한 문자열 소,대문자로 변환하기)

string str = Console.ReadLine();
if (1 <= str.Length && str.Length <= 20)
{
    var text = str.Select(s => char.IsUpper(s) ? char.ToLower(s) : char.ToUpper(s));
    string invert = new string(text.ToArray());
    Console.WriteLine(invert);

기능 설명

변수타입.Select()

  1. 문자열의 한 글자씩 char타입으로 뽑아서 사용하는 기능이다.
  2. 배열이나 리스트 또는 문자열의 인자값이 존재해야 사용이 가능하다.
  3. Select()를 시작할 시 안에 인자를 지정한 변수 명을 지정해야한다.

char.IsUpper(s)

  1. char타입인 변수s가 대문자인지 확인하는 기능이다.
  2. 대문자면 true를 소문자라면 false를 반환한다.
  3. IsUpper()와 반대인 IsLower()가 있다.

char.ToLower(s) OR char.ToUpper(s)

  1. ToLower는 s를 소문자로 변경시켜주고 ToUpper는 s를 대문자로 변경해주는 기능이다.
  2. char가 아닌 string형으로 했을 때 모든 문자열이 위의 기능에 따라 전부 변경이 된다.

text.ToArray()

  1. var타입인 text를 Array 즉, 배열로 변경시켜주는 기능을 한다.

실행 사진

금일 배운 내용

메서드란

  1. 생성규칙: 변환타입 메서드 명 () {}로 이루워있다.
  2. 반환이 필요 없을 때는 void를 반환이 필요하다면 반환할 타입에 따라서 반환타입을 변수 명 앞에 작성하면 된다.
    예시 사진:
  3. 메서드는 주로 중복으로 작성할 기능들을 사용할 때 사용한다.

매개변수란

  1. 메서드 명 뒤에 있는 ()안에 들어가는 변수이다.
  2. 위의 사진처럼 int a, int b가 그에 따른 매개변수이다.
  3. 메서드에 다른 변수를 넣어서 그대로 사용하기 때문에 변수 타입과 변수 명만 들어간다.

virtual과 override

  1. 상속을 하고 나서 사용이 가능하다.
  2. virtual은 부모의 메서드 override는 자식의 메서드에 사용된다.
  3. override인 메서드에 해당 virtual의 내용을 실행하게 하는 base()를 추가할 수 있다.

구현 내용(Main은 맨 마지막)

1. 플레이어 정보 갱신

struct Info
{
    public int level = 1;   // 레벨
    public string name; // 직업
    public int str;     // 공격력
    public int def;     // 방어력
    public int hp;      // 체력
    public int gold;    // 골드
    public int currentNum = 0; // 현재 장비 개수

    public equipment weapon = new equipment();
    public equipment armor = new equipment();

    // 구조체 생성 시 기본 정보 등록
    public Info()
    {
        level = 1;
        name = "이름없는 모험가";
        str = 10;
        def = 5;
        hp = 100;
        gold = 1500;
    }

    public void InfoShow()
    {
        Console.WriteLine("-------------------------------");
        Console.WriteLine("상태 보기");
        Console.WriteLine("캐릭터의 정보가 표시됩니다.");
        Console.WriteLine($"LV. {level}");
        Console.WriteLine($"이름: {name} ( 전사 )");
        Console.WriteLine($"공격력: {str} + {weapon.vaule}");
        Console.WriteLine($"방어력: {def} + {armor.vaule}");
        Console.WriteLine($"체  력: {hp}");
        Console.WriteLine($"Gold: {gold}G");
        Console.WriteLine("-------------------------------\n");

        Console.WriteLine("0. 나가기");
        Console.WriteLine("\n원하시는 행동을 입력해주세요. ");
        Console.Write(">> ");
        string text = Console.ReadLine();
        if(text != "0")
        {
            Console.WriteLine("잘못된 입력입니다.\n");
            InfoShow();
        }
    }
  1. 원래 InfoShow()를 구조체 안에 추가함
  2. 따로 플레이어의 정보에 메서드를 출력할 수 있게 함

2. 장비 정보 갱신

struct equipment
{
    public string name;      // 장비 이름
    public string equipType; // 장비 타입 정보(공격력, 방어력)
    public string introduct; // 장비 소개
    public bool choice;      // 장비 타입 선택
    public bool equipCheck;  // 장비 착용 여부
    public bool buyCheck = false;    // 장비 구매 여부
    public int vaule;        // 스탯 수치
    public int gold;         // 장비 가격
    public equipmentType type;

    public equipment(string name, bool choicem, int value, string introduct, int gold, equipmentType type)
    {
        this.name = name;
        this.choice = choicem;
        this.vaule = value;
        this.equipCheck = false;
        this.introduct = introduct;
        this.gold = gold;
        this.type = type;

        // 장비 능력에서 방어력과 공격력 선택
        if (choice)
        {
            equipType = "공격력";
        }
        else
        {
            equipType = "방어력";
        }
    }
}
  1. enum으로 장비 타입을 추가함

3. 선택지 계속 선택 갱신

// 선택지(계속 실행)
static void Select(Info playerInfo, equipment[] equipments)
{
    Console.WriteLine("-----------------------------------------");
    Console.WriteLine("1. 상태 보기");
    Console.WriteLine("2. 인벤토리");
    Console.WriteLine("3. 상점");
    Console.Write("\n원하시는 행동을 입력해주세요:");
    Console.Write(">> ");
    string str = Console.ReadLine();
    Console.WriteLine("-----------------------------------------\n");
    switch (str)
    {
        case "1":
            playerInfo.InfoShow();
            break;
        case "2":
            Inventory();
            break;
        case "3":
            Shop(equipments);
            break;
        default:
            Console.WriteLine("잘못된 선택지 입니다. 다시 입력해주세요!");
            Select(playerInfo, equipments);
            break;
    }
}
  1. int.tryParse를 사용할 이유가 생각해보니 없어서 삭제하고 코드를 줄임
  2. 메서드들의 매개변수를 Class에 static으로 처리하여 매개변수에 넣지않게 함

4. 아이템 생성 갱신

        // 아이템 생성
        static equipment[] CreatItem(equipment[] equipments)
        {
            // 무기
            equipments[0] = new equipment("나무 검", true, 2, "마을의 어린이들이 연습용으로 사용하는 검이다.", 100, equipmentType.weapon);
            equipments[1] = new equipment("녹슨 검", true, 4, "아직 쓸모있지만 언제 부숴질지 모르는 검이다.", 500, equipmentType.weapon);
            equipments[2] = new equipment("철퇴", true, 7, "짧지만 그만큼 힘이 뭉쳐있다고 전해지는 몽둥이다.", 1500, equipmentType.weapon);
            equipments[3] = new equipment("철 검", true, 10, "웬만한 모험가들은 들수도 없이 무거운 검이다.", 3000, equipmentType.weapon);
            equipments[4] = new equipment("엑스칼리버", true, 20, "적의 침략에 맞서라 지킬 힘을 줄테니", 7777, equipmentType.weapon);

            // 방어구
            equipments[5] = new equipment("천갑옷", false, 3, "처음 모험을 떠나는 모험가들의 기본 갑옷이다.", 300, equipmentType.armor);
            equipments[6] = new equipment("철갑옷", false, 5, "숙련된 모험가들이 착용하는 철로 만든 갑옷이다.", 1000, equipmentType.armor);
            equipments[7] = new equipment("판금갑옷", false, 10, "나라의 한손가락의 강함을 가진 모험가의 갑옷이다.", 3000, equipmentType.armor);
            equipments[8] = new equipment("영광의 판금갑옷", false, 15, "두려워하는 전사는 반드시 패할것이니", 10000, equipmentType.armor);

            // 악세사리
            equipments[9] = new equipment("반지", false, 5, "손가락뿐만 아니라 몸 전체를 보호해준다는 반지다.", 10000, equipmentType.accessories);
            equipments[10] = new equipment("귀걸이", false, 10, "누군가 만든지는 모르지만 사용자의 몸을 보호해주는 귀걸이다.", 20000, equipmentType.accessories);
            equipments[11] = new equipment("목걸이", true, 5, "예뻐보이지만 착용한 사람의 힘을 증폭시켜주는 목걸이다.", 7000, equipmentType.accessories);
            equipments[12] = new equipment("벨트", true, 10, "허리를 보호해줄것 같지만 몸이 건강해지는 벨트다.", 15000, equipmentType.accessories);
  1. enum으로 추가한 장비 타임을 구조체 생성시 매개변수로 추가함

5. 인벤토리

// 인벤토리
static void Inventory()
{
    Console.WriteLine("-------------------------------");
    Console.WriteLine("인벤토리");
    Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.\n");
    Console.WriteLine("[아이템 목록]");

    foreach (equipment equipment in playerEquipments)
    {
        int count = 0; // 장비 순서
        if (equipment.name != null)
        {
            count++;
            // 해당 장비가 장착 중인 장비라면
            if (playerInfo.weapon.name == equipment.name || playerInfo.armor.name == equipment.name)
            {
                Console.WriteLine($"- {count} [E]{equipment.name} | {equipment.equipType} +{equipment.vaule} | {equipment.introduct}\n");
            }
            else
            {
                Console.WriteLine($"- {count} {equipment.name} | {equipment.equipType} +{equipment.vaule} | {equipment.introduct}\n");
            }
        }
    }

    Console.WriteLine("\n1. 장착 관리");
    Console.WriteLine("0. 나가기");
    Console.WriteLine("\n원하시는 행동을 입력해주세요.");
    Console.Write(">> ");
    string text = Console.ReadLine();

    switch (text)
    {
        case "0": // 나가기
            break;

        case "1": // 장착 관리
            Console.WriteLine("\n장착할 번호를 입력해주세요.");
            Console.Write(">> ");
            int num = int.Parse(Console.ReadLine());
            // 장비가 무기라면
            if (playerEquipments[num - 1].type == equipmentType.weapon)
            {
                // 선택한 무기로 변경
                playerInfo.weapon = playerEquipments[num - 1];
                Console.WriteLine($"{playerInfo.weapon.name}을(를) 장착했습니다.");
            }
            else if (playerEquipments[num - 1].type == equipmentType.armor)
            {
                // 선택한 방어구로 변경
                playerInfo.armor = playerEquipments[num - 1];
                Console.WriteLine($"{playerInfo.weapon.name}을(를) 장착했습니다.");
            }
            Console.WriteLine("해당 장비를 장착했습니다");
            break;

        default:
            Console.WriteLine("잘못된 입력입니다.\n");
            Inventory();
            break;
    }
    Console.WriteLine("-------------------------------");
}
  1. 먼저 플레이어가 가지고 있는 장비 정보 playerEquipments를 foreach문으로 순서대로 출력함
  2. ReadLine()으로 나가기와 장착관리를 입력받아서 switch문으로 나눔
  3. 장착관리 시 번호를 입력하라고 ReadLine()로 입력 받아서 해당 장비 순서에 따른 정보를 플레이어의 장비 정보로 저장
  4. 그 후 다시 인벤토리를 불러오면 갖고 있는 장비일 때 장비 출력이 [E]를 추가함

6. 구매

static void BuyEquipment()
{
    Console.Write("구매할 아이템의 이름을 적어주세요: ");
    string ItemName = Console.ReadLine();

    int count = 0; // 장비 순서
    foreach (equipment equipment in equipments)
    {
        // 구매할 아이템의 이름이 존재한지 비교
        if(ItemName == equipment.name)
        {
            // 장비한 아이템이 구매된 건지 확인
            if(equipment.buyCheck)
            {
                Console.WriteLine("이미 구매한 아이템입니다.");
                break;
            }
            else
            {
                string buyText = true == equipment.buyCheck ? "구매완료" : equipment.gold.ToString();
                Console.WriteLine("구매할 아이템의 정보입니다.");
                Console.WriteLine($"- {equipment.name} | {equipment.equipType} +{equipment.vaule} | {equipment.introduct} | {buyText}");

                Console.WriteLine("아이템을 구매하시겠습니까?");
                Console.WriteLine("1. 네");
                Console.WriteLine("2. 아니요");
                Console.Write("\n원하시는 행동을 입력해주세요:");
                Console.Write(">> ");
                string str = Console.ReadLine();

                switch (str)
                {
                    case "1": // 네
                        if(equipment.gold <= playerInfo.gold)
                        {
                            Console.WriteLine($"{equipment.name}을(를) 구매하였습니다.");
                            playerEquipments[playerInfo.currentNum] = equipment;
                            playerInfo.currentNum++; // 플레이어가 가진 장비 개수 증가
                            equipments[count].buyCheck = true; // 해당 아이템 구매 여부 변경
                            playerInfo.gold -= equipment.gold; // 구매했으니 골드 감소
                        }
                        else
                        {
                            Console.WriteLine("Gold가 부족하여 구매를 실패하였습니다.");
                        }
                        break;
                    case "2": // 아니요
                        Console.WriteLine("아이템 구매를 취소하였습니다.");
                        break;
                    default:
                        Console.WriteLine("잘못된 입력입니다.");
                        break;
                }
            }
        }

        // 모든 아이템을 비교하고 아이템이 존재하지 않을 때
        if (equipment.name == equipments[equipments.Length-1].name)
        {
            Console.WriteLine("입력한 아이템은 존재하지 않습니다.");
            Shop(equipments);
        }
        count++;
    }
}
  1. 상점에서 아이템 구매를 선택하면 실행되는 메서드다.
  2. 구매할 아이템을 ReadLine()으로 입력받고 foreach()로 플레이어의 장비 목록의 이름을 if로 조건을 달음
  3. 조건에 맞을 시 해당 골드와 플레이어의 골드를 비교하여 성립하면 플레이어의 골드를 해당 장비의 골드만큼 제거하고 플레이어의 장비 목록에 해당하는 장비를 추가함
  4. 만약 골드보다 작다면 구매를 실패했다고 출력하게 함

배운 내용

숫자 맞추기 게임

Random random = new Random();
Console.WriteLine("숫자 맞추기 게임에 오신 것을 환영합니다!");
Console.WriteLine("게임의 규칙은 간단합니다.");
Console.WriteLine("10번의 기회동안 랜덤 숫자를 맞추시면 승리합니다.");
Console.Write("랜덤 숫자의 최대 값을 입력하세요: ");
int maxNum = int.Parse(Console.ReadLine());
int playerNum; // 플레이어 숫자
int comNum = random.Next(0, maxNum);
int count = 10;

while (true)
{
    Console.WriteLine("-----------------------------------------------------");
    Console.WriteLine($"현재 남은 기회는 {count}번 남으셨습니다.");
    Console.Write("숫자를 입력해주세요: ");
    playerNum = int.Parse(Console.ReadLine());

    // 플레이어 숫자와 컴퓨터의 랜덤 숫자와 같다면
    if (playerNum == comNum)
    {
        Console.WriteLine("축하드립니다. 숫자를 맞추셨습니다!!!");
        break;
    }
    else if (playerNum > comNum)
    {
        Console.WriteLine("땡! 더 낮은 숫자를 입력해 주세요!");
    }
    else
    {
        Console.WriteLine("땡! 더 높은 숫자를 입력해 주세요!");
    }
    Console.WriteLine();

    count--; // 시도 횟수 증가
    if (count == 0)
    {
        Console.WriteLine("시도 횟수가 10번을 넘어 탈락하셨습니다!");
        Console.WriteLine($"랜덤의 숫자의 값은 {comNum}였습니다!");
        break;
    }
}
  1. 처음 maxNum변수에 입력하여 그 값을 토대로 랜덤 최대 숫자를 변수에 저장
  2. while문으로 기회를 만들어 10회 소모시 break로 게임 탈락 텍스트 출력하게 함
  3. 반복할 때마다 플레이어가 ReadLine()으로 값을 받아 랜덤 숫자와 비교함
  4. 매치시 성공, 낮으면 낮은 숫자를 입력, 높으면 높은 숫자를 입력하라고 출력하게 함

2. 컴퓨터 틱택토게임

static Random random = new Random();
static char[,] TicTacTo = new char[3, 3];
static bool GameEnd = true;

// 맵 생성
static void MapInstant()
{
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            TicTacTo[i, j] = '◆';
        }
    }
    ViewMap();
}

// 현재 맵 상태
static void ViewMap()
{
    Console.WriteLine("---------------------------------------------------");
    Console.WriteLine("현재 진행 중인 맵의 상태입니다!");
    Console.WriteLine("비어있는 자리는 ◆로 표시합니다.");
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            Console.Write(" | " + TicTacTo[i, j]);
        }
        Console.WriteLine(" |");
    }
}

// 플레이어의 칸 선택
static void SelectMark()
{
    Console.Write("선택하실 가로 위치를 입력해주세요: ");
    int row = int.Parse(Console.ReadLine());
    Console.Write("선택하실 세로 위치를 입력해주세요: ");
    int column = int.Parse(Console.ReadLine());

    if (TicTacTo[column - 1, row - 1] == '○' || TicTacTo[column - 1, row - 1] == '□')
    {
        Console.WriteLine("선택하신 자리는 이미 표시가 된 자리입니다.");
        Console.WriteLine("다시 입력해주세요");
        SelectMark();
    }
    else
    {
        TicTacTo[column - 1, row - 1] = '○';
        Console.WriteLine("자리를 선택하셨습니다!\n");
    }
}

// 컴퓨터의 칸 선택
static void ComSelectMark()
{
    while (true)
    {
        // 컴퓨터는 랜덤으로 좌표 설정
        int column = random.Next(0, 3);
        int row = random.Next(0, 3);
        if (TicTacTo[column, row] == '○' || TicTacTo[column, row] == '□')
        {
            continue;
        }
        else
        {
            TicTacTo[column, row] = '□';
            break;
        }
    }

    Console.WriteLine("컴퓨터가 자리를 선택했습니다.");
    ViewMap();
}

// 게임 끝 여부
static void GameCheck(char Select)
{
    int count = 0;  // 표식 개수
    int column = 0; // 가로 개수
    int row = 0;    // 세로 개수
    bool cross = false; // 대각선 여부

    // 가운데가 현재 자신의 표식일 때
    if (TicTacTo[1, 1] == Select)
    {
        if (TicTacTo[0, 0] == Select && TicTacTo[2, 2] == Select)
        {
            cross = true;
        }
        else if (TicTacTo[0, 2] == Select && TicTacTo[2, 0] == Select)
        {
            cross = true;
        }
    }

    // 가로 or 세로 빙고일 때
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            if (TicTacTo[i, j] != '◆')
            {
                // 공간들이 모두 ◆이 아닐 경우 게임이 비기게 함
                count++;
            }

            // 세로줄 비교
            if (TicTacTo[i, j] == Select)
            {
                row++;
            }

            // 가로줄 비교
            if(TicTacTo[j, i] == Select)
            {
                column++;
            }
        }

        // 세로 3개 같은 표식이라면
        if (row == 3 || column == 3)
        {
            // 한줄에 같은 표식이므로 반복문을 끝냄
            break;
        }
        // 세로 3개 같은 표식이 아니라면
        else
        {
            // 다시 0으로 변경
            row = 0;
            column = 0;
        }
    }

    // 해당 승리 조건 만족 시
    if (row == 3 || column == 3 || cross == true) // 승리
    {
        if (Select == '□')
        {
            Console.WriteLine("컴퓨터의 승리입니다.");
        }
        else
        {
            Console.WriteLine("플레이어의 승리입니다.");
        }
        ViewMap();
        GameEnd = false;
    }
    else if (count == 9) // 비김
    {
        Console.WriteLine("모든 칸을 선택할 동안 끝나지않아 비겼습니다.");
        GameEnd = false;
    }
}

static void Main(string[] args)
{
    // 첫 게임 소개
    Console.WriteLine("안녕하세요! 틱택토 게임에 오신걸 환영합니다!!!");
    Console.WriteLine("플레이어는 '○', 컴퓨터는 '□'의 표식을 가집니다!");
    Console.WriteLine("게임을 시작하도록 하겠습니다!!!");

    // 맵 생성
    MapInstant();
    while (true)
    {
        // 게임 시작 시 플레이어 먼저 선택
        SelectMark();
        // 게임이 끝났는지 확인
        GameCheck('○');
        if (GameEnd == false)
        {
            break;
        }
        // 그 다음 컴퓨터 차례
        ComSelectMark();
        // 게임이 끝났는지 확인
        GameCheck('□');
        if (GameEnd == false)
        {
            break;
        }
    }
 }   

정리

진행 사항(스파르타 던전 Text게임)

1. 상점에서 장비 구매, 실패, 취소 구현

2. 인벤토리에서 장비 장착 후 장착한 장비에 [E]같이 출력

3. 플레이어 구조체 추가 갱신로 저장

4. 장비에 enum으로 타입 추가 갱신

해결 못한 문제

1. 스파르타 Text게임의 추가 요구사항

문제점

1. 코드 최적화 필요

profile
한국사람

0개의 댓글