로또번호 맞추기 게임을 만들어 보자!
#include <ctime>
#include <iostream>
using namespace std;
int main() {
srand(time(NULL));
int comp_num[6] = {};
int user_num[6] = {};
int number = 6;
// 컴퓨터가 1~25 중 중복 없이 6개의 수를 무작위로 선택
for (int i = 0; i < number; i++) {
comp_num[i] = rand() % 25 + 1;
// 중복된 숫자가 선택되었을 경우 i를 감소시켜서 다시 무작위 수를 선택하도록
// 함
for (int j = 0; j < i; j++) {
if (comp_num[i] == comp_num[j]) {
i--;
break;
}
}
}
// 플레이어로부터 1~25 중 중복 없이 6개의 수를 입력받아 user_num 배열에 저장
cout << "6가지의 1~25까지의 숫자를 입력해주세요" << endl;
for (int i = 0; i < number; i++) {
cout << i + 1 << "번째 숫자를 입력하세요 : ";
cin >> user_num[i];
if (user_num[i] > 25 || user_num[i] < 1) { // 범위 지정 1~25
cout << "범위를 벗어난 숫자입니다. 다시 입력해주세요." << endl;
i--;
continue;
}
for (int j = 0; j < i; j++) {
if (user_num[i] == user_num[j]) { // 중복 확인
cout << "중복된 숫자입니다. 다시 입력해주세요." << endl;
i--;
break;
}
}
}
// comp_num에 저장된 숫자를 출력, 플레이어가 맞춘 숫자의 개수에 따라 등수를
// 출력
cout << "----------------------------------------" << endl;
cout << "당첨번호: ";
int count = 0;
for (int i = 0; i < number; i++) {
cout << comp_num[i] << " ";
// 컴퓨터가 선택한 숫자와 플레이어가 선택한 숫자를 비교하여 맞춘 숫자의
// 개수를 카운트
for (int j = 0; j < number; j++) {
if (comp_num[i] == user_num[j]) {
count++;
break;
}
}
}
cout << endl;
cout << endl;
cout << "맞춘 개수: " << count << endl;
cout << 7 - count << "등 입니다! 축하합니다";
}
개선사항
중복 확인 로직을 함수로 분리하여 코드를 간결하게 만들 수 있음
등수를 계산하는 로직과 출력하는 로직을 함수로 분리하여 코드를 간결하게 만들수 있음
주석을 추가하여 코드의 가독성 높이기
#include <ctime>
#include <iostream>
using namespace std;
// 배열 arr에 num이 있는지 확인하는 함수
bool isDuplicated(int arr[], int size, int num) {
for (int i = 0; i < size; i++) {
if (arr[i] == num) {
return true;
}
}
return false;
}
// 맞춘 개수를 바탕으로 등수를 계산하고 출력하는 함수
void calculateRank(int count) {
int rank = 7 - count;
cout << "맞춘 개수: " << count << endl;
cout << rank << "등 입니다! 축하합니다" << endl;
}
int main() {
srand(time(NULL));
const int NUMBER = 6; // 상수 설정
int comp_num[NUMBER] = {};
int user_num[NUMBER] = {};
// 컴퓨터가 1~25 중 중복 없이 6개의 수를 무작위로 선택하는 부분
for (int i = 0; i < NUMBER; i++) {
comp_num[i] = rand() % 25 + 1;
// 중복된 숫자가 선택되었을 경우 i를 감소시켜서 다시 무작위 수를 선택하도록 함
for (int j = 0; j < i; j++) {
if (comp_num[i] == comp_num[j]) {
i--;
break;
}
}
}
// 플레이어로부터 1~25 중 중복 없이 6개의 수를 입력받아 user_num 배열에 저장하는 부분
cout << "6가지의 1~25까지의 숫자를 입력해주세요" << endl;
for (int i = 0; i < NUMBER; i++) {
cout << i + 1 << "번째 숫자를 입력하세요 : ";
cin >> user_num[i];
if (user_num[i] > 25 || user_num[i] < 1) { // 범위 지정 1~25
cout << "범위를 벗어난 숫자입니다. 다시 입력해주세요." << endl;
i--;
continue;
}
if (isDuplicated(user_num, i, user_num[i])) { // 중복 확인
cout << "중복된 숫자입니다. 다시 입력해주세요." << endl;
i--;
continue;
}
}
// comp_num에 저장된 숫자를 출력, 플레이어가 맞춘 숫자의 개수에 따라 등수를 출력하는 부분
cout << "----------------------------------------" << endl;
cout << "당첨번호: ";
int count = 0;
for (int i = 0; i < NUMBER; i++) {
cout << comp_num[i] << " ";
// 컴퓨터가 선택한 숫자와 플레이어가 선택한 숫자를 비교하여 맞춘 숫자의 개수를 카운트
for (int j = 0; j < NUMBER; j++) {
if (comp_num[i] == user_num[j]) {
count++;
break;
}
}
}
cout << endl << endl;
calculateRank(count);
return 0;
}
1. srand()와 time() 함수
srand() 난수 발생 시드값을 설정 함, time() 현재 시간을 초 단위로 반환 함
이 두 함수를 조합해서 srand(time(NULL))를 호출하면,
프로그램 실행 시 매번 다른 난수 시퀀스를 생성한다.
2. 함수 작성
중복된 숫자가 있는지 검사하는 isDuplicated() 함수 작성
맞춘 개수를 출력하고 등수를 계산해 출력하는 calculateRank() 함수 작성
3. 배열 생성
배열은 비슷한 종류의 데이터를 모아서 처리할 때 사용
컴퓨터가 선택한 숫자를 저장하는 배열 생성
사용자가 입력한 숫자를 저장하는 배열 생성
4. 반복문
반복문은 코드의 중복을 줄여주고 일정한 패턴을 가진 작업을 반복할 때 사용
for 문을 사용하여 배열을 초기화, 사용자가 숫자를 입력할 때에도 for 문을 사용함.
5. 조건문
조건문은 코드의 흐름을 제어할 때 사용.
if 문을 사용하여 범위를 벗어난 숫자나 중복된 숫자를 입력받았을 때 처리
마무리
C++의 기본적인 문법과 함수, 배열, 반복문, 조건문 등을 활용하여 구현한 예제
이번엔 함수를 사용하여 main함수 밖으로 빼놓고 작성하였는데,
수정 전 코드와 달리 중복 확인 로직과 등수 계산/출력 로직이 함수로 분리되어 가독성을 높였고 코드 재사용성이 높아졌다.
함수를 호출하여 사용하기에 코드가 간결해졌고, 필요한 경우 함수를 수정하여 함수 내부의 로직만 수정하면 되므로 코드 유지보수를 용이하게 작성하였다.
아직까진 코드가 짧아 수정할 때 불편함이 많이 없지만,
코드가 길어졌을 때 수정이 용이해지는 방법에 대해 계속 생각하며 작성해야겠다.