두번째 프로젝트 : 컴퓨터와 게임하기 (가위바위보)

2주차 C언어 구현 프로젝트를 시작합니다.

C언어를 배울 때 기본적으로 게임을 만들때 컴퓨터와 게임하는 것을 배웁니다.
이를 활용하여 컴퓨터와 게임하기를 만들어보겠습니다.
이번에는 컴퓨터와 가위바위보를 해보겠습니다.
우리는 가위,바위,보를 직접 선택할 수 있지만 컴퓨터는 하지 못합니다.
그래서 컴퓨터는 랜덤으로 정할 수 있도록 해줘야 하는데, 이때 사용하는 것이 ramdom함수입니다.
ramdom함수는 무작위로 숫자를 정해주는 것이며, 이를 사용하기 위해서는 <stdlib.h> 헤더파일을 사용합니다.

문제 제기 - 컴퓨터와 가위바위보하기

컴퓨터에 값을 무작위로 생성시킵니다. 이때 가위 바위 보를 진행하여 자신이 낸 것과 비교하며
결과값을 출력합니다. 그리고 이 과정을 종료시키기 전까지 무한대로 반복시킵니다.

무한대로 반복시키기 위해서 while(1)을 사용합니다.
그리고 가위,바위,보를 1,2,3이라고 하였을 때 컴퓨터에 값을 com = rand() % 3 + 1처럼 부여를 합니다.
이는 랜덤한 값을 무작위로 만든 후 1~3으로 만들기 위해서입니다.

일반적인 가위바위보 코딩 구현

#include <stdio.h> 
#include <stdlib.h> // rand(),srand() 함수 사용을 위한 헤더파일 
#include <time.h> // time()함수 사용을 위한 헤더파일

void main()
{
	int game = 0;
	int com; // 컴퓨터의 값
	int user; // 유저의 값
	int result[3] = { 0, 0, 0}; // 게임 결과 저장 (이김, 무승부, 짐) 
	int total = 0; // 게임 총 횟수 
	srand(time(NULL)); // 난수 초기화

	while (1) // 사용자가 종료할 때 까지 반복합니다. 
	{
		com = rand() % 3 + 1; // 1~3 값 중 하나를 저장 
		printf("가위 바위 보 게임을 시작합니다!!\n");
			printf("(1. 가위 / 2. 바위 / 3. 보 / 0. 종료)\n\n");
			scanf_s("%d", &user);
			if (user > 0 && user < 4) // 정상적으로 입력하였을 때
			{
				total++; // 총 게임 횟수 증가
				// 컴퓨터가 이미 랜덤으로 저장되어 있는 값 출력 
				printf("\n컴퓨터 : %s\n", (com == 1 ? "가위" : com == 2 ? "바위" : "보"));
				printf("사용자 : %s\n\n", (user == 1 ? "가위" : user == 2 ? "바위" : "보"));

				if (com == user) // 비길 때
				{
					printf("비겼습니다.\n\n");
					result[1]++; 
				}

				else if (((com == 1) && (user == 3)) ||
					((com == 2) && (user == 1)) ||
					((com == 3) && (user == 2))) // 질 때
				{
					printf("컴퓨터가 이겼습니다..you lose\n\n");
					result[2]++;  
				}

				else  //이길 때

				{
					printf("당신이 이겼습니다.you win!\n\n");
					result[0]++;  
				}
				printf("%d전 %d승 %d무 %d패\n\n", total, result[0], result[1], result[2]);
				system("pause");
				system("cls");
			}

			else 
			{
				if (user == 0) 
				{
					printf("게임을 종료합니다.\n");
					break; 
				} 
				printf("숫자를 제대로 입력해주세요\n\n");
				system("pause");
				system("cls");
			}
	}
}

추가로 전체 게임 수, 그리고 얼마나 이기고 졌는지를 확인하기 위해 result 배열을 새로 만들어
여기에 값을 넣어놓고 if문에 따라 증가시킨다음 출력하도록 만들었습니다.

