오늘의 강의는 야구 게임을 만들어 보았다. ( 내일 완성할 예정, 아직 미완성 )
1. table.h
#pragma once
#include <stdio.h>
class C_TABLE
{
public:
enum class E_TYPE
{
E_OUT = 0,
E_BALL,
E_STRIKE,
E_MAX
};
private:
E_TYPE m_arTable[10];
public:
C_TABLE() = default;
void setTable(int* pBall, int nBallLength, int nStrike);
E_TYPE getResult(int nNumber);
};
- E_TYPE::enum class로 E_OUT, E_BALL, E_STRIKE를 정의하여 각각 고유 번호를 부여, 추가로 최대값을 나타내는 E_MAX도 포함
- m_arTable :
- 배열 크기 10인 E_TYPE 타입의 멤버 변수로, 각 숫자에 해당하는 결과값을 저장 - setTable :
볼 배열과 길이, 스트라이크 번호를 받아 데이터를 설정 - getResult :
숫자를 입력받아 해당 위치의 결과값을 반환
2. table.cpp
#include "table.h"
void C_TABLE::setTable(int* pBall, int nBallLength, int nStrike)
{
for (int i = 0; i < nBallLength; i++)
{
m_arTable[pBall[i]] = E_TYPE::E_BALL;
}
m_arTable[nStrike] = E_TYPE::E_STRIKE;
}
C_TABLE::E_TYPE C_TABLE::getResult(int nNumber)
{
return m_arTable[nNumber];
}
- setTable :
- 볼 배열의 값을 E_BALL로 설정
- 스트라이크 번호는 E_STRIKE로 저장 - getResult :
특정 숫자에 대응하는 결과값을 반환
3. game.h
#pragma once
#include<stdio.h>
#include "table.h"
class C_GAME
{
private:
int m_arResult[10];
int m_nTableSize;
int m_arUser[10];
C_TABLE* m_arTable;
private:
void makeResult();
void swap(int& nDst, int& nSrc);
bool userInput();
public:
void init(int nCount);
void run();
};
- private :
- 생성된 정답을 저장하는 배열 m_arResult[10]
- 게임에서 사용하는 숫자의 개수를 저장하는 m_nTableSize
- 사용자가 입력하는 숫자를 저장하는 m_arUser[10]
- C_TABLE 클래스 배열을 동적 할당받아 사용하는 m_arTable - private :
- 랜덤한 숫자 조합으로 정답 생성해주는 makeResult
- 두 값을 교환하는 swap
- 사용자의 입력을 받고, 중복된 값이 없는지 확인하는 userInput - public:
- 게임 초기화 ( 정답 생성 및 테이블 동적 할당) 해 주는 init
- 게임을 시작해 주는 run
4. game.cpp
#include <random>
#include "game.h"
void C_GAME::makeResult()
{
for (int i = 0; i < 10; i++)
{
m_arResult[i] = i;
}
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dist(0, 9);
for (int i = 0; i < 50; i++)
{
swap(m_arResult[dist(gen)], m_arResult[dist(gen)]);
}
}
void C_GAME::swap(int& nDst, int& nSrc)
{
int nTmp = nDst;
nDst = nSrc;
nSrc = nTmp;
}
void C_GAME::init(int nCount)
{
makeResult();
m_nTableSize = nCount;
m_arTable = new C_TABLE[m_nTableSize]{};
for (int i = 0; i < m_nTableSize; i++)
{
m_arTable[i].setTable(m_arResult, m_nTableSize, m_arResult[i]);
}
}
bool C_GAME::userInput()
{
bool arInput[10]{};
bool arInputSuccess[10]{};
arInputSuccess[m_nTableSize] = true;
int nInputCount{};
for (int i = 0; i < m_nTableSize; i++)
{
scanf_s("%d", &m_arUser[i]);
arInput[m_arUser[i]] = true;
}
for (int i = 0; i < 10; i++)
{
nInputCount += arInput[i];
}
return arInputSuccess[nInputCount];
}
void C_GAME::run()
{
printf("답 : ");
for (int i = 0; i < m_nTableSize; i++)
{
printf("%d ", m_arResult[i]);
}
printf("\n");
while (1)
{
printf("========================================\n");
while (!userInput())
{
printf("다시 입력하세요.\n");
}
int arCount[(int)C_TABLE::E_TYPE::E_MAX]{};
for (int i = 0; i < m_nTableSize; i++)
{
arCount[(int)m_arTable[i].getResult(m_arUser[i])]++;
}
printf("strike : %d\n", arCount[(int)C_TABLE::E_TYPE::E_STRIKE]);
printf("ball : %d\n", arCount[(int)C_TABLE::E_TYPE::E_BALL]);
printf("out : %d\n", arCount[(int)C_TABLE::E_TYPE::E_OUT]);
}
}
- makeResult :
- 랜덤 숫자를 생성하고 50번 썩어 정답을 m_arResult에 저장 - swap :
- 두 값을 교환하여 배열을 섞음 - init :
- makeResult를 선언하여 정답 생성 후 m_arTable을 m_nTableSize 만큼의 동적 할당을 한 후 setTable을 호출하여 결과값 설정 - userInput :
- 사용자의 입력을 받아 중복되지 않은 경우에만 진행 ( bool형으로 arInputSuccess에 m_nTableSize만큼 true를 저장하고 중복이 안되면 이후 nInputCount에 true라면 숫자가 증가 false의 숫자가 증가되지 않기에 이 방식으로 중복 체크 즉, m_nTable과 nInputCount 의 값이 같아야 함) - run :
- 정답을 출력하고 게임 루프를 실행. 사용자의 입력값과 정답을 비교해 strike, ball, out을 출력.
5. main.cpp
#include <iostream>
#include "game.h"
int main()
{
C_GAME cGame{};
cGame.init(4);
cGame.run();
}
- C_GAME cGame : 객체 선언
- init : 게임의 숫자 개수를 설정 (4개)
- run : 게임 실행
'C++' 카테고리의 다른 글
[강의] 12월 23일 수업정리 (1) | 2024.12.23 |
---|---|
[강의] 12월 20일 수업정리 (2) | 2024.12.20 |
[강의] 12월 18일 수업정리 (1) | 2024.12.18 |
[강의] 12월 17일 수업정리 (0) | 2024.12.17 |
[강의] 12월 16일 수업정리 (0) | 2024.12.16 |