(C++) 스마트팩토리 - 23

내 이름 안찬찬·2023년 2월 26일
0
post-thumbnail

로또번호 맞추기 게임을 만들어 보자!

  • 컴퓨터가 1~25까지 수 중 랜덤으로 6개의 수 지정 (중복X)
  • 사용자도 1~25까지 수 중 원하는 숫자 6개 입력 (중복X)
  • 두 배열을 비교해서 몇 등인지 출력
  • 6개를 모두 맞추면 1등, 5개 2등 ... 한개도 맞추지 못하면 7등

첫 작성 코드

#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 << "등 입니다! 축하합니다";

}

개선사항

  1. 중복 확인 로직을 함수로 분리하여 코드를 간결하게 만들 수 있음

  2. 등수를 계산하는 로직과 출력하는 로직을 함수로 분리하여 코드를 간결하게 만들수 있음

  3. 주석을 추가하여 코드의 가독성 높이기




수정한 코드

#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))를 호출하면,
프로그램 실행 시 매번 다른 난수 시퀀스를 생성한다.
  • 이 함수를 활용해 1~25 범위의 난수를 생성하여 comp_num 배열에 저장

2. 함수 작성

중복된 숫자가 있는지 검사하는 isDuplicated() 함수 작성
맞춘 개수를 출력하고 등수를 계산해 출력하는 calculateRank() 함수 작성


3. 배열 생성

배열은 비슷한 종류의 데이터를 모아서 처리할 때 사용

컴퓨터가 선택한 숫자를 저장하는 배열 생성
사용자가 입력한 숫자를 저장하는 배열 생성


4. 반복문

반복문은 코드의 중복을 줄여주고 일정한 패턴을 가진 작업을 반복할 때 사용

for 문을 사용하여 배열을 초기화, 사용자가 숫자를 입력할 때에도 for 문을 사용함.


5. 조건문

조건문은 코드의 흐름을 제어할 때 사용.

if 문을 사용하여 범위를 벗어난 숫자나 중복된 숫자를 입력받았을 때 처리



마무리

C++의 기본적인 문법과 함수, 배열, 반복문, 조건문 등을 활용하여 구현한 예제

이번엔 함수를 사용하여 main함수 밖으로 빼놓고 작성하였는데,
수정 전 코드와 달리 중복 확인 로직과 등수 계산/출력 로직이 함수로 분리되어 가독성을 높였고 코드 재사용성이 높아졌다.

함수를 호출하여 사용하기에 코드가 간결해졌고, 필요한 경우 함수를 수정하여 함수 내부의 로직만 수정하면 되므로 코드 유지보수를 용이하게 작성하였다.

아직까진 코드가 짧아 수정할 때 불편함이 많이 없지만,
코드가 길어졌을 때 수정이 용이해지는 방법에 대해 계속 생각하며 작성해야겠다.

profile
스마트팩토리 개발자가 되기 위한 □□ !!

0개의 댓글