삼세판 게임으로 만들기

추가로 계속 반복만 하는 것은 재미가 없어서 삼세판으로 만들어
3번 이기거나 지면 종료하도록 만들어 보았습니다.
이는 while 무한 반복문안에 if문을 따로 넣어 이긴 횟수와 진 횟수를 본 후
3이 되면 해당 문구를 출력시키고 끝내도록 하였습니다.

if (result[0] == 3)
{
				printf("최종 : 당신이 이겼네요 축하합니다!!\n");
				break;
			}

else if (result[2] == 3) 
{
				printf("최종 : 컴퓨터가 이겼네요 아깝습니다..\n");
				break;
			}

모드가 있는 가위바위보 게임 만들기

최종적으로 모드가 있는 게임을 만들면 좋을 것 같아 추가로 구현해보았습니다.
이때 game이라는 변수를 하나 더 만들어 앞의 코드들 앞에 선택을 할 수 있도록 합니다.
하지만, 만약 해당 모드를 게임하는 중에 메인화면으로 가고 싶으면 어떨까요??
그래서 각각의 모드들을 함수로 만들어놨습니다.
if문을 통해 해당 함수로 넘어간 후 그 함수에서 빠져나오고 싶으면 return;을 사용하면 됩니다.

최종 코드

#include <stdio.h> 
#include <stdlib.h> // rand(),srand() 함수 사용을 위한 헤더파일 
#include <time.h> // time()함수 사용을 위한 헤더파일


void game1() {
	int game = 0;
	int com; // 컴퓨터의 값
	int user; // 유저의 값
	int result[3] = { 0, 0, 0 };// 게임 결과 저장 (이김, 무승부, 짐) 
	int total = 0; // 게임 총 횟수 
	srand(time(NULL)); // 난수 초기화
	while (1) // 사용자가 종료할 때 까지 반복합니다. 
	{
		com = rand() % 3 + 1; // 1~3 값 중 하나를 저장 
		printf("가위 바위 보 게임을 시작합니다!!\n");
		printf("(1. 가위 / 2. 바위 / 3. 보 / 0. 메인화면)\n\n");
		scanf_s("%d", &user);
		if (user > 0 && user < 4) // 정상적으로 입력하였을 때
		{
			total++; // 총 게임 횟수 증가
			// 컴퓨터가 이미 랜덤으로 저장되어 있는 값 출력 
			printf("\n컴퓨터 : %s\n", (com == 1 ? "가위" : com == 2 ? "바위" : "보"));
			printf("사용자 : %s\n\n", (user == 1 ? "가위" : user == 2 ? "바위" : "보"));

			if (com == user) // 비길 때
			{
				printf("비겼습니다.\n\n");
				result[1]++;
			}

			else if (((com == 1) && (user == 3)) ||
				((com == 2) && (user == 1)) ||
				((com == 3) && (user == 2))) // 질 때
			{
				printf("컴퓨터가 이겼습니다..you lose\n\n");
				result[2]++;
			}

			else  //이길 때

			{
				printf("당신이 이겼습니다.you win!\n\n");
				result[0]++;
			}
			printf("%d전 %d승 %d무 %d패\n\n", total, result[0], result[1], result[2]);
			system("pause");
			system("cls");
		}

		else
		{
			if (user == 0)
			{
				printf("메인화면으로 돌아갑니다.\n");
				system("pause");
				system("cls");
				result[0] = 0, result[1] = 0, result[2] = 0;
				return;
			}
			printf("숫자를 제대로 입력해주세요\n\n");
			system("pause");
			system("cls");
		}
	}
}

