티스토리 뷰
반응형
이전 강의에 가위바위보 게임을 응용하여 묵찌빠 게임을 만들어 보았는데요.
코드를 수정하여 세번 먼저 이긴 쪽이 승리하도록
기능을 추가하였습니다.
checkGameOver( ) 함수를 작성하여 처리하였습니다.
이 함수를 통해 세번 먼저 이긴 쪽을 판단하게 됩니다.
변수는 winCntUser , winCntCom를 추가하여 이길때 마다 카운트하게 됩니다.
묵찌빠 코드 설명 강의는 이전 강의를 참고하세요.
아래 강의에서는 3선승제에 대한 설명은 없습니다.
(3선승제는 강의 이후에 요청으로 추가된 내용입니다.)
코드 분석으로 이해해 보세요~~ ㅎㅎ
1. python 소스코드
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언어 소스코드
#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;
}
}
}
}
반응형