C++

[강의] 12월 19일 수업정리

k-codestudy 2024. 12. 19. 18:02

오늘의 강의는 야구 게임을 만들어 보았다. ( 내일 완성할 예정, 아직 미완성 ) 

 

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