코팅 테스트 정리
프로그래머스 (입력한 문자열 소,대문자로 변환하기)
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()
- 문자열의 한 글자씩 char타입으로 뽑아서 사용하는 기능이다.
- 배열이나 리스트 또는 문자열의 인자값이 존재해야 사용이 가능하다.
- Select()를 시작할 시 안에 인자를 지정한 변수 명을 지정해야한다.
char.IsUpper(s)
- char타입인 변수s가 대문자인지 확인하는 기능이다.
- 대문자면 true를 소문자라면 false를 반환한다.
- IsUpper()와 반대인 IsLower()가 있다.
char.ToLower(s) OR char.ToUpper(s)
- ToLower는 s를 소문자로 변경시켜주고 ToUpper는 s를 대문자로 변경해주는 기능이다.
- char가 아닌 string형으로 했을 때 모든 문자열이 위의 기능에 따라 전부 변경이 된다.
text.ToArray()
- var타입인 text를 Array 즉, 배열로 변경시켜주는 기능을 한다.
실행 사진
금일 배운 내용
메서드란
- 생성규칙: 변환타입 메서드 명 () {}로 이루워있다.
- 반환이 필요 없을 때는 void를 반환이 필요하다면 반환할 타입에 따라서 반환타입을 변수 명 앞에 작성하면 된다.
예시 사진:
- 메서드는 주로 중복으로 작성할 기능들을 사용할 때 사용한다.
매개변수란
- 메서드 명 뒤에 있는 ()안에 들어가는 변수이다.
- 위의 사진처럼 int a, int b가 그에 따른 매개변수이다.
- 메서드에 다른 변수를 넣어서 그대로 사용하기 때문에 변수 타입과 변수 명만 들어간다.
virtual과 override
- 상속을 하고 나서 사용이 가능하다.
- virtual은 부모의 메서드 override는 자식의 메서드에 사용된다.
- 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();
}
}
- 원래 InfoShow()를 구조체 안에 추가함
- 따로 플레이어의 정보에 메서드를 출력할 수 있게 함
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 = "방어력";
}
}
}
- 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;
}
}
- int.tryParse를 사용할 이유가 생각해보니 없어서 삭제하고 코드를 줄임
- 메서드들의 매개변수를 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);
- 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("-------------------------------");
}
- 먼저 플레이어가 가지고 있는 장비 정보 playerEquipments를 foreach문으로 순서대로 출력함
- ReadLine()으로 나가기와 장착관리를 입력받아서 switch문으로 나눔
- 장착관리 시 번호를 입력하라고 ReadLine()로 입력 받아서 해당 장비 순서에 따른 정보를 플레이어의 장비 정보로 저장
- 그 후 다시 인벤토리를 불러오면 갖고 있는 장비일 때 장비 출력이 [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++;
}
}
- 상점에서 아이템 구매를 선택하면 실행되는 메서드다.
- 구매할 아이템을 ReadLine()으로 입력받고 foreach()로 플레이어의 장비 목록의 이름을 if로 조건을 달음
- 조건에 맞을 시 해당 골드와 플레이어의 골드를 비교하여 성립하면 플레이어의 골드를 해당 장비의 골드만큼 제거하고 플레이어의 장비 목록에 해당하는 장비를 추가함
- 만약 골드보다 작다면 구매를 실패했다고 출력하게 함
배운 내용
숫자 맞추기 게임
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;
}
}
- 처음 maxNum변수에 입력하여 그 값을 토대로 랜덤 최대 숫자를 변수에 저장
- while문으로 기회를 만들어 10회 소모시 break로 게임 탈락 텍스트 출력하게 함
- 반복할 때마다 플레이어가 ReadLine()으로 값을 받아 랜덤 숫자와 비교함
- 매치시 성공, 낮으면 낮은 숫자를 입력, 높으면 높은 숫자를 입력하라고 출력하게 함
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;
}
}
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++;
}
}
if (row == 3 || column == 3)
{
break;
}
else
{
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. 코드 최적화 필요