반응형
숫자 야구 게임
숫자 생성(배열에 담기)
- 배열에 담은 0~9 숫자들은 추후 랜덤하게 세 개 뽑을 예정.
for (int i = 0; i < 10; i++)
{
number[i] = i;
}
숫자 섞기 (배열 섞기)
- For문과 임의로 만든 temp변수를 활용하여 배열 인덱스 순서를 섞는다.
for (int i = 0; i < 1000; i++)
{
dest = rand() % 10;
sour = rand() % 10;
temp = number[dest];
number[dest] = number[sour];
number[sour] = temp;
}
숫자 뽑기(Computer)
- 플레이어가 맞춰야 할 세 개의 숫자를 comNumber[i]에 담음
for (int i = 0; i < 3; i++)
{
comNumber[i] = number[i];
if (i == 0) std::cout << "컴퓨터가 낸 숫자 : " ;
std::cout << comNumber[i];
}
숫자 선택(Player)
- 플레이어로 부터 숫자 세 개를 입력 받음.
- while문은 턴 제를 의미하며 10턴을 초과하게 되면 게임이 종료 됨.
while (round <= 10) {
str = "";
std::cout << std::endl << "ROUND : (" << round << "/10)" << std::endl;
for (int i = 0; i < 3; i++)
{
std::cout << i + 1 << "번째 숫자를 입력하세요.";
std::cin >> myNumber[i];
}
숫자 및 자리수 체크
- 2중 For문을 돌리는 이유는 플레이어 인덱스를 기준으로 컴퓨터 인덱스를 모두 순회하면서 숫자 값이 일치하는지 체크할 수 있어서.
- 같은 숫자가 있으면 최소 볼이고 자리수 까지 맞으면 스트라이크
- k 인덱스에서 숫자를 발견하지 못해 flag 값이 false > true로 바뀌지 않는다면 k for문에서 i for문으로 넘어 갈 때 outflag변수를 만나 아웃 처리 됨.
i = 0일 때 (0,0 0,1 0,2) O
i = 1일 때 (1,0 1,1 1,2) S
i = 2일 때 (2,0 2,1 2,2) B
for (int i = 0; i < 3; i++) // 2중 for문 사용하는 이유는 나의 숫자와 컴퓨터의 숫자가 같은지 체크하기 위함
{
bool outFlag = false;
for (int k = 0; k < 3; k++)
{
if (myNumber[i] == comNumber[k]) // 이게 중요한듯
{
if (i == k) {
str += "S ";
} else {
str += "B ";
}
outFlag = true;
break;
}
}
if (!outFlag) {
str += "O ";
}
}
정답 체크
- 턴 마다 세 개의 숫자 모두를 맞췄는지 체크하며, 게임 종료 조건은 스트라이크 세 개가 나와야 종료가 되는 것임.
std::cout << str;
bool isEqual = true;
for (int i = 0; i < 3; i++) {
if (comNumber[i] != myNumber[i]) {
isEqual = false;
break; // 숫자가 하나라도 다르면 더 이상 비교할 필요 없으므로 반복문 탈출
}
}
if (isEqual) {
std::cout << "정답!" << std::endl;
break;
}
else {
std::cout << (round >= 10 ? "게임오버" : "실패!");
round++;
}
}
}
코드 전문
#include <iostream>
int main() {
srand(time(NULL));
int number[10]; //0~9
int comNumber[3];//3
int myNumber[3];//3
int round = 1;
int dest, sour, temp;
std::string str = "";
//숫자 번호
for (int i = 0; i < 10; i++)
{
number[i] = i;
}
//숫자 섞기
for (int i = 0; i < 1000; i++)
{
dest = rand() % 10;
sour = rand() % 10;
temp = number[dest];
number[dest] = number[sour];
number[sour] = temp;
}
//여기까지 왔으면 번호가 섞여있는 상태
for (int i = 0; i < 3; i++)
{
comNumber[i] = number[i];
//if (i == 0) std::cout << "컴퓨터가 낸 숫자 : " ;
//std::cout << comNumber[i];
}
std::cout << std::endl;
while (round <= 10) {
str = "";
std::cout << std::endl << "ROUND : (" << round << "/10)" << std::endl;
for (int i = 0; i < 3; i++)
{
std::cout << i + 1 << "번째 숫자를 입력하세요.";
std::cin >> myNumber[i];
}
for (int i = 0; i < 3; i++) // 2중 for문 사용하는 이유는 나의 숫자와 컴퓨터의 숫자가 같은지 체크하기 위함
{
bool outFlag = false;
for (int k = 0; k < 3; k++)
{
if (myNumber[i] == comNumber[k]) // 이게 중요한듯
{
if (i == k) {
str += "S ";
} else {
str += "B ";
}
outFlag = true;
break;
}
}
if (!outFlag) {
str += "O ";
}
}
std::cout << str;
bool isEqual = true;
for (int i = 0; i < 3; i++) {
if (comNumber[i] != myNumber[i]) {
isEqual = false;
break; // 숫자가 하나라도 다르면 더 이상 비교할 필요 없으므로 반복문 탈출
}
}
if (isEqual) {
std::cout << "정답!" << std::endl;
break;
}
else {
std::cout << (round >= 10 ? "게임오버" : "실패!");
round++;
}
}
}
반응형
'정리필요' 카테고리의 다른 글
C++ 포인터와 참조자를 함수의 매개변수로 사용하면? (0) | 2024.03.01 |
---|---|
C++ 구조체의 이해, 필요성, 생성방법 정리 (2) | 2024.02.28 |
C++ while 문 사용해서 컴퓨터와 가위바위보 하기 (0) | 2024.02.22 |
C++ if문,if/else문, switch문, pragma region 사용방법 정리 (0) | 2024.02.21 |
c++ 자료형 / 비트 연산자 등 정리 (0) | 2024.02.20 |