전체 코드

namespace CSharpGrammar
{
    // 상수와 열거형
    // 0,1,2로 된 부분을 보기가 싫다.

    // 숫자를 넣는것은 프로그램이 커질 수록 사용하면 안된다.
    enum Choice
    {
        ROCK = 1,        // 바위
        PAPER = 2,       // 보
        SCISSORS = 0     // 가위
    }

    class Program
    {
        static void Main(string[] args)
        {
            // const 상수의 개념 바꾸지 않겠다라는 의미
            // 사용하면 변경 불가
            // 가위바위보 개선 (1)
            const int ROCK = 1;
            const int PAPER = 2;
            const int SCISSORS = 0;
            Random rand = new Random();
            int aiChoice = rand.Next(0, 3); // 0 ~ 2 사이의 랜덤 값

            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 == (int)Choice.SCISSORS)
            {
                if (aiChoice == (int)Choice.SCISSORS)
                {
                    Console.WriteLine("무승부 입니다.");
                }
                else if (aiChoice == (int)Choice.ROCK)
                {
                    Console.WriteLine("패배 입니다.");
                }
                else // aiChoice == (int)Choice.PAPER
                {
                    Console.WriteLine("승리 입니다.");
                }
            }
            else if (choice == (int)Choice.ROCK)
            {
                if (aiChoice == (int)Choice.SCISSORS)
                {
                    Console.WriteLine("승리 입니다.");
                }
                else if (aiChoice == (int)Choice.ROCK)
                {
                    Console.WriteLine("무승부 입니다.");
                }
                else // aiChoice == (int)Choice.PAPER
                {
                    Console.WriteLine("패배 입니다.");
                }
            }
            else // choice == (int)Choice.PAPER
            {
                if (aiChoice == (int)Choice.SCISSORS)
                {
                    Console.WriteLine("패배 입니다.");
                }
                else if (aiChoice == (int)Choice.ROCK)
                {
                    Console.WriteLine("승리 입니다.");
                }
                else // aiChoice == (int)Choice.PAPER
                {
                    Console.WriteLine("무승부 입니다.");
                }
            }

            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("패배입니다.");
            }
        }
    }
}

1. 개요

  • 목적: C#으로 구현한 간단한 가위바위보 게임
  • 주요 기능:
    • 사용자와 컴퓨터가 각각 가위, 바위, 보 중 하나를 선택
    • 두 선택을 비교해 승리, 무승부, 패배를 결정
  • 핵심 개념: 상수(constant)와 열거형(enum)을 사용하여 코드의 가독성과 유지보수성을 높임

2. 열거형(Enums)의 정의 및 활용

  • 열거형 정의:
    enum Choice
    {
        ROCK = 1,        // 바위
        PAPER = 2,       // 보
        SCISSORS = 0     // 가위
    }
    • 역할:
      • 게임에서 사용되는 선택지를 의미있는 이름으로 표현
      • 숫자 대신 이름을 사용해 코드의 의미를 명확하게 전달
  • 장점:
    • 코드의 가독성을 높이고, 잘못된 값 사용을 방지

3. 상수(Constants)의 정의 및 활용

  • 상수 선언 예제:
    const int ROCK = 1;
    const int PAPER = 2;
    const int SCISSORS = 0;
    • 역할:
      • 열거형과 동일한 값을 상수로 선언해 다른 부분에서 재사용
      • 필요 시 값 변경을 한 곳에서 관리할 수 있음
  • 상수 vs 열거형:
    • 열거형: 코드 내에서 의미 있는 집합을 표현
    • 상수: 단순히 값을 고정시켜 여러 곳에서 활용

4. 메인 함수 구조 및 흐름

a. 컴퓨터의 선택 생성

  • 코드:
    Random rand = new Random();
    int aiChoice = rand.Next(0, 3); // 0 ~ 2 사이의 랜덤 값
  • 설명:
    • Random 객체를 사용하여 0, 1, 2 중 하나의 값을 무작위로 선택함
    • 이 값이 컴퓨터의 선택(가위, 바위, 보)을 결정

b. 사용자 입력 처리

  • 코드:
    int choice = Convert.ToInt32(Console.ReadLine());
  • 설명:
    • 콘솔 창에서 사용자가 입력한 문자열을 정수로 변환해 변수 choice에 저장

c. 선택 결과 출력

  • 사용자 선택 출력:
    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;
    }
  • 설명:
    • switch문을 통해 각 선택에 대응하는 메시지를 출력
    • 열거형 값을 정수형으로 캐스팅하여 비교

5. 승리, 무승부, 패배 계산 방법

두 가지 방법으로 결과를 결정하는 예제가 있습니다.

a. 첫 번째 방법 (중첩 if-else)

  • 코드 예제:
    if (choice == (int)Choice.SCISSORS)
    {
        if (aiChoice == (int)Choice.SCISSORS)
        {
            Console.WriteLine("무승부 입니다.");
        }
        else if (aiChoice == (int)Choice.ROCK)
        {
            Console.WriteLine("패배 입니다.");
        }
        else // aiChoice == (int)Choice.PAPER
        {
            Console.WriteLine("승리 입니다.");
        }
    }
    // ... (바위, 보의 경우도 유사하게 작성)
  • 특징:
    • 사용자 선택별로 모든 경우의 수를 세분화하여 처리
    • 조건이 많아 코드가 길어질 수 있음

b. 두 번째 방법 (간결한 조건문)

  • 코드 예제:
    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("패배입니다.");
    }
  • 특징:
    • 먼저 무승부인 경우를 체크
    • 승리 조건만 명시하고, 나머지는 모두 패배로 간주
    • 조건이 간결해 가독성이 높고 유지보수가 용이

profile
李家네_공부방

0개의 댓글