728x90
using System;
namespace Csharp
{
class Program
{
static void Main(string[] args)
{
//0:가위 1:바위 2:보
Random rand = new Random();
//ai가 고르는 0 ~ 2사이의 랜덤 값
int aiChoice = rand.Next(0, 3);
int choice = Convert.ToInt32(Console.ReadLine());
switch (choice)
{
case 0:
Console.WriteLine("당신의 선택은 가위입니다");
break;
case 1:
Console.WriteLine("당신의 선택은 바위입니다.");
break;
case 2:
Console.WriteLine("당신의 선택은 보입니다.");
break;
}
switch (aiChoice)
{
case 0:
Console.WriteLine("컴퓨터의 선택은 가위입니다");
break;
case 1:
Console.WriteLine("컴퓨터의 선택은 바위입니다.");
break;
case 2:
Console.WriteLine("컴퓨터의 선택은 보입니다.");
break;
}
if (choice == aiChoice)
{
Console.WriteLine("무승부입니다.");
}
else if (choice == 0 && aiChoice == 2)
{
Console.WriteLine("승리입니다.");
}
else if (choice == 1 && aiChoice == 0)
{
Console.WriteLine("승리입니다.");
}
else if (choice == 2 && aiChoice == 1)
{
Console.WriteLine("승리입니다.");
}
else
{
Console.WriteLine("패배입니다.");
}
}
}
}
0, 1, 2가 굉장히 보기가 싫다.
승리 하는 부분이 자꾸 헷갈렸던 이유가
로직을 바로 짜지 못하고 위로 계속 왔다갔다 한 것 때문임.
프로그래밍이 커지면 커질수록 강제로, 인위적으로 숫자를 받아놓는건
절대로 해서는 안될 일이다. 이건 하드코딩이다.
코드를 개선해보자...!
< 하드코딩 교정 - 상수화 >
using System;
namespace Csharp
{
class Program
{
static void Main(string[] args)
{
//0:가위 1:바위 2:보
int SCISSORS = 0;
int ROCK = 1;
int PAPER = 2;
Random rand = new Random();
//ai가 고르는 0 ~ 2사이의 랜덤 값
int aiChoice = rand.Next(0, 3);
int choice = Convert.ToInt32(Console.ReadLine());
switch (choice)
{
case SCISSORS: //빨간줄
Console.WriteLine("당신의 선택은 가위입니다");
break;
case ROCK: //빨간줄
Console.WriteLine("당신의 선택은 바위입니다.");
break;
case PAPER: //빨간줄
Console.WriteLine("당신의 선택은 보입니다.");
break;
}
switch (aiChoice)
{
case SCISSORS: //빨간줄
Console.WriteLine("컴퓨터의 선택은 가위입니다");
break;
case ROCK: //빨간줄
Console.WriteLine("컴퓨터의 선택은 바위입니다.");
break;
case PAPER: //빨간줄
Console.WriteLine("컴퓨터의 선택은 보입니다.");
break;
}
if (choice == aiChoice)
{
Console.WriteLine("무승부입니다.");
}
else if (choice == SCISSORS && aiChoice == PAPER)
{
Console.WriteLine("승리입니다.");
}
else if (choice == ROCK && aiChoice == SCISSORS)
{
Console.WriteLine("승리입니다.");
}
else if (choice == PAPER && aiChoice == ROCK)
{
Console.WriteLine("승리입니다.");
}
else
{
Console.WriteLine("패배입니다.");
}
}
}
}
0, 1, 2가 남발하던 코드에서
이제 눈으로 읽히는 코드로 개선되었다. 하지만,
switch 부분에서만 ROCK, SCISSORS, PAPER 부분이 빨간줄이 뜬다.
if문과 switch문은 다르기 때문이다.
using System;
namespace Csharp
{
class Program
{
static void Main(string[] args)
{
//0:가위 1:바위 2:보
const int SCISSORS = 0; //const : 상수라는 의미. 상수로 변환했기 때문에 switch문에서 쓸 수 있다.
const int ROCK = 1; // switch문에서 변수를 상수화 해서 써먹을려면 필수인 문법.
const int PAPER = 2; // 이 설정값은 상수화 되었기에, 다시 아래에서 바꿀 수 없다.
Random rand = new Random();
//ai가 고르는 0 ~ 2사이의 랜덤 값
int aiChoice = rand.Next(0, 3);
int choice = Convert.ToInt32(Console.ReadLine());
switch (choice)
{
case SCISSORS: //빨간줄
Console.WriteLine("당신의 선택은 가위입니다");
break;
case ROCK: //빨간줄
Console.WriteLine("당신의 선택은 바위입니다.");
break;
case PAPER: //빨간줄
Console.WriteLine("당신의 선택은 보입니다.");
break;
}
switch (aiChoice)
{
case SCISSORS: //빨간줄
Console.WriteLine("컴퓨터의 선택은 가위입니다");
break;
case ROCK: //빨간줄
Console.WriteLine("컴퓨터의 선택은 바위입니다.");
break;
case PAPER: //빨간줄
Console.WriteLine("컴퓨터의 선택은 보입니다.");
break;
}
if (choice == aiChoice)
{
Console.WriteLine("무승부입니다.");
}
else if (choice == SCISSORS && aiChoice == PAPER)
{
Console.WriteLine("승리입니다.");
}
else if (choice == ROCK && aiChoice == SCISSORS)
{
Console.WriteLine("승리입니다.");
}
else if (choice == PAPER && aiChoice == ROCK)
{
Console.WriteLine("승리입니다.");
}
else
{
Console.WriteLine("패배입니다.");
}
}
}
}
const를 써서 결국 switch문을 완성하였다.
< 하드코딩 교정 - 열거형 >
using System;
namespace Csharp
{
class Program
{
enum Choice
{
SCISSORS, //0
ROCK, //1
PAPER //2
}
static void Main(string[] args)
{
//0:가위 1:바위 2:보
Random rand = new Random();
//ai가 고르는 0 ~ 2사이의 랜덤 값
int aiChoice = rand.Next(0, 3);
int choice = Convert.ToInt32(Console.ReadLine());
switch (choice)
{
case (int)Choice.SCISSORS: //빨간줄
Console.WriteLine("당신의 선택은 가위입니다");
break;
case (int)Choice.ROCK: //빨간줄
Console.WriteLine("당신의 선택은 바위입니다.");
break;
case (int)Choice.PAPER: //빨간줄
Console.WriteLine("당신의 선택은 보입니다.");
break;
}
switch (aiChoice)
{
case (int)Choice.SCISSORS: //빨간줄
Console.WriteLine("컴퓨터의 선택은 가위입니다");
break;
case (int)Choice.ROCK: //빨간줄
Console.WriteLine("컴퓨터의 선택은 바위입니다.");
break;
case (int)Choice.PAPER: //빨간줄
Console.WriteLine("컴퓨터의 선택은 보입니다.");
break;
}
if (choice == aiChoice)
{
Console.WriteLine("무승부입니다.");
}
else if (choice == (int)Choice.SCISSORS && aiChoice == (int)Choice.PAPER)
{
Console.WriteLine("승리입니다.");
}
else if (choice == (int)Choice.ROCK && aiChoice == (int)Choice.SCISSORS)
{
Console.WriteLine("승리입니다.");
}
else if (choice == (int)Choice.PAPER && aiChoice == (int)Choice.ROCK)
{
Console.WriteLine("승리입니다.");
}
else
{
Console.WriteLine("패배입니다.");
}
}
}
}
switch문에서
(상수변환)열거형함수 이름.변수
을 하면 코드가 에러없이 실행된다.
728x90
'● > 섹션 2. 코드의 흐름 제어' 카테고리의 다른 글
08. 함수(ref) (0) | 2021.07.10 |
---|---|
07.break, continue(흐름 제어) (0) | 2021.07.10 |
06. for (0) | 2021.07.10 |
05. while (0) | 2021.07.10 |
03. 가위-바위-보 게임 (0) | 2021.07.10 |