๋ฉฐ์น ์ , ๊ต์๋๊ป์ ๊ณผ์ ๋ก C์ธ์ด๋ก ๊ตฌํ๋ ๊ฒ์(ํ ํธ๋ฆฌ์ค, ๋ฏธ๋ก์ฐพ๊ธฐ)์ ๋ํ
์ฝ๋ ๋ถ์ํ๊ธฐ๋ฅผ ๋ด์ฃผ์ จ๋๋ฐ, ํ์ ๊ฒ์ ์ฝ๋๋ ์ด๋ค์์ผ๋ก ๊ตฌํ ๋ผ์์๊น
๊ถ๊ธํ๊ธฐ๋ ํ๋ ๋์ธ์ง๋ผ ์ข์ ๊ธฐํ๋ผ๊ณ ์๊ฐํ๋ค.
์ผ๋จ ์ฝ๋ ๋ถ์์ ํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ ,
๋ช ๊ฐ์ง ๊ธฐ์ค์ ์ ํ๊ณ ๊ทธ ๊ธฐ์ค์ ๋ง์กฑํ๋ ์๋ฃ๋ฅผ ์ฐพ๊ธฐ๋ก ํ๋ค.
- ๋์์ธ๋ณด๋จ ๊ธฐ๋ฅ์ ์ถฉ์คํ ๊ฒ.
- ๋ฒ๊ทธ ๋ฐ์ ์ฐ๋ ค๋ฅผ ๊ณ ๋ คํด, ํจ์ ๋๋ ์ฝ๋์ ๊ตฌ์ฑ์ด ํ๋๋ก ๋ญ์ณ์์ง ์๋ ๊ฒ.
- 2 ๋ฒ์งธ์ ์ฐ๊ด ๋ผ์๋๋ฐ ์ถํ ๊ฒ์ ์ ๋ฐ์ดํธ๋ฅผ ๊ณ ๋ คํด ์์ค์ฝ๋๊ฐ ์ฒด๊ณ์ ์ผ๋ก ๊ตฌ์ฑ ๋์๋ ๊ฒ.
์ด 3๊ฐ์ง๊ฐ ์ถฉ์กฑํ ์๋ฃ๋ฅผ ์ฐพ๊ธฐ ์ํด ๊ตฌ๊ธ ๊ฒ์์ ํตํด ๋ง์ ์ฝ๋๋ฅผ ๋ณด๊ณ
๋ด๊ฐ ์ฝ๋ ๋ถ์์ ํ๊ธฐ๋ก ํ ์๋ฃ๋, kkikkodev GitHub ํด๋น ์ฌ์ดํธ์ด๋ค.
์ต์ข ์ถ๋ ฅ ์ ๐
kkikkodev ์ด๋ ๋ถ์ด ๋ง๋์ ํ ํธ๋ฆฌ์ค ๊ฒ์์ ์์ฑ๋ณธ์ ๋ด๊ฐ ์๊ฐํ ๊ธฐ์ค์ ์ ํฉํ์๋ค.
์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ๋ดค์ ๋,
๊ฒ์ ํ๋ ์ด์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์์ ๋์ ๋์์ ์ํ,
์ ๋ฐ์ดํธ๋ฅผ ๊ณ ๋ คํ์ฌ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํ ํ ๋๋ฅผ ๋๋นํด ๊ธฐ๋ฅ ํ๋ ํ๋๋ฅผ ์ต๋ํ ํจ์๋ก ์ชผ๊ฐ์ ๋ง๋์ จ๋ค.
ํ์ง๋ง ์ต์ข ์์ฑ๋ณธ์ ์ฝ๋๋ ๋๋ฌด ํด์ํ๊ธฐ ์ด๋ ค์ ๊ณ , ๋ ๋ํ C์ธ์ด์ ๋ํ ์ง์์ด ๊น์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ผ ์ด๊ธฐ ๋ฒ์ ์ธ TetrisForDesktop 0.1ver ์ ๋ถ์ํ๊ธฐ๋ก ํ์๊ณ ,
ํด์ํ๋ฉด์ ๋๋๊ฑฐ์ง๋ง ์ด๊ธฐ ๋ฒ์ ์กฐ์ฐจ๋ ๋ถ์ํ๊ธฐ๊ฐ ์ด๋ ค์ ๋ค.
๋์ C์ธ์ด์ ๋ํ ์ง์์ ํฌ์ธํฐ์์ ๋ฉ์ถฐ์๋๋ฐ
ํด๋น ์ฝ๋๋ ๊ตฌ์กฐ์ฒด(Structure)๋, ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ, ์ด๊ฑฐํ ์์(enum) ๋ฑ์
์ฌ์ฉํด์ ๊ตฌ๊ธ์ ํ์ด ์๋์๋ค๋ฉด ๋ถ์ํ๊ธฐ๊ฐ ๋๋ฌด ํ๋ค์๋ค. ๐ฅ
์ผ๋จ ์ต๋ํ ์๋ ์ ์์ ๋ถ์ํ๋ฉฐ ์ฃผ์์ ์์ฑํ๊ณ ,
๋ชจ๋ฅด๋ ๋ถ๋ถ์ ์น์ํ์ ํ๋ฉด์ ์ ๋ณด๋ฅผ ์ป๊ณ ์์ฑํ๋ค๋ณด๋
์์ ์ดํด๊ฐ ์๋๋ ์์ค์ ์๋์๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณด๋ค ํ ๋ง ํ๋ค.
๋ธ๋ก๊ทธ์ ๋ชจ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ฌด ๊ธธ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ถ๋ถ๋ง ์์ฑํ์์ต๋๋ค.
- ํ๋ก๊ทธ๋จ์ด ์ด๋ค์์ผ๋ก ๋์๊ฐ๋์ง ?
- ๊ฐ ํค๋ํ์ผ ๋ฐ ์์คํ์ผ์ ๊ธฐ๋ฅ ๋ฐ ํจ์๋ค์ ๊ธฐ๋ฅ(๋งค๊ฐ๋ณ์๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง)
๊ฐ ๋ณ์์ ํจ์์ ๋ํ ์์ธํ ์ค๋ช ์ ์ GitHub๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์. ๐ GitHub
๋จผ์ , ํ ํธ๋ฆฌ์ค๊ฐ ๊ตฌํ๋๊ธฐ ์ํ ์กฐ๊ฑด์ ์์๋ด์ผ ํ๋ค.
- ํค๋ณด๋๊ฐ ํน์ ํค๋ฅผ ์ ๋ ฅ ๋ฐ์ ๋ ๋ง๋ค ๋ธ๋ญ์ด ์์ฌ์ผ ํ๋ค.
- ๋ธ๋ญ์ด ํน์ ์กฐ๊ฑด๋ค์ด ๋ง์กฑํ์ ๋์ ๋ถ๊ธฐ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
- ๋ธ๋ญ์ด ๊ฐ๋ก์ค๋ก ์์ด๊ฒ ๋๋ฉด ์ญ์ ํ๋ ๊ธฐ๋ฅ
- ๋ธ๋ญ์ด ๊ฒ์ํ๊ณผ ์ถฉ๋ํ์๋ ๊ฒ์์ค๋ฒ ๊ธฐ๋ฅ
- ๋๋ค์ผ๋ก ๋ค์ ๋ธ๋ญ์ด ๋ฌด์์ธ์ง ํ์ํด์ค์ผ ํ๋ค.
์ด ์ธ์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง ์ ์ผ ํต์ฌ๋ง ์์ฝํด ๋ดค๋ค.
๋ค์์, ํ๋ก๊ทธ๋จ ์ปดํ์ผ์ ํฐ๋ฏธ๋์ ๋งจ ์ฒ์ ์ถ๋ ฅ๋๋ ์ฐฝ์ด๋ค.
๋ธ๋ญ์ด ๋ด๋ ค์ค๋ ์๋๋ฅผ ํ๋ ์ด ์ ์ ๊ฐ ์ซ์ 1 - 10 ์ฌ์ด๋ก ์ ๋ ฅํ ์ ์๋ค.
'1' ์ด ์ ์ผ ๋๋ฆฐ ์๋๋ก ๋ด๋ ค์ค๋ฉฐ '10' ์ ๊ฐ๊น์ด ์ซ์์ผ ์๋ก ์๋๊ฐ ๋นจ๋ผ์ง๋ค.
ํค ์ ๋ ฅ | ํ๋ |
---|---|
โฌ๏ธ | ๋ธ๋ญ์ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ์ํจ๋ค. |
โก๏ธ | ๋ธ๋ญ์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์นธ ์ด๋ํ๋ค. |
โฌ ๏ธ | ๋ธ๋ญ์ ์ผ์ชฝ์ผ๋ก ํ์นธ ์ด๋ํ๋ค. |
โฌ๏ธ | ๋ธ๋ญ์ ์๋์ชฝ์ผ๋ก ํ์นธ ์ด๋ํ๋ค. |
Space Bar | ๋ธ๋ญ์ ์ฆ์ ๋งจ ๋ฐ์ผ๋ก ๋ด๋ฆฐ๋ค. |
ํค๋ณด๋ ์
๋ ฅ์ ์์ง ํ๋ค๋ฉด ๋ค์์ผ๋ก ๋์ด๊ฐ์.
๊ฒ์ ํ๋ ์ด ๋ฐฉ๋ฒ
- ๋ธ๋ญ์ ๊ฒ์ํ์ด ์๋์น๋๋ก ์๋๋ค.
- ๋ธ๋ญ์ ๊ฐ๋ก์ค๋ก ํ ์ค์ด ์์ฑ๋ ๊ฒฝ์ฐ ์ญ์ ๊ฐ ๋๋ค.
- ๊ฐ๋ก์ค์ 3๋ฒ ์ง์ธ๋๋ง๋ค ์๋๊ฐ 1์ฉ ์ฆ๊ฐํ๋ค.
- ๋ธ๋ญ์ ํญ์ ๋๋ค์ผ๋ก ์์ฑ๋๋ค.
๋ธ๋ญ์ด ๊ฒ์ํ์ ์ด๊ณผํ ๊ฒฝ์ฐ ํ์๋๋ ์ฐฝ์ด๋ค.
์ฌ๊ธฐ๊น์ง ํ๋ก๊ทธ๋จ์ด ์ด๋ค์์ผ๋ก ๋์๊ฐ๋์ง๋ฅผ ์์๋ณด์๋ค.
์ด ํ
ํธ๋ฆฌ์ค ๊ฒ์์ ์ด 10๊ฐ์ ์ฝ๋ํ์ผ๋ก ๊ตฌ์ฑ๋์์ผ๋ฉฐ
ํค๋ ํ์ผ 5๊ฐ, ์์ค ํ์ผ 5๊ฐ๋ก ๊ตฌ์ฑ๋์๋ค.
/* -Header Files list- */
Block.h
Constant.h
TetrisManager.h
TetrisView.h
Util.h
/* -Source Files list- */
Main.c
Block.c
TetrisManager.c
TetrisView.c
Util.c
์ด๋ ๊ฒ ๊ตฌ์ฑ ๋์ด์๋๋ฐ ํ๋์ฉ ๋ฌด์จ ๊ธฐ๋ฅ์ ํ๋ ํ์ผ์ธ์ง ์ดํด๋ณด๋๋ก ํ์.
/* =============================== block.h =============================== */
#ifndef _BLOCK_H
#define _BLOCK_H
typedef struct _point{
int x;
int y;
}Point;
#define POSITIONS_SIZE 4
typedef struct _block{
Point positions[POSITIONS_SIZE][POSITIONS_SIZE];
int current;
int next;
int direction;
}Block;
Block Block_Make(int isFirst, Block block);
Block Block_Move(Block block, int direction);
Point* Block_GetPositions(Block block);
void Block_PrintNext(Block block, int x, int y);
#endif
/* =============================== block.c =============================== */
#include <time.h>
#include <windows.h>
#include <stdio.h>
#include "Block.h"
#include "Util.h"
#include "Constant.h"
#define BLOCK_EXAMPLES_SIZE 6
const static Point blockExamples[BLOCK_EXAMPLES_SIZE][POSITIONS_SIZE][POSITIONS_SIZE] = {...}
static Block _Block_MoveToDown(Block block);
static Block _Block_MoveToLeft(Block block);
static Block _Block_MoveToRight(Block block);
static Block _Block_RotateRight(Block block);
Block Block_Make(int isFirst, Block block) {...}
Block Block_Move(Block block, int direction) {...}
Point* Block_GetPositions(Block block) {...}
void Block_PrintNext(Block block, int x, int y) {...}
static Block _Block_MoveToDown(Block block) {...}
static Block _Block_MoveToLeft(Block block) {...}
static Block _Block_MoveToRight(Block block) {...}
static Block _Block_RotateRight(Block block) {...}
Block.c
์Block.h
ํ์ผ์ ๊ธฐ๋ฅ์,
๋ธ๋ญ์ ํํ๋ฅผ ์ ์, ๋ธ๋ญ์ ํ ํธ๋ฆฌ์ค ํ์์ ์ ๋ ฅ์ ๋ง๊ฒ ์์ง์ด๊ฒ,
๋ธ๋ญ์ ๋ค์ ์ถ๋ ฅ์ ๋๋คํ๊ฒ ๋ฑ ๋ธ๋ญ์ ๋ํ ์ ๋ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ด๋นํ๊ณ ์๋ค.
์ฌ๊ธฐ์ ๋ ์ฌ๊ฒจ ๋ณผ์ ์ ๋ค์ ๋ถ๋ถ์ด๋ค.blockExamples[BLOCK_EXAMPLES_SIZE][POSITIONS_SIZE][POSITIONS_SIZE] = {...}
ํด๋น ๋ถ๋ถ์, ์ถ๋ ฅ๋ ๋ธ๋ญ๋ค์ ๋ชจ์์ ์์ ๋ฐฐ์ด(๋ณํ์ง ์๋)๋ก ์ ์ธํ๋ค.
์ฝ๋ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด์, ์์ธํ ๋ถ๋ถ์ ๊นํ๋ธ์ ์ฌ๋ฆฐ ์ฝ๋๋ฅผ ์ฐธ์กฐํ๋ฉด ๋ ๋ฏํ๋ค.
๋ค์์ผ๋กblock.c,h
์์ ์ฌ์ฉ๋๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.static Block _Block_MoveToDown(Block block); static Block _Block_MoveToLeft(Block block); static Block _Block_MoveToRight(Block block); static Block _Block_RotateRight(Block block);
์์ ํจ์๋ค์
static
์ผ๋ก ์ ์ธ๋ ํจ์๋ค๋กBlock.c
ํ์ผ ๋ด๋ถ์์๋ง ์ฌ์ฉ๋๋ฉฐ
๊ฐ ๊ธฐ๋ฅ๋ค์ ์ ์ ๊ฐ ์ ๋ ฅํ ๊ฐ์ ๋ฐ๋ผ ๋ธ๋ก์ ์์ง์ด๊ฒ ํ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ ํจ์์ด๋ค.Block Block_Make(int isFirst, Block block) {...} Block Block_Move(Block block, int direction) {...} Point* Block_GetPositions(Block block) {...} void Block_PrintNext(Block block, int x, int y) {...}
๋ค์ ํจ์๋ค์,
๋ธ๋ญ์ ์ถ๋ ฅ ๋ฐ ๋๋ค์ผ๋ก ์ถ๋ ฅ,Block Block_Make(int isFirst, Block block)
๋ธ๋ญ์ ์์ง์ด๊ฒ,Block Block_Move(Block block, int direction)
๋ธ๋ญ์ ์ขํ๋ฅผ ์ก์์ฃผ๋ ๊ธฐ๋ฅ์,Point* Block_GetPositions(Block block)
๋ค์ ๋ธ๋ญ์ ์ถ๋ ฅ์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅvoid Block_PrintNext(Block block, int x, int y)
์ด๋ผ๊ณ ๋ณด๋ฉด ๋ ๋ฏ ํ๋ค.
/* =============================== Util.h =============================== */
#pragma once
#ifndef _UTIL_H
#define _UTIL_H
void CursorUtil_GotoXY(int x, int y);
void CursorUtil_Hide();
#endif
/* =============================== block.c =============================== */
#include <Windows.h>
#include "Util.h"
void CursorUtil_GotoXY(int x, int y) {
COORD pos = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void CursorUtil_Hide() {
CONSOLE_CURSOR_INFO cursorInfo;
cursorInfo.dwSize = 1;
cursorInfo.bVisible = FALSE;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo);
}
Util.c
์Util.h
ํ์ผ์ ๊ธฐ๋ฅ์
์ปค์์ ์์น(ํฐ๋ฏธ๋์์์ ์ถ๋ ฅ ์ขํ ์์น)๋ฅผ ์ป๊ณ , ์ปค์๋ฅผ ์จ๊ธฐ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ค.
void CursorUtil_GotoXY(int x, int y)
์ ๊ธฐ๋ฅ์ ๋งค๊ฐ๋ณ์์ธint x,y
๋ฅผ ์ ๋ฌ๋ฐ์SetConsoleCursorPosition
ํจ์๋ฅผ ํธ์ถํ๊ณ ์ปค์๋ฅผ ์ด๋์์ผ์ฃผ๋ ์ญํ ์ ๊ฐ๊ณ ์๋ค.
void CursorUtil_Hide()
์ ๊ธฐ๋ฅ์, ํ์๋๋ ์ปค์๋ฅผ ์จ๊ธฐ๋ ์ญํ ์ด๋ผ๊ณ ๋ด์ผํ ๋ฏ ํ๋ค.
TetrisManager
๋ถ๋ถ์, ์ฝ๋๊ฐ ๋๋ฌด ๊ธด ๊ด๊ณ๋ก,
๋ฌด์จ ์ญํ ์ ํ๋ ํ์ผ์ธ์ง๋ง ์์๋ณด๊ณ ๊ฐ์.
์ฌ์ค์ ์ ์ผ ์ค์ํ ์ญํ ์ ํ๋ ํ์ผ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ ๊ธฐ๋ฅ์ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฒ์์ ๋ํ ์ ๋ฐ์ ์ธ ๊ธฐ๋ฅ
- ๊ฒ์ ํ๋ ์ด์ ๊ฒ์ํ์ ์ด๊ธฐํ ๋ฐ ์ถ๋ ฅ ๊ธฐ๋ฅ
- ๋ธ๋ญ์ด ํน์ ์กฐ๊ฑด์ ๋ง๋ฌ์๋์ ๋ถ๊ธฐ์ ์์ฑ
( ์ : ๋ธ๋ญ์ด ๊ฐ๋ก์ค์ ์์ฑํ์๋ ์ญ์ ํ๋ ๊ธฐ๋ฅ ์ธ ์ฌ๋ฌ๊ฐ์ง)
์ด์ธ์๋ ์ค์ํ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ์ด ๋ง๋ค.
์ด๋ค ํจ์๊ฐ ์๋์ง ๋ด์ฉ๋ง ์์๋ณด์.
/* ====================== TetrisManager Function() ======================= */
void TetrisManager_Init(TetrisManager* tetrisManager, int speedLevel);
int TetrisManager_CheckValidPosition(TetrisManager* tetrisManager, int direction);
void TetrisManager_ChangeBoardByDirection(TetrisManager* tetrisManager, int direction);
void TetrisManager_ChangeBoardByAuto(TetrisManager* tetrisManager);
void TetrisManager_ProcessDirectDown(TetrisManager* tetrisManager);
void TetrisManager_ProcessDeletingLines(TetrisManager* tetrisManager);
int TetrisManager_IsReachedToBottom(TetrisManager* tetrisManager);
int TetrisManager_ProcessReachedCase(TetrisManager* tetrisManager);
void TetrisManager_Sleep(TetrisManager* tetrisManager);
void TetrisManager_Print(TetrisManager* tetrisManager);
static void _TetrisManager_ClearBoard(TetrisManager* tetrisManager);
static void _TetrisManager_ChangeBoardByStatus(TetrisManager* tetrisManager, int status);
static void _TetrisManager_UpSpeedLevel(TetrisManager* tetrisManager);
static void _TetrisManager_SearchLineIndexesToDelete(TetrisManager* tetrisManager, int* indexes, int* count);
static void _TetrisManager_DeleteLines(TetrisManager* tetrisManager, int* indexes, int count);
/* ============================= TetrisView.h =============================== */
#ifndef _TETRIS_VIEW_H
#define _TETRIS_VIEW_H
#include "TetrisManager.h"
typedef struct _tetrisView{
TetrisManager tetrisManager;
}TetrisView;
void TetrisView_StartGame(TetrisView* tetrisView);
void TetrisView_ProcessGame(TetrisView* tetrisView, int processType, int direction);
void TetrisView_EndGame(TetrisView* tetrisView);
#endif
/* ============================= TetrisView.c ============================= */
#include ...
#pragma comment(lib, "winmm.lib")
#define TETRIS_BACKGROUND_MUSIC_FILE_NAME " ~~~.wav "
void TetrisView_StartGame(TetrisView* tetrisView) {...}
void TetrisView_ProcessGame(TetrisView* tetrisView, int processType, int direction){...}
void TetrisView_EndGame(TetrisView* tetrisView){...}
TetrisView ํ์ผ๋ค์ ๊ธฐ๋ฅ์ User Interface(UI) ๊ธฐ๋ฅ ๋ฐ ๊ฒ์ ํ๋ ์ด ๊ตฌํ์ด๋ผ๊ณ ์๊ฐ๋๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด์.#pragma comment(lib, "winmm.lib") #define TETRIS_BACKGROUND_MUSIC_FILE_NAME " ~~~.wav "
ํด๋น ๋ถ๋ถ์ , ์ปดํ์ผ ์ ๋ ธ๋๊ฐ ๋์ค๋๋ก ์ ์ธํ ๊ฒ์ด๋ฉฐ
void TetrisView_StartGame(TetrisView* tetrisView)
ํจ์์์
๋ ธ๋๊ฐ ํ๋ ์ด ๋๋๋ก ํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ ์ธ ํด์ค๋ฏ ํ๋ค.void TetrisView_StartGame(TetrisView* tetrisView); void TetrisView_ProcessGame(TetrisView* tetrisView, int processType, int direction); void TetrisView_EndGame(TetrisView* tetrisView);
ํด๋น ํจ์๋ค์ ๊ฐ๊ฐ
๊ฒ์์ ์์ํ ๋ ํธ์ถ๋๋ ํจ์void TetrisView_StartGame()
๊ฒ์์ค์ ํธ์ถ๋๋ ํจ์void TetrisView_ProcessGame()
๊ฒ์์ด ๋๋ฌ์ ๊ฒฝ์ฐ์ ํธ์ถ๋๋ ํจ์void TetrisView_EndGame()
๋ฅผ ์๋ฏธ ํ๋ค.
/* ======== Constant.h ======== */
#ifndef _CONSTANT_H
#define _CONSTANT_H
enum Boolean{
False, True
};
enum Direction{
UP, RIGHT, DOWN, LEFT
};
enum ProcessType{
DIRECTION, DIRECT_DOWN, AUTO
};
enum KeyCode{
UP_KEY_CODE = 72, LEFT_KEY_CODE = 75,
RIGHT_KEY_CODE = 77, DOWN_KEY_CODE = 80,
SPACE_BAR_KEY_CODE = 32
};
enum BoardType{
EMPTY,
MOVING_BLOCK, FIXED_BLOCK,
LEFT_WALL, RIGHT_WALL, BOTTOM_WALL, TOP_WALL,
LEFT_TOP_EDGE, RIGHT_TOP_EDGE, LEFT_BOTTOM_EDGE, RIGHT_BOTTOM_EDGE
};
#define MAX_SPEED_LEVEL 10
#define MIN_SPEED_LEVEL 1
#endif
Constant.h
์ด ํ์ผ์ ์์ผ๋ก ๋ชจ๋ ํ์ผ์์ ์ฌ์ฉํ ์ด๊ฑฐํ ์์๋ค์ ์ ์ธ์
ํต์งธ๋ก ๋ชจ์๋ ํ์ผ์ธ๋ฐ,
๋๋ ์ด ์ฝ๋๋ฅผ ๋ณด๋ฉฐ C์ธ์ด์ ๊ณ ์ง์ ์ธ ๋ฌธ์ ๋ฅผ ์์์์๋ ํ์ผ์ด์๋ค.
์์ธํ ๋ณด๋ฉด,enum Boolean
์ ์ธ ๋ถ๋ถ์ ๋จ์ํ True(=1), False(=0)์ ์ ์ธํ ๊ฒ์ ์์์๋ค.
๋น๊ต์ ์ต์ ์ธํฐํ๋ฆฌํฐ ์ธ์ด์ธ ํ์ด์ฌ๊ณผ ๋น๊ตํด๋ดค์๋ ์๋นํ ๋ถ์น์ ํ๋ค๊ณ ๋๋์ ์๋ค.
ํ์ง๋ง ๋๋ ์ด๋ฐ ์ ์ด ์คํ๋ ค C์ธ์ด์ ๋งค๋ ฅ์ด ์๋๊น? ๋ผ๊ณ ์๊ฐ์ด ๋ค๊ธฐ๋ ํ๋ค.
#include <...>
int main(int argc, char* argv[]){
TetrisView tetrisView;
TetrisView_StartGame(&tetrisView);
int processType;
int direction;
while (True){
processType = AUTO;
direction = DOWN;
if (_kbhit()){
int key = _getch();
if (_kbhit()){
key = _getch();
switch (key){
case UP_KEY_CODE:
processType = DIRECTION;
direction = UP;
break;
case LEFT_KEY_CODE:
processType = DIRECTION;
direction = LEFT;
break;
case RIGHT_KEY_CODE:
processType = DIRECTION;
direction = RIGHT;
break;
case DOWN_KEY_CODE:
processType = DIRECTION;
direction = DOWN;
break;
}
}
else{
switch (key){
case SPACE_BAR_KEY_CODE:
processType = DIRECT_DOWN;
}
}
}
TetrisView_ProcessGame(&tetrisView, processType, direction);
}
return 0;
}
์ฌ์ค์ ํ๋ก๊ทธ๋จ์ด ๊ฐ๋๋๋ ๋ถ๋ถ์ธ
Main.c
๋ฉ์ธ ํ์ผ์ด๋ค.
์ฌ๊ธฐ์ ํต์ฌ์ ์ผ๋ก ๋ด์ผํ ๋ถ๋ถ์(_kbhit())
ํจ์๊ฐ 2๋ฒ ํธ์ถ๋จ์ ์์์๋๋ฐ,
์ ๊ทธ๋ฐ๊ฐ ์ดํด๊ฐ ์๋์ด ์ฐพ์๋ณธ ๊ฒฐ๊ณผ,๋ฐฉํฅํค๋, ์ ๋ ฅ ๋ฒํผ์ 2 ๊ฐ์ ๊ฐ์ด ์ฐ์์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ 0xE0 (= 224), ๊ทธ๋ฆฌ๊ณ ๋ฐฉํฅํค์ ๋ํ ์ ์ ๊ฐ ์ด๋ ๊ฒ 2 ๊ฐ๊ฐ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์, ๋ ๋ฒ ์ ๋ ฅ๋ฒํผ๋ก๋ถํฐ ๊ฐ์ ๊ฐ์ ธ์์ ํ์ธํด์ผ ํฉ๋๋ค. 16 ๋ผ์ธ์์ _kbhit ํจ์์ ํธ์ถ ํ ๋ฐํ๊ฐ์ด 0 ์ด ์๋๋ฉด, ์,ํ,์ข,์ฐ ๋ฐฉํฅ ํค ์ค ํ๋๊ฐ ๋๋ ธ๋ค๋ ๋ง์ด๊ธฐ ๋๋ฌธ์, switch ~ case ๋ฌธ์์ ๋ถ๊ธฐํ์ฌ, ๊ฐ๊ฐ์ ํด๋นํ๋ processType ๊ณผ direction ์ ์ค์ ํฉ๋๋ค.
์ด๋ผ๊ณ ํ๋ค. ์ฆ ๋ฐฉํฅํค ๊ฐ์ ๊ฒฝ์ฐ์ *์ ๋ ฅ ๋ฒํผ ์ 2๊ฐ์ ๊ฐ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์,
์ ๋ ฅ๋ฒํผ๋ก๋ถํฐ ๋๋ฒ์ ๊ฐ์ ๊ฐ์ ธ์์ ํ์ธํด์ผํ๋ค๊ณ ํ๋ค.
์ ๋ง๋ก C์ธ์ด๋ ๊น๊นํ๋ค.
*์ ๋ ฅ ๋ฒํผ๋?
scanf_s ๊ฐ์ ํจ์๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ ๋ฐ๋ก ํ๋ก๊ทธ๋จ์ ์ฝํ์ง๋ ๊ฒ์ด ์๋,
์ ๋ ฅ ๋ฒํผ์ ์ ์ฅ ๋ ํ, ์ ๋ ฅ ๋ฒํผ์ ๋ด์ฉ์ด ํ๋ก๊ทธ๋จ์ ์ ๋ฌ๋๋ ์ฆ 2๋ฒ์ ์ ๋ฌ์ ๊ฑฐ์น๋ค๋ ๋ป์ด๋ค.
์ฝ๋๋ถ์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฝ๋์ ๋ด์ฉ์ด ๋๋ฌด๋ง์
๋ณธ๋ฌธ์์ ์ ๋๋ก ๋ค๋ฃจ์ง ๋ชปํ๊ณ
์ ์ฒด์ ์ธ ํ๋ก๊ทธ๋จ์ ํ๋ฆ ๋ฐ ํ๋ก๊ทธ๋จ์ ๋์๊ฐ๊ฒํ๋ ์ ์ฒด์ ์ธ ํ์ผ,
๊ฐ ์์ค ํ์ผ ๋ฐ ํค๋ํ์ผ์ ๊ธฐ๋ฅ๋ค์ ์์ฃผ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋๋ฐ,
์ค๋ช ์ด ๋๋ฌด ๋ถ์กฑํ๋๊ฒ ์๋๊ฐ ์ถ์๋ค.
๊ฒ์ ์ฝ๋๋ฅผ ํด์ํ๊ณ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ ๋ํด์ ์ฐพ๋ ๊ณผ์ ์ ์์ด์
๋๋ผ๋๊ฒ ๋ง์๋ค. ํฌ๊ฒ 3๊ฐ์ง๋ก ๋ฝ์๋ฉด,
1. ํ์คํ ์ฝ๋๋ ๋ณด๋ฉด์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ์๋, ์ง์ ๋ถ๋ชํ ๋ด์ผํ๋ค.
2. ๊ฐ๋จํ ํ๋ก๊ทธ๋จ ํ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ๊ณ ๋ คํ๊ณ ์ค๊ณ ํด์ผํ ๋ถ๋ถ์ด ๋งค์ฐ ๋ง์๊ฒ ๊ฐ๋ค.
3. ๊ฒ์ํ๋ค๊ฐ ๋ฒ๊ทธ ๋ฌ๋ค๊ณ ์ํ๋์ง์ด์ผ ๋ง๋ก ์ด๋ฆฌ์์ ์ง์ด๋ค.
์ธ์์ ๋ฒ๊ทธ๊ฐ ์๋ ํ๋ก๊ทธ๋จ์ ์๋ ๊ฒ ๊ฐ๋ค.
3๋ฒ์ ๋๋ด ๋ฐ ์ง๋ด ๋ฐ์ผ๋ก ํ์๋ฆฌ๊ณ ๐ต
์ด๋ฒ ๊ธฐํ๋ก ๋งค์ฐ ํฐ ๊ณต๋ถ๊ฐ ๋๊ณ
๊ฒ์์ด๋ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ด๋ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ ์ฌ๋๋ค์ ์กด๊ฒฝํ๊ฒ ๋์๋ค.
ํ๋ก๊ทธ๋๋ฐ์ ๋ค์ด๊ฐ๋ฉด ๋ค์ด๊ฐ์๋ก ์ฌ์คํด์ง๋ ๋๋์ด๋ค.