전편에 이어서 카드게임을 만들어 볼거에요.

 

일단 적용할 블랙잭의 룰을 생각해봅시다.

 

  • 21 이상이면 버스트
  • J, Q, K 카드는 10
  • A 카드는 1
  • 합이 더 크면 승

전 위와 같은 룰로 제작을 해 볼거에요.

//코인 부족 체크
if (coin < 10)
{
	if (AskRegame())
	{
		reGame = true;
		return false;
	}
	return false;
}

먼저 낙장불입을 막아줄게요.

//카드 부족 체크
if (Remain <= 0)
{
	if (AskRegame())
		reGame = true;
	return false;
}

게임할 때 카드가 부족하면 안되겠죠?

printf("Your Bet Coin : ");
scanf_s("%d", &m_betCoin);
if (m_betCoin < 0)
	m_betCoin = 0;

이제 베팅 부분인데, 아래에 if문은 만약 마이너스 값을 입력하는 바보같은 경우를 미리 차단해둔 거에요.

m_die = true;
coin -= (m_betCoin + 1);

혹시 다이를 선택하는 경우도 있으니 미리 체크해둡니다.

bool Cardcompare(int temp[5])
{
}

카드를 비교할 함수를 만들어줍니다.

 

이제 남은건 카드의 비교겠져?

int m_temp[5];
for (int i = 0; i < 5; i++)
{
	m_temp[i] = temp[i] % 13 + 1;
	if (m_temp[i] == 1)
		m_temp[i] = 10;
	if (m_temp[i] == 13)
		m_temp[i] = 10;
	if (m_temp[i] == 12)
		m_temp[i] = 10;
}

카드가 총 52장으로 모양별로 13장씩 4모양이니까 13으로 나머지계산을 한 후 +1을 해줍니다.

 

13(K)을 13으로 나눌 경우 0이 되니까 그 부분과 Q, J 카드도 10으로 처리해줍니다.

for (int i = 0; i < 3; i++)
{
	if (temp[i] == -1)
	{
	}
	else
	{
		m_psum += m_temp[i];
	}
}

카드를 뽑을때 -1로 초기화해둔 temp 의 배열을 바꿔주었기 때문에 뽑지 않았을 경우 건너뛰도록 해줍니다.

for (int i = 3; i < 5; i++)
{
	m_dsum += m_temp[i];
}

딜러는 간단하게 두장만 합쳐줍니다.

//버스트 체크
bool m_pbust = false, m_dbust = false;
if (m_psum > 21)
	m_pbust = true;

if (m_dsum > 21)
	m_dbust = true;
if (m_dsum < 15)
	m_dbust = true;
	
if (m_dbust)
	return true;
if (m_pbust)
	return false;

카드 숫자 합이 21을 넘어가게 되었을 때, 혹은 딜러가 15보다 낮을때 버스트인지 체크해줍니다.

//합 숫자 비교
bool win = false;
if (m_psum >= m_dsum)
	win = true;
else
	win = false;

return win;

이제 양쪽이 버스트가 아닐때 승리처리를 해 준 후 리턴을 해줍니다.

//카드 비교하기
if (!m_die)
{
	if (Cardcompare(temp))
	{
		coin += (m_betCoin + 1);
	}
	else
	{
		coin -= (m_betCoin + 1);
	}
}

마지막으로 승리시 배팅시만큼의 금액을, 패배시 배팅 금액을 더하거나 빼줍니다.

 

전체 코드는 아래 압축파일에 있습니다.

 

CardGame.zip
0.00MB

'프로그래밍 > C, C++ ' 카테고리의 다른 글

C,C++ 응용 - 콘솔 카드게임 만들기(전편)  (0) 2020.12.02
C, C++ 기초 - 생성자, 소멸자  (0) 2020.05.06
C,C++ 기초 - 클래스  (0) 2020.05.06
C, C++ 기초 - 포인터  (0) 2020.04.20
C, C++ 기초 - 함수  (0) 2019.08.25
Posted by 서융
:

오랜만에 다시 왔네요.

 

이번에 만들 카드 게임은 다들 한번쯤은 해보셨을 블랙잭을 만들어볼거에요.

 

필요로하는 헤더는 이렇게 되겠습니다.

#include <iostream>
#include <time.h>
#include <stdlib.h>

그리고 카드는 조커를 제외하고 52장이므로, 카드 갯수를 선언해줍니다.

#define CARD_COUNT	52

또한 남은 카드도 글로벌로 선언해줍니다.

int Remain = CARD_COUNT;

이제 남은 필요한 변수들을 생각해봅시다.

 

카드의 문양과 숫자를 지정해줄 문자열변수, 무슨 카드가 뽑혔는지 알려줄 정수형 변수, 코인, 다시할건지 물어볼 bool형 변수 이렇게 4개가 주로 사용될 변수겠죠?

 

