응컴프 과제 7주차

Ryan Han·2024년 10월 22일
0

로또 게임 만들기, 빙고게임 만들기

1. 로또 게임 만들기

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 45
void user_chek(int* arr_user); //사용자가 입력한 숫자 배열에 저장.

void generate_lotto_number(int* arr_lotto); 
//컴퓨터 로또번호 생성(랜덤함수 사용)

int mapping_number(int* arr_user, int* arr_lotto);
//사용자 입력 숫자와 컴퓨터가 생성한 로또번호 중 일치하는 번호 수 카운트

int arr_lotto[6] = { 0 }; //컴퓨터가 임의로 생성하는 번호 6개 저장.
int arr_user[6] = { 0 }; //사용자가 입력하는 6개 번호 저장.
void print_arr(int* arr1, int *arr2); //숫자 출력 
int main(void) {
	int cnt;
	srand((unsigned)time(NULL));
	generate_lotto_number(arr_lotto); //컴퓨터 로또 번호 생성
	user_chek(arr_user); //사용자 숫자 입력 
	print_arr(arr_user,arr_lotto);
	cnt = mapping_number(arr_lotto, arr_user);
	printf("\n 당첨 번호는 %d개 입니다.\n", cnt);
	return 0;
}
void user_chek(int* arr_user) {
	for (int i = 0; i < 6; i++) {
		scanf("%d", &arr_user[i]);
	}
}
void generate_lotto_number(int* arr_lotto) {
	int existed[46] = { 0, };//중복체크 해주기
	for (int i = 0; i < 6; i++) {
		int num = 0;
		while (existed[num]==1) {//숫자가 존재할 때까지
			num = (rand() % 45) + 1;//이 부분 정말 중요함
		}
		arr_lotto[i] = num;
		existed[num] = 1;//이미 나온 숫자이면 다시 while문으로 돌아가 난수설정 
	}	
}
int mapping_number(int* arr_user, int* arr_lotto) {
	int count = 0;
	for (int i = 0; i < 6; i++) {
		for(int j=0;j<6;j++)//이중 반복문 사용하여 두 배열의 공통인 원소 찾기
		if (arr_user[i] == arr_lotto[j]) {
			count++;
		}
	}
	return count;
}
void print_arr(int* arr1,int *arr2) {
	printf("사용자 입력: ");
	for (int i = 0; i < 6; i++) {
		printf("%d ", arr_user[i]);
	}
	printf("\n");

	printf("당첨번호(컴퓨터생성): ");
	for (int i = 0; i < 6; i++) {
		printf("%d ", arr_lotto[i]);
	}
}

<stdlib.h> : srand() 와 rand()함수를 사용하기 위해 사용
<time.h> : 함수에 현재 시간을 시드로 설정하여 난수를 더 무작위로 생성하기 위해 사용

int *arr의 뜻 : 정수형 배열을 가리키는 포인터를 나타냄. 이 코드에서는 배열의 시작 주소를 가리키는 역할을 하며 포인터를 사용함으로써 함수 내에서 배열의 값을 직접 수정할 수 있음

srand((unsigned)time(NULL)): 난수 생성기를 초기화하는 코드. time(NULL)을 사용하여 현재 시간을 시드 값으로 전달하여 매번 다른 난수가 생성되도록 합니다._
generate_lotto_number(arr_lotto): 로또 번호를 생성하는 함수 호출.
user_chek(arr_user): 사용자로부터 6개의 로또 번호를 입력받습니다.
print_arr(arr_user, arr_lotto): 입력한 번호와 컴퓨터가 생성한 로또 번호를 출력.
mapping_number(arr_lotto, arr_user): 사용자가 입력한 번호와 컴퓨터가 생성한 번호를 비교해 일치하는 개수를 cnt에 저장.
최종적으로 일치하는 번호의 개수를 출력.

generate_lotto_number 함수

> void generate_lotto_number(int* arr_lotto) {
	int existed[46] = { 0, };
	for (int i = 0; i < 6; i++) {
		int num = 0;
		while (existed[num] == 1) {
			num = (rand() % 45) + 1;
		}
		arr_lotto[i] = num;
		existed[num] = 1;
	}	
}

이 함수는 컴퓨터가 1부터 45 사이의 숫자 중에서 중복되지 않는 6개의 난수를 생성하여 arr_lotto 배열에 저장합니다.

existed[46] 배열은 난수 중복 체크를 위한 배열이다.

만약 중복 숫자가 나오면 다시 while문으로 가서 num난수를 생성해 중복 숫자가 나오지 않도록 한다.

(rand() % 45 + 1): 1에서 45 사이의 난수를 생성합니다. existed[num]이 1이면 이미 선택된 숫자이므로 다시 난수를 생성합니다.

mapping_number 함수

int mapping_number(int* arr_user, int* arr_lotto) {
	int count = 0;
	for (int i = 0; i < 6; i++) {
		for(int j = 0; j < 6; j++)
			if (arr_user[i] == arr_lotto[j]) {
				count++;
			}
	}
	return count;
}

사용자가 입력한 숫자와 컴퓨터가 생성한 숫자를 비교하여 일치하는 개수를 계산한다.

두 개의 배열을 비교하는 이중 루프를 사용하여, arr_user와 arr_lotto에서 일치하는 숫자가 있을 경우 count를 증가시킨다.

profile
소프트웨어학과 대학생

0개의 댓글