본문 바로가기

c++ 공부기록

c++ 야구게임 만들기(따라만들기)(배열이용)

이번엔 if, for, 배열, srand()을 이용한 야구게임을 만들겁니다

 코드를 이해하기 쉽게 주석을 넣었으니

천천히 읽으면서 해보시기 바래요

아 그리고 이건 유튜브에 있는걸 따라 해본겁니다

 

#include "pch.h"
#include <iostream> 
#include  <string>
#include  <time.h>

using namespace std;

/*
야구게임 만들기
1. 1~9 사이 중복되지 않는 랜덤 숫자 3개를 가져옴
2. 3개의 숫자는 0 0 0 의 형태로 출력되고 이 3개의 숫자를 맞추는 게임
3.3개의 숫자를 맞출떄까지 계속 3개씩 숫자를 입력함
4. 예) 맞춰야할 숫자가 7 3,8 일 경우 
-사용자 입력: 1 2 4 를 입력할 경우 1 2 4는 맞춰야할 숫자가 없으므로 out를 출력
- 7 4 9 를 입력했을 경우 7은 맞춰야 할 숫자이고 위치도 같으므로 strike이다 5 9는 없으므로 tstrike Oball을 출력함
-7 8 6을 입력했을 경우 7은 1 strike 8은 숫자는 있지만 위치가 다르므로 ball됨 1 strike를 출력함
5.이렇게 최종적으로 3개의 숫자와 자리까지 모두 일치하게 입력하면 게임 종료, 만약 입력받은 숫자중 한개라도 0이 있으면 게임종료
*/
int main()
{
srand((unsigned int)time(0));

int number[9] = {};

//1~9까지의 숫자를 설정
for (int i = 0; i < 9; i++)
{
number[i] = i + 1;
}

//설정된 숫자를 셔플로 섞어서 중복되지 않는 숫자를 랜덤으로 출력

int x, y, T;

for (int i = 0; i < 100; i++)
{
x = rand() % 9;
y = rand() % 9;

//셔플
T = number[x];
number[x] = number[y];
number[y] = T;
}

cout << " *\t*\t*" << endl;
//cout << number[0] << "\t" << number[1] << "\t" << number[2] << " \t" << endl;

//스트라이크, 볼
int strike = 0, ball = 0;
int input[3]; // 입력받는 값 저장
int gameCount = 1;//진행되는 카운트를 보기위한

//사용자 입력받기
while (true)
{
cout << gameCount << " 회" << endl;
cout << "1 ~ 9 의 숫자중 3개를 입력하세요" << "(0번 입력시 게임 종료번) : ";
cin >> input[0] >> input[1] >> input[2];

//0번 입력시 종료
if (input[0] == 0 || input[1] == 0 || input[2] == 0)
{
cout << "0번이 입력되어 게임을 종료함";
break;
}

//// 입력한 숫자가 0보다 작거나 9보다 클 경우 다시 입력
else if (input[0] < 0 || input[0] > 9 ||
input[1] < 0 || input[1] > 9 ||
input[2] < 0 || input[2] > 9)
{
cout << "숫자를 잘못 입력 하셨습니다." << endl;
continue; //while 시작점으로 돌아감
}

//중복될 경우
else if (input[0] == input[1] || input[0] == input[2] ||
input[1] == input[2])
{
cout << "중복된 숫자를 입력 하였습니다." << endl;
continue; //while 시작점으로 돌아감
}

strike = ball = 0; //매번 수가 달라지기 떄문에 0으로 초기화하고 다시 계산한다

//i for문은 맞춰야 할 숫자의 인덱스를 구한다.
for (int i = 0; i < 3; i++)

//j for문은 입력받은 숫자의 인덱스를 구한다.
for (int j = 0; j < 3; j++)
{
if (number[i] == input[j]) 
//숫자가 같을떄, i는 맞춰야할 숫자 j는 입력한 숫자
//즉 첫번쨰 값과 입력받은 ㅅ수자의 첫번쨰,두번쨰,세번쨰를 차례대로 비교해서 같은 값이 있는지 찾아낸다
{
if (i == j) //숫자도 같고 자리값도 같을떄 strike
{
strike++; //i가 0이고 j가 0이면 자리가 같다는 뜻
//자리값이 같을떄 찾는  방법은 배열에서 자리값을 나타내는건 인덱스고 인덱스로 쓰고 있는건 i,j임
}
else//숫자는 같지만 자리가 다를경우는 ball
{
ball++;
}

break;//비교할게 없으므로 빠져나감
}
}
}
//strike가 3개 다 맞출경우
if (strike == 3)
{
cout << "숫자를 모두 맞췄습니다." << endl;
cout << "정답은 " << number[0] << "\t" << number[1] << "\t" << number[2] << " 입니다!" << endl;
break;
}
//strike, ball이 0일떄 즉 하나도 맞추지 못했을 경우
else if (strike == 0 && ball == 0)
{
cout << "Out" << endl;
}
else
{
cout << " strike : " << strike  << "점" << " / " << "ball : "  << ball << "점" << endl;
}

gameCount++;
}
}