그러면 이제 그 변수들을 선언을 해줍시다.

const char* m_card[CARD_COUNT] = {	"♠1", "♠2", "♠3", "♠4", "♠5", "♠6", "♠7", "♠8", "♠9", "♠10", "♠11", "♠12", "♠13",
					"◆1", "◆2", "◆3", "◆4", "◆5", "◆6", "◆7", "◆8", "◆9", "◆10", "◆11", "◆12", "◆13",
					"♥1", "♥2", "♥3", "♥4", "♥5", "♥6", "♥7", "♥8", "♥9", "♥10", "♥11", "♥12", "♥13", 
					"♣1", "♣2", "♣3", "♣4", "♣5", "♣6", "♣7", "♣8", "♣9", "♣10", "♣11", "♣12", "♣13"};
int m_index[CARD_COUNT];
int m_coin = 0; 
bool m_reGame = true;

이제 카드 섞기와 코인 입력 등 초기화 부분의 함수를 만들어 볼겁니다.

void InitGame(int index[CARD_COUNT], int &coin, bool &reGame)

함수의 인수부터 설명하자면, 왼쪽부터 카드 체크용 변수, 코인값, 다시 게임할지 물어봐주는 변수입니다.

for (int i = 0; i < CARD_COUNT; i++)
{
	index[i] = i;
}

먼저 카드를 처음부터 정렬해줍니다.

srand(time(NULL));
int temp;
int rn;
for (int i = 0; i < CARD_COUNT - 1; i++)
{
	rn = rand() % (CARD_COUNT - 1 - i) + i;
	temp = index[i];
	index[i] = index[rn];
	index[rn] = temp;
}

그 후 카드를 섞어줍시다. 이러면 초기화는 끝났습니다.

 

그러면 이제 인게임을 만들차례가 됬죠?

int temp[4];
for (int i = 0; i < 4; i++)
{
	temp[i] = rand() % CARD_COUNT;
	for (int j = 0; j < i; j++)
	{
		if (temp[i] == temp[j])
		{
			i--;
			break;
		}
	}
	if (index[temp[i]] == -1)
		i--;
}
for (int i = 0; i < 4; i++)
{
	index[temp[i]] = -1;
}

Remain -= 4;

카드를 이제 딜러(CPU)와 플레이어꺼 카드 총 4장을 뽑아야 하는데 카드가 중복이 되면 안되겠죠?

 

그래서 그 부분의 예외처리하는 부분과 남은 카드장수를 체크하는 부분의 코드입니다.

 

남은 코드와 내용은 다음주에 이어서 업로드 됩니다.

 

남은 부분은 블랙잭의 규칙과 배팅, 다시할지 여부가 남았습니다. 다음주에 뵈요

'프로그래밍 > C, C++ ' 카테고리의 다른 글

C,C++ 응용 - 콘솔 카드게임 만들기(후편)  (0) 2020.12.07
C, C++ 기초 - 생성자, 소멸자  (0) 2020.05.06
C,C++ 기초 - 클래스  (0) 2020.05.06
C, C++ 기초 - 포인터  (0) 2020.04.20
C, C++ 기초 - 함수  (0) 2019.08.25
Posted by 서융
:

저번시간엔 클래스를 했었죠?

 

이번엔 바로 이어지는 생성자 소멸자를 하도록 해볼게요.

 

먼저 클래스를 사용하고자 하는 곳에 클래스의 헤더 파일을 인클루드(include)해줍니다.

 

그리고 포인터 변수들을 선언하듯 선언을 해줍니다.

 

포인터 변수는 delete라는 함수를 이용해서 반드시 지워야 합니다.

 

왜냐하면 그 장소를 계속 쓰다보니 다른 변수가 있을 자리가 줄어듭니다.

 

그게 계속 쌓이다 보면 렉이 걸리게 되고 게임도 느려집니다.

 

블루스크린도 볼수있다고 해요.

 

그리 해서 간단하게 클래스를 선언하고 지우는건 이렇게 하시면 됩니다.

 

생성자, 소멸자란?

생성자는 말 그대로 생성할때, 소멸자는 말 그대로 소멸할때 실행되는 함수입니다.

 

생성자가 실행되는 정확한 시점은 다른 곳에서 클래스를 선언했을때 실행됩니다.

 

소멸자는 delete 함수를 이용해서 클래스를 지웠을 때 실행되게 됩니다.

 

 

생성자와 소멸자에 이렇게 입력 후 F5키를 누르시면,

 

이렇게 실행이 됩니다.

 

다음번 부터는 실제 게임을 제작하는걸 한번 해보도록 할게요.

 

TstoryTuto.zip
0.00MB

Posted by 서융
:

이번엔 비주얼 스튜디오 환경에서 클래스 만드는 법을 알아볼거에요.

 

