C/실습

[C] 랜덤함수를 이용한 가위바위보 게임

Sehyeok20 2021. 4. 13. 16:54
반응형

가위바위보 게임

랜덤함수를 사용해 위처럼 간단한 가위바위보 게임을 만들어 보도록 하자.

 

먼저 변수부터 생성한다.

int com, me;
int win = 0;
int draw = 0;
int lose = 0;
int check = 0;
char *chcom = "";
char *chme = "";

내가 입력할 값과 컴퓨터의 값을 저장할 me와 com

이기고 지고 비기는 결과를 저장할 win, draw, lose 변수

컴퓨터와 나의 대결 결과를 구분해줄 check변수,

컴퓨터와 내가 가위 바위 보 중 어떤 것을 냈는지 보여줄 chcom, chme 변수 등이 있겠다.

 

먼저 rand함수를 이용해서 com에 1부터 3까지 임의의 수를 저장해준다.

그리고 내가 내는 값을 me변수에 저장한다.

while문을 이용하여 계속 반복할 것이므로 while문 안에서 값을 저장한다.

srand(time(NULL));

while (1) {
	com = rand() % 3 + 1;
	printf("가위(1), 바위(2), 보(3) 중 하나를 입력하세요 : (종료는 0) ");
	scanf_s("%d", &me);
}

종료하는 구문이 있어야 하므로 입력받는 값이 0 인 경우 종료하도록 처리한다.

if (me == 0) {
	printf("종료합니다.\n 총 전적 : %d 승 %d 무 %d 패\n", win, draw, lose);
	break;
}

그리고 1에서 3까지의 숫자가 아닌 경우를 처리할 구문을 만들어준다.

if (me < 0 || me > 3) {
	printf("입력 오류! 1에서 3까지의 숫자만 입력해주세요\n\n");
	continue;
}

이제 입력받은 me 값과 랜덤한 com의 값을 비교한다.

가장 먼저 생각할 수 있는 경우는 두 값이 같은 경우 (비기는 경우) 이므로 이 경우를 if문으로 분리해준다.

if (me == com) {
	draw++;
	if (me == 1){
		chme = "가위";
	}
	if (me == 2) {
		chme = "바위";
	}
	if (me == 3) {
		chme = "보";
	}

	printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 비겼습니다.\n", chme, chme);
	printf("현재 전적 : %d 승  %d 무  %d 패\n\n", win, draw, lose);
	continue;

}

각 경우에서 "가위", "바위", 또는 "보" 를 문자열을 저장할 chme, chcom에 저장해주고 비긴 결과를 출력한다.

 

다음으로는 이기는 경우와 지는 경우이다.

if (com == 1) {
	chcom = "가위";
    if (me == 2) {
		chme = "바위";
		check = 1;
		win++;
	}
	else if (me == 3) {
		chme = "보";
		check = 0;
		lose++;
	}

}
else if (com == 2) {
	chcom = "바위";
    if (me == 3) {
		chme = "보";
		check = 1;
		win++;
	}
	else if (me == 1) {
		chme = "가위";
		check = 0;
		lose++;
	}

}
else {
	chcom = "보";
	if (me == 1) {
		chme = "가위";
		check = 1;
		win++;
	}
	else if (me == 2) {
		chme = "바위";
		check = 0;
		lose++;
	}

}

이긴다면 check에 1 진다면 0을 저장해주고 각 win과 lose변수를 하나씩 증가시켜준다.

각 chme, chcom에 어떤 것을 냈는지 문자열을 저장해준다.

 

이제 check를 판별하여 이겼는지 졌는지 확인한 후 출력하기만 하면 된다.

if (check == 1) {
	printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 이겼습니다.\n", chcom, chme);
}
else {
	printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 졌습니다.\n", chcom, chme);
}

printf("현재 전적 : %d 승  %d 무  %d 패\n\n", win, draw, lose);

전체 코드를 보면 다음과 같다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int main() {
	int com, me;
	int win = 0;
	int draw = 0;
	int lose = 0;
	int check = 0;
	char* chcom = "";
	char* chme = "";

	srand(time(NULL));

	while (1) {
		com = rand() % 3 + 1;
		printf("가위(1), 바위(2), 보(3) 중 하나를 입력하세요 : (종료는 0) ");
		scanf_s("%d", &me);

		if (me == 0) {
			printf("종료합니다.\n 총 전적 : %d 승 %d 무 %d 패\n", win, draw, lose);
			break;
		}
		if (me < 0 || me > 3) {
			printf("입력 오류! 1에서 3까지의 숫자만 입력해주세요\n\n");
			continue;
		}
		if (me == com) {
			draw++;
			if (me == 1) {
				chme = "가위";
			}
			if (me == 2) {
				chme = "바위";
			}
			if (me == 3) {
				chme = "보";
			}

			printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 비겼습니다.\n", chme, chme);
			printf("현재 전적 : %d 승  %d 무  %d 패\n\n", win, draw, lose);
			continue;

		}

		if (com == 1) {
			chcom = "가위";
			if (me == 2) {
				chme = "바위";
				check = 1;
				win++;
			}
			else if (me == 3) {
				chme = "보";
				check = 0;
				lose++;
			}

		}
		else if (com == 2) {
			chcom = "바위";
			if (me == 3) {
				chme = "보";
				check = 1;
				win++;
			}
			else if (me == 1) {
				chme = "가위";
				check = 0;
				lose++;
			}

		}
		else {
			chcom = "보";
			if (me == 1) {
				chme = "가위";
				check = 1;
				win++;
			}
			else if (me == 2) {
				chme = "바위";
				check = 0;
				lose++;
			}

		}

		if (check == 1) {
			printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 이겼습니다.\n", chcom, chme);

		}
		else {
			printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 졌습니다.\n", chcom, chme);
		}

		printf("현재 전적 : %d 승  %d 무  %d 패\n\n", win, draw, lose);


	}
}

 

 