void game2() {
	int game = 0;
	int com; // 컴퓨터의 값
	int user; // 유저의 값
	int result[3] = { 0, 0, 0 }; // 게임 결과 저장 (이김, 무승부, 짐) 
	int total = 0; // 게임 총 횟수 
	srand(time(NULL)); // 난수 초기화

	while (1) // 사용자가 종료할 때 까지 반복합니다. 
	{
		com = rand() % 3 + 1; // 1~3 값 중 하나를 저장 
		printf("삼세판 가위바위보를 시작합니다!!\n");
		printf("(1. 가위  /  2. 바위  / 3. 보 / 0. 메인화면)\n\n");
		scanf_s("%d", &user);
		if (user > 0 && user < 4) // 정상적으로 입력하였을 때
		{
			total++; // 총 게임 횟수 증가
			// 컴퓨터가 이미 랜덤으로 저장되어 있는 값 출력 
			printf("\n컴퓨터 : %s\n", (com == 1 ? "가위" : com == 2 ? "바위" : "보"));
			printf("사용자 : %s\n\n", (user == 1 ? "가위" : user == 2 ? "바위" : "보"));

			if (com == user) // 비길 때
			{
				printf("비겼습니다.\n\n");
				result[1]++;
			}

			else if (((com == 1) && (user == 3)) ||
				((com == 2) && (user == 1)) ||
				((com == 3) && (user == 2))) // 질 때
			{
				printf("컴퓨터가 이겼습니다..you lose\n\n");
				result[2]++;
			}

			else  //이길 때

			{
				printf("당신이 이겼습니다.you win!\n\n");
				result[0]++;
			}
			printf("%d전 %d승 %d무 %d패\n\n", total, result[0], result[1], result[2]);

			if (result[0] == 3) {
				printf("최종 : 당신이 이겼네요 축하합니다!!\n\n");
				printf("메인화면으로 돌아갑니다.\n");
				result[0] = 0, result[1] = 0, result[2] = 0;
				system("pause");
				system("cls");
				return;
			}

			else if (result[2] == 3) {
				printf("최종 : 컴퓨터가 이겼네요 아깝습니다..\n\n");
				printf("메인화면으로 돌아갑니다.\n");
				result[0] = 0, result[1] = 0, result[2] = 0;
				system("pause");
				system("cls");
				return;
			}
			system("pause");
			system("cls");
		}

		else
		{
			if (user == 0)
			{
				printf("메인화면으로 돌아갑니다.\n");
				result[0] = 0, result[1] = 0, result[2] = 0;
				system("pause");
				system("cls");
				return;
			}
			printf("숫자를 제대로 입력해주세요\n\n");
			system("pause");
			system("cls");
		}
	}
}
void main()
{
	int game = 0;
	while (1) {
		printf("가위 바위 보 게임을 시작합니다!!\n");
		printf("게임 모드를 선택하세요\n");
		printf("1. 일반 / 2. 삼세판 / 0. 종료\n");
		scanf_s("%d", &game);
		if (game == 1) {
			game1();
		}
		else if (game == 2) {
			game2();
		}
		else {
			if (game == 0)
			{
				printf("게임을 종료합니다.\n");
				return 1;
			}
			printf("숫자를 제대로 입력해주세요\n\n");
			system("pause");
			system("cls");
		}
	}
}

이때 메인화면으로 돌아갈 때 이기고 비기고 진 횟수들을 초기화시켜
게임을 다시 실행할 때 처음부터 할 수 있도록 만들었습니다.

정리

ramdom함수를 이용하여 컴퓨터에 무작위 숫자를 부여하고 게임을 할 수 있도록 만들어보았습니다.
그리고 while 무한 반복을 통해 직접 종료할 때까지 게임을 진행하도록 만들었고
변수 하나를 설정하여 모드를 선택할 수 있게 만든 다음
함수로 이동하여 해당 모드를 진행할 수 있게 만들었습니다.
삼세판은 3번 지거나 이길 때 다시 메인화면으로 돌아가게 하였고,
일반 모드는 끝내고 싶을때까지 계속 할 수 있습니다.
이를 조금 발전시켜 게임 모음으로 만들어볼 예정입니다.

Comments