로또 게임 만들기, 빙고게임 만들기
#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를 증가시킨다.