본문 바로가기

결과물

[C/C++ 콘솔] 슬롯 머신

 학원 주말 과제로 슬롯머신 만들기가 있어서 제작했다. 제작 시간은 12시간 정도 되는 거 같다. 로직 자체는 어렵지 않았는데 더블 버퍼링 적용시키는 거와 꾸미는 부분에서 시간이 좀 들었다.

 

▽ main.cpp

더보기
#pragma once

#include <conio.h>
#include "function.h"
#include "printers.h"
#include "controller.h"
#include "result.h"

int main()
{
	int				slot[3][10] = {};
	int				remain = 0;
	int				money = 10000;
	int				betting = 10;
	int				pre_time = get_time();
	int				key = 0;
	int				delay = 0;

	COMMAND_STATE	cmd_state = COMMAND_STATE::SELECT;
	SELECT_STATE	cursor = SELECT_STATE::BETTING;
	RESULT			result = RESULT::NONE;

	init_time();
	init_screen();

	// Slot에 값 담은 후에 셔플해줍니다.
	for (const auto j : slot)
	{
		for (int i = 0; i < 10; i++)
		{
			j[i] = i;
		}
	}

	slot_shuffle(slot);

	// 배팅 횟수를 입력 받습니다.
	while (ENTER != key)
	{
		if (get_time() - pre_time > 20)
		{
			pre_time = get_time();
			screen_clear();

			machine_printer(money, betting, 0, slot, result);
			times_insert(remain, key);

			render();
			screen_flipping();
		}
	}

	while (-1 != remain)
	{
		screen_clear();

		if (get_time() - pre_time > 20)
		{
			pre_time = get_time();

			// 현재 상태에 따라 출력 내용을 바꿉니다.
			switch (cmd_state)
			{
			case COMMAND_STATE::SELECT:
				// 선택창에서 입력을 받아서 해당 동작을 수행합니다.
				machine_printer(money, betting, remain, slot, result);
				select_printer(cursor);
				
				if (0 != _kbhit())
				{
					cursor_controller(cursor, cmd_state, key);
				}
				break;
			case COMMAND_STATE::BETTING:
				// 슬롯을 돌립니다.
				machine_printer(money, betting, remain, slot, result);

				// 소지금보다 많이 배팅할 수 없도록 설정
				if (betting > money)
				{
					cant_betting();

					if (0 != _kbhit())
					{
						_getch();

						cmd_state = COMMAND_STATE::SELECT;
					}
				}
				else
				{
					slot_shuffle(slot);
					cmd_state = COMMAND_STATE::RESULT;
				}

				break;
			case COMMAND_STATE::RESULT:
				// 잭팟이나 매치를 확인하고 결과를 출력합니다.
				if (ENTER == key)
				{
					money -= betting;
					remain--;
					delay = 0;
					slot_check(slot, result, betting, money);
					key = 0;
				}

				machine_printer(money, betting, remain, slot, result);
				result_printer(result, betting, ++delay);

				if (0 != _kbhit())
				{
					key = _getch();

					result = RESULT::NONE;
					delay = 0;

					// 게임 결과로 인해 파산하거나 배팅 횟수가 0이되면 종료
					if (0 == remain || 10 > money)
					{
						cmd_state = COMMAND_STATE::GAME_END;
						break;
					}

					cmd_state = COMMAND_STATE::SELECT;
				}
				break;
			case COMMAND_STATE::CHANGE:
				if (ENTER == key)
				{
					key = 0;
					delay = betting;
				}

				// 딜레이 변수 이전 배팅금으로 임시 사용
				machine_printer(money, delay, remain, slot, result);
				bet_change(betting, money, key);

				if (ENTER == key)
				{
					cmd_state = COMMAND_STATE::SELECT;
				}
				break;
			case COMMAND_STATE::GAME_END:
				machine_printer(money, betting, remain, slot, result);

				// 게임 종료 이유에 대해 출력합니다.
				end_printer(0 == money, 0 == remain);

				if (0 != _kbhit())
				{
					_getch();

					remain = -1;
				}
				break;
			}
		}

		render();
		screen_flipping();
	}

	release_screen();

	return 0;
}

 main에서 슬롯 머신 코드의 핵심적인 부분들 위주로 구성해서 관리자 역할하도록 했다. 나머지는 출력 파트, 컨트롤 파트, 결과 연산 파트, 기타 필요한 함수 파트로 나뉘어 사용되었다.

 

 콘솔 더블 버퍼링 같은 경우 구글의 도움을 받지 않았으면 아마 구현 못했을테지만.. 더블 버퍼링의 개념 자체는 예전에 WINapi를 공부하며 알았기 때문에 콘솔에 적용하는 방법을 금방 익힐 수 있었던 것 같다.

 

 진행하면서 문제가 생겼던 부분이 더블 버퍼링을 적용시키니까 scanf_s를 사용할 수 없었던 점인데, 그 이유에 대해선 검색해도 찾지 못했다. 개인적으로 추측하기에는 더블 버퍼링을 사용하기 위해서 2개의 Handle을 생성해서 이 2개를 돌려가며 작업하는데, scanf에서는 이 2개의 Handle이 아닌 기본 콘솔 창에서 작업하려고 해서 생기는 문제인가? 싶은데 확실한 이유는 교수님께 여쭤보아야 할거 같다.

 아무튼 scanf를 못쓰는 문제는 _kbhit() 함수를 사용함으로써 해결되었다.

 

▽ 전체 코드 파일

Slot_machine.zip
0.25MB

'결과물' 카테고리의 다른 글

[C/C++ 콘솔] 콘웨이의 생명 게임  (0) 2021.10.31