이 구문을 다음과 같이 switch문을 이용할 수 있다. 조금 더 직관적으로 볼 수 있다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int main() {
	int com, me;
	int win = 0;
	int draw = 0;
	int lose = 0;
	int check = 0;
	char *chcom = "";
	char *chme = "";
	
	srand(time(NULL));
	
	while (1) {
		com = rand() % 3 + 1;
		printf("가위(1), 바위(2), 보(3) 중 하나를 입력하세요 : (종료는 0) ");
		scanf_s("%d", &me);

		if (me == 0) {
			printf("종료합니다.\n 총 전적 : %d 승 %d 무 %d 패\n", win, draw, lose);
			break;
		}
		if (me == com) {
			draw++;
			if (me == 1){
				chme = "가위";
			}
			if (me == 2) {
				chme = "바위";
			}
			if (me == 3) {
				chme = "보";
			}

			printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 비겼습니다.\n", chme, chme);
			printf("현재 전적 : %d 승  %d 무  %d 패\n\n", win, draw, lose);
			continue;

		}

		switch (me) {
		case 1:
			chme = "가위";
			if (com == 3) {
				chcom = "보";
				check = 1;
				win++;
				break;
			}
			else {
				chcom = "바위";
				check = 0;
				lose++;
				break;
			}
			

		case 2:
			chme = "바위";
			if (com == 1) {
				chcom = "가위";
				check = 1;
				win++;
				break;
			}
			else {
				chcom = "보";
				check = 0;
				lose++;
				break;
			}
			
		case 3:
			chme = "보";
			if (com == 2) {
				chcom = "바위";
				check = 1;
				win++;
				break;
			}
			else {
				chcom = "가위";
				check = 0;
				lose++;
				break;
			}
			
		default:
			check = -1;
			break;

		
		}
		
			
		if (check == -1) {
			printf("입력 오류! 1에서 3까지의 숫자만 입력해주세요\n\n");
			continue;
		}
		else if (check == 1) {
			printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 이겼습니다.\n", chcom, chme);

		}
		else {
			printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 졌습니다.\n", chcom, chme);
		}

		printf("현재 전적 : %d 승  %d 무  %d 패\n\n", win, draw, lose);

	}
}

큰 차이는 없지만 case로 구분지어 한눈에 알아보기 쉬워졌다.

 

 

 

마지막으로 가장 간단하게 코드를 작성하는 방법이 있다.

 

컴퓨터의 값(1~3) 에 3을 더한 후 내가 입력한 값(1~3)을 뺀 다음 3으로 나눈 나머지에 따라 결과를 구분할 수 있다.

코드를 보면 다음과 같다.

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


int main() {
	int com, me;
	int win = 0;
	int draw = 0;
	int lose = 0;
	int check = 0;
	char* chcom = "";
	char* chme = "";

	srand(time(NULL));

	while (1) {
		com = rand() % 3 + 1;
		printf("가위(1), 바위(2), 보(3) 중 하나를 입력하세요 : (종료는 0) ");
		scanf_s("%d", &me);
		check = ((com + 3) - me) % 3;

		if (me == 0) {
			printf("종료합니다.\n 총 전적 : %d 승 %d 무 %d 패\n", win, draw, lose);
			break;
		}
		if (me > 3 || me < 0) {
			
			printf("입력 오류! 1에서 3까지의 숫자만 입력해주세요\n\n");
			continue;
			
		}
		if (com == 1)
			chcom = "가위";
		if (com == 2)
			chcom = "바위";
		if (com == 3)
			chcom = "보";
		if (me == 1)
			chme = "가위";
		if (me == 2)
			chme = "바위";
		if (me == 3)
			chme = "보";

		if (check == 0) {
			printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 비겼습니다.\n", chcom, chme);
			draw++;
		}
		else if (check == 1) {
			printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 졌습니다.\n", chcom, chme);
			
			win++;
		}
		else {
			printf("컴퓨터는 : %s, 당신은 : %s, 결과 : 이겼습니다.\n", chcom, chme);
			
			lose++;
		}
		printf("현재 전적 : %d 승 %d 무 %d 패\n\n", win, draw, lose);

	}
}

변수는 같으나 if문의 사용이 아주 간단해졌다.

반응형