티스토리 뷰

반응형

이전 강의에 가위바위보 게임을 응용하여 묵찌빠 게임을 만들어 보았는데요.

cflab2017.tistory.com/110

코드를 수정하여 세번 먼저 이긴 쪽이 승리하도록 

기능을 추가하였습니다.

checkGameOver( ) 함수를 작성하여 처리하였습니다.

이 함수를 통해 세번 먼저 이긴 쪽을 판단하게 됩니다.

변수는 winCntUser , winCntCom를 추가하여 이길때 마다 카운트하게 됩니다.

 

묵찌빠 코드 설명 강의는 이전 강의를 참고하세요.

아래 강의에서는 3선승제에 대한 설명은 없습니다.

(3선승제는 강의 이후에 요청으로 추가된 내용입니다.)

코드 분석으로 이해해 보세요~~ ㅎㅎ

youtu.be/61Y5O-Pq1rI

묵찌빠 python  실행결과
묵찌빠 c언어 실행결과

1. python 소스코드

main.py
0.00MB

import random

selStr = [['가위', '바위', '보'], ['찌', '묵', '빠']]

resStr = ['승리했습니다!!', '패배했습니다!!']
###################################################################
## 함수 :: 가위바위보 승패를 체크합니다.
###################################################################
def checkWin(user, com):

    if user == com:  # 비겼을때
        return 2
    elif user == 0 and com == 1:  # 가위 vs 바위
        return 1
    elif user == 1 and com == 2:  # 바위 vs 보
        return 1
    elif user == 2 and com == 0:  # 보 vs 가위
        return 1
    else:  # 나머지는 이겼을때
        return 0

def checkUser(user):
    if user < 0 or user > 2:  # 잘못입력한 것에 대한 예외처리
       print('잘못입력하였습니다. 다시 입력하세요(0,1,2)')
       return False
    return True
###################################################################
## 3선 승제!!
###################################################################
def checkGameOver():
    global attack, winCntUser, winCntCom, result
    if attack == 0:
        winCntUser += 1
        result = 0
    else:
        winCntCom += 1
        result = 1

    print("\n", resStr[attack], '스코어 : ', '사용자 ',
    winCntUser, '대', winCntCom, ' 컴퓨터')

    if winCntUser >= 3:
        print('\n## 승리하였습니다.!! 게임을 종료합니다.')
        return True
    
    if winCntCom >= 3:
        print('\n## 패배하였습니다.!! 게임을 종료합니다.')
        return True
    return False
    
###################################################################
## 가위바위보를 하여 누가 먼저 공격할지 정합니다.
###################################################################
print('\n## 안내 ## 누가 공격을 할지 정합니다.(가위 바위 보)\n')
result = 0
while True:
    user = int(input("가위(0), 바위(1), 보(2)를 선택하세요: "))
    if checkUser(user):
        com = random.randint(0,2)
        print(f'\t결과 -> 사용자({selStr[0][user]}) 컴퓨터({selStr[0][com]})')
        result = checkWin(user, com)

        if result == 2:
            print('\t비겼습니다. 가위 바위 보 다시합니다.')
        else:
            break

###################################################################
## 묵찌빠를 시작합니다.
###################################################################
print('\n## 안내 ## 묵 찌 빠를 시작합니다.')

attack = 0

print('\n## 안내 ## 3번 먼저 이기면 승리!!')
winCntUser = 0
winCntCom = 0

while True:
    if result == 0:
        print('[공격하세요] : ', end='')
        attack = 0
    elif result == 1:
        print('[수비하세요] : ', end='')
        attack = 1
    else:
        print('[다시하세요] : ', end='')

    user = int(input("묵(0), 찌(1), 빠(2)를 선택하세요 : "))
    if checkUser(user):
        #checkWin함수를 사용하기 위해 가위바위보 순으로 변경해줍니다.
        if user == 0:  # 묵
            user = 1
        elif user == 1:  # 찌
            user = 0
        com = random.randint(0, 2)
        print(f'\t결과 -> 사용자({selStr[1][user]}) 컴퓨터({selStr[1][com]})')
        result = checkWin(user, com)

        if result == 2:
            # print("\n", resStr[attack])
            # break
            if checkGameOver():
                break

        if attack == 0: #사용자가 공격하고 있을때
            if result == 1:
                attack = 1
        else:  # 컴퓨터가 공격하고 있을때
            if result == 0:
                attack = 0


 

 

2. C언어 소스코드