먼저 클래스란 무엇이냐?

 

학교에서 생각하면 학급이에요. 즉, 몇학년 몇반 이런 것들이 똑같이 적용됩니다.

 

몇학년 몇반이 클래스 이름이고, 학생들이 클래스 내의 변수, 학생들이 뭉쳐서 무언가를 하는것, 혹은 학생들의 집합이 함수입니다.

 

 

기본은 저런 형식으로 되어있지만, 만들지 못하면 꽝이겠죠.

 

우측에 솔루션 탐색기를 보시면 이렇게 되어있죠?

 

여기에서 아무 폴더나 우클릭 하시고 추가->클래스 를 클릭하시면

이런 창이 뜨게 돼요.

 

여기에서 클래스 속성을 설정 한 후 확인을 눌러주시면 클래스가 알아서 생성이 됩니다.

 

클래스 생성은 여기까지 하도록 하겠습니다.

'프로그래밍 > C, C++ ' 카테고리의 다른 글

C,C++ 응용 - 콘솔 카드게임 만들기(전편)  (0) 2020.12.02
C, C++ 기초 - 생성자, 소멸자  (0) 2020.05.06
C, C++ 기초 - 포인터  (0) 2020.04.20
C, C++ 기초 - 함수  (0) 2019.08.25
C, C++ 응용 - for문 별그리기  (0) 2019.05.21
Posted by 서융
:

포인터란, 말 그대로 "무언가를 가리키는 것" 입니다.

일상 생활에서 "저것좀 갖고와바" 와 같이 말 할때, "저것"이 포인터입니다.

 

흐음... 대충 어느 물건의 있는 장소 라고 아시면 될 것 같습니다.

포인터를 지정해줄 땐 * 를 이용해서 쓰고, 변수형과 변수명 사이에 어디에 넣든 상관없습니다.

예시) int* a, int * a, int *a

일단 한번 아래를 따라 쳐 봅시다.

void main()
{
    int a = 10;
    int * b;


    b = &a;

    printf("%d\n", a);

 

    printf("%d\n", b);

    printf("%d\n", &a);
}

 

이걸 실행해 본 결과

맨 위에서 부터 a에 들어간 정수값, a의 주솟값의 정수형, a의 주솟값의 정수형 이렇게 됩니다.

 

즉, 10 이라는 숫자를 건네준 자리의 위치값입니다.

 

네비게이션에서도 "전방 100m 좌회전 입니다" 이러면 "전방 100m"가 포인터 입니다.

 

그리고 좌회전이 위의 코드에선 10 이라는 값이 되는것이죠.

 

포인터는 기본적으로 어려우니까 직접 해보면서 이해해보는게 중요해요.

'프로그래밍 > C, C++ ' 카테고리의 다른 글

C, C++ 기초 - 생성자, 소멸자  (0) 2020.05.06
C,C++ 기초 - 클래스  (0) 2020.05.06
C, C++ 기초 - 함수  (0) 2019.08.25
C, C++ 응용 - for문 별그리기  (0) 2019.05.21
C, C++ 기초 - 반복문 (for, while)  (0) 2019.05.06
Posted by 서융
:

함수, 즉 "function" 에 대해서 학교 수학시간에 들어본 적 있으시죠?

 

혹시 하는 일도 기억하시나요?

 

어떠한 숫자를 넣으면 계산된 값이 나오는 신기한 상자같은 공간이죠?

 

프로그래밍에서도 같아요.. 일단 아래의 코드를 볼까요?

 

int plus(int x, int y)

{

    return x + y;

}

int main()

{

    int a = 0;

    a = plus(10, 5);

    printf("%d", a);

    return 0;

}

 

뭐하는 코드처럼 보이나요?

 

plus 라는 함수 안에 들어간 두 수를 합쳐서 a라는 변수에 넣어주는 코드에요.

 

그러면 a는 초기화해뒀던 0이 아니라 15가 되겠죠?

 

함수는 int형 뿐 아니라 void 나 string 등등 여러가지 변수형으로 만들수있어요.

 

하지만 한가지 주의해야 할 점으로는 함수를 선언할때 앞에 적은 변수형과 같은 형태로밖에 내보내지를 못해요.

 

정수형으로 함수를 만들면 정수형으로 return, 문자형은 문자형으로 return해줘요.

 

이 부분을 주의하며 하시면 함수부분은 딱히 어려운게 없어요.

'프로그래밍 > C, C++ ' 카테고리의 다른 글

C,C++ 기초 - 클래스  (0) 2020.05.06
C, C++ 기초 - 포인터  (0) 2020.04.20
C, C++ 응용 - for문 별그리기  (0) 2019.05.21
C, C++ 기초 - 반복문 (for, while)  (0) 2019.05.06
C, C++ 기초 - scanf, if, switch문  (0) 2019.05.03
Posted by 서융
: