가위바위보 게임 만들기

2015. 3. 24. 02:25엘키스공간/엘키스코딩공방

728x90
728x90

1. 과제 내용

온 국민의 게임인 가위바위보 게임 만들기.

사용자에게 한글 "가위", "바위", "보"를 직접 입력받고

컴퓨터와 대결하여 승자를 출력하는 프로그램이다.

 

2. 결과 영상

 

3. 설계

- 마인드맵

큰 가지

입력 - 열거형, 가위바위보 영어로(Scissors, Rock, Paper), 비교(strcmp, 2byte~4byte), 한글로 입력받아보자!

출력 - 승자출력(UI 형태 고민), 이어하기(y/n)

예외처리 - 숫자x, 문자만 받기, while 반복문으로 제어

변수 - 사용자 손, 컴퓨터 손, 한글 받을 변수

 

 

- 수도코드

베스킨 라빈스의 과오를 극복하기 위해 좀 더 자세한 수도코드를 작성해봤다.

기능은 함수로 나누고 메인함수에서 한번에 함수 호출을 볼 수 있도록 작성했다.

 

 

- 순서도

 

 

4. 구현 코드

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#define TRUE 1

/*
    작성일 : 2015.03.17
    작성자 : 조민혁
    설명 : 가위 바위 보 게임.
*/

enum { ROCK, SCISSORS, PAPER }; // 묵찌빠 열거형

void PrintStartMessege();
void InputHand(int playerHand, char inputHan[] ,char printRSP[][5]);
void PrintWinner(int playerHand, int comHand);
void GenerateRandomHand(int * comHand);

void main(void)
{
    char inputHan[20];
    char printRSP[3][5] = {"바위", "가위", "보"};
    int continueChar = 0;
    int playerHand = 0;
    int comHand = 0;

    // 시작 메뉴 출력
    PrintStartMessege();

    while(TRUE){
        // 사용자로부터 문자 입력
        InputHand(&playerHand, inputHan , printRSP);

        printf("당신이 낸 것 : %s\n", printRSP[playerHand]);
        
        // 컴퓨터 가위, 바위, 보 만들기    
        GenerateRandomHand(&comHand);

        printf("컴퓨터가 낸 것 : %s\n", printRSP[comHand]);

        // 승자비교 및 출력
        PrintWinner(playerHand, comHand);

        // 컨티뉴 조건
        while(getchar() != '\n');
        printf("계속 하실래요? 0. 계속! 1. 그만! ");
        scanf_s("%d", &continueChar, 1);
        if (continueChar == 1)
        {
            puts("게임을 종료합니다.");
            break;
        }
    }
}

void PrintStartMessege()
{
    puts("작성일 2015.03.17 작성자 조민혁");
    puts("지금부터 '가위 바위 보'게임을 시작합니다.");
}

void PrintWinner(int playerHand, int comHand)
{
    if ((playerHand == 0 && comHand == 1) ||
            (playerHand == 1 && comHand == 2) ||
            (playerHand == 2 && comHand == 0))
        {
            puts("당신의 승리입니다!");
        }
        else if ((playerHand == 0 && comHand == 0) ||
            (playerHand == 1 && comHand == 1) ||
            (playerHand == 2 && comHand == 2))
        {
            puts("비겼습니다!");
        }
        else
        {
            puts("당신의 패배입니다!");
        }
}

void GenerateRandomHand(int * comHand)
{
    srand((unsigned int)time(NULL));
     *comHand = rand()%3;
}

void InputHand(int* playerHand, char inputHan[] ,char printRSP[][5])
{
    puts("가위, 바위, 보 중 하나를 입력해주세요.");
        while(TRUE)
        {
            scanf_s("%s",inputHan, 20);
            // 예외처리. 가위, 바위, 보로 들어오는지 검사
            if (strcmp(inputHan, printRSP[0]) == 0)
            {
                *playerHand = ROCK;
                break;
            }
            else if (strcmp(inputHan, printRSP[1]) == 0)
            {
                *playerHand = SCISSORS;
                break;
            }
            else if (strcmp(inputHan, printRSP[2]) == 0)
            {
                *playerHand = PAPER;
                break;
            }
            else
            {
                puts("다시 입력해주세요! 가위, 바위, 보만 입력할 수 있습니다.");
            }
        }
}

 

728x90
반응형

'엘키스공간 > 엘키스코딩공방' 카테고리의 다른 글

큐로 메시지 큐 구현하기  (0) 2015.06.10
큐 구현하기  (0) 2015.06.10
[코딩] 스택 구현하기  (1) 2015.06.10
베스킨라빈스 31 게임  (0) 2015.03.24
발전하는 성적표 관리 시스템  (0) 2015.03.24
반복문  (0) 2015.03.23
문자열 함수 구현해보기  (2) 2015.03.10