main.c
0.00MB

#include <stdio.h>
#include <windows.h>
#include <time.h>

unsigned char result, attack;
unsigned char winCntUser, winCntCom;

char *selStr[][3] = {{"가위", "바위", "보"}, {"찌", "묵", "빠"}};
char *resStr[] = {"승리했습니다!!", "패배했습니다!!"};
// ###################################################################
// ## 함수 :: 가위바위보 승패를 체크합니다.
// ###################################################################
unsigned char checkWin(int user, int com){

    if (user == com){  //# 비겼을때
        return 2;
    }else if (user == 0 && com == 1){  //# 가위 vs 바위
        return 1;
    }else if (user == 1 && com == 2){ //# 바위 vs 보
            return 1;
    }else if (user == 2 && com == 0){ //# 보 vs 가위
            return 1;
    }else{ //# 나머지는 이겼을때
           return 0;
    }
}

int checkUser(int user){
    if (user < 0 || user > 2){//  # 잘못입력한 것에 대한 예외처리
       printf("잘못입력하였습니다. 다시 입력하세요(0,1,2)\n");
       return 0;
    }
    return 1;
}

// ###################################################################
// ## 3선 승제!!
// ###################################################################
unsigned char checkGameOver(void)
{
    if (attack == 0){
        winCntUser += 1;
        result = 0;
    }else{
        winCntCom += 1;
        result = 1;
    }

    printf("\n %s 스코어 : 사용자 %d 대 %d 컴퓨터\n",resStr[attack],winCntUser,winCntCom);

    if (winCntUser >= 3){
        printf("\n## 승리하였습니다.!! 게임을 종료합니다.\n");
        return 1;
    }
    
    if (winCntCom >= 3){
        printf("\n## 패배하였습니다.!! 게임을 종료합니다.\n");
        return 1;
    }
    return 0;
}
void main(void){
    int user,com;
    //지역변수에서 전역변수로 전환
    // unsigned char result, attack;
    // char *selStr[][3] = {{"가위", "바위", "보" },{ "찌", "묵", "빠" }};
    // char *resStr[] = { "승리했습니다!!", "패배했습니다!!" } ;

    system("chcp 65001");
    srand(time(NULL));
    // ###################################################################
    // ## 가위바위보를 하여 누가 먼저 공격할지 정합니다.
    // ###################################################################
    printf("\n## 안내 ## 누가 공격을 할지 정합니다.(가위 바위 보)\n");
    result = 0;
    while(1){
        printf("가위(0), 바위(1), 보(2)를 선택하세요: ");
        scanf("%d", &user);
        checkUser(user);
        com = rand()%3;
        printf("\t결과 -> 사용자(%s) 컴퓨터(%s)\n", selStr[0][user], selStr[0][com]);
        result = checkWin(user, com);

        if (result == 2){
            printf("\t비겼습니다. 가위 바위 보 다시합니다.\n");
        }else{
            break;
        }
    }

// ###################################################################
// ## 묵찌빠를 시작합니다.
// ###################################################################
    printf("\n## 안내 ## 묵 찌 빠를 시작합니다.\n");

    printf("\n## 안내 ## 3번 먼저 이기면 승리!!\n");
    winCntUser = 0;
    winCntCom = 0;

    attack = 0;
    while (1){
        if (result == 0){
            printf("[공격하세요] : ");
            attack = 0;
        }else if (result == 1){
            printf("[수비하세요] : ");
            attack = 1;
        }else{
            printf("[다시하세요] : ");
        }

        printf("묵(0), 찌(1), 빠(2)를 선택하세요 : ");
        scanf("%d", &user);

        if (checkUser(user))
        {
            // #checkWin함수를 사용하기 위해 가위바위보 순으로 변경해줍니다.
            if (user == 0){//  # 묵
                user = 1;
            }else if (user == 1){//  # 찌
                user = 0;
            }
            com = rand() % 3;
            printf("\t결과 -> 사용자(%s) 컴퓨터(%s)\n", selStr[1][user], selStr[1][com]);
            result = checkWin(user, com);
            if (result == 2){
                //printf("\n%s", resStr[attack]);
                //break
                if (checkGameOver()){
                    break;
                }
            }

            if (attack == 0){ //#사용자가 공격하고 있을때
                if (result == 1)
                    attack = 1;
            }else{  //# 컴퓨터가 공격하고 있을때
                if (result == 0)
                    attack = 0;
            }
        }
    }
}
반응형