visual studio 2010 or visual studio 2013
있으면 게임돌려보세요
같은 그림 맞추는 게임입니다
// 2015-02-09 ~ 2015-02-12 총 20시간 걸림 나의 첫 번째 게임
// 제작 : 왕바우
#include <stdio.h>
#include <Windows.h>
#include <locale.h>
#include <conio.h>
#include <time.h>
//기본 셋팅 값
#define CONSOLSIZE 60
#define STROUTMAIN TEXT("진행을 위해서 키를 눌러주세요.Caps Lock을 해제해주세요.")
enum Set { X = 5000, Y };
#define KEYUP 'w'
#define KEYDONW 's'
#define KEYLEFT 'a'
#define KEYRIGHT 'd'
#define KEYSPACE 32 // SPACE
#define KEYEXIT 27 // ESC
#define KEYENTER 13 // Enter
#define MAX 20 // 게임 크기
#define PAIR 1 // Lv.0 일때 카드 쌍의 개수
#define Lv 0 // 시작레벨
#define ENERGY 10 // 시작에너지
#define STARTCHAR 90 // 문자 넣어지는 범위 시작
#define ENDCHAR 50 // 문자 넣어지는 범위 끝
//기본 인터페이스 함수
void gotoxy(int x, int y); //출력 좌표 이동
void CmdSize(int x, int y); //콘솔 창 크기 조절
void clrscr(); //콘솔 창 화면 지우기
void GameSet(); //게임 준비 함수
//연산 함수
void AuGotoxy(int x, int y); // 화면 비율 맞춰서 위치변경
void MoveXY(int *x, int *y, int *tempx, int *tempy); // 키보드입력받아 좌표값 이동 함수
//출력 함수
void OutMain(); //첫번째 화면
void Outline(); //게임 테두리
void GameOver(); //게임 실패 시 출력
void Score(); // 점수, 체력, 레벨
void HINT(void); // 남은 카드[문자] 보여주기
void ShowLevelUp(void); // 레벨업 시 출력
//게임 세팅
void pairmake(); // 게임 카드(문자) 생성 함수
void pairsee(); // 게임 카드(문자)를 보여주는 함수
void pairsee2(int *x, int *y); // 게임 카드(문자) 뒤집기 함수
void pairsee3(int *x, int *y, int *tempx, int *tempy); // 점수, 에너지, 레벨 관리 함수
void pairsee4(int *x, int *y, int *beforeX, int *beforeY); // 좌표이동하면서 카드(문자)위를 지날때 카드가 지워지지 않게하고 또는 *(좌표이동시보이는별표)의 흔적을 지운다.
int See = 0;
char pair[MAX][MAX] = { 0, }; // 카드(문자) 배열
char pairhide[MAX][MAX] = { 0, }; // 카드(문자) 가리기 배열
int Level = Lv; // 게임 레벨
int score = 0; // 게임 점수
int energy = ENERGY + Level; // 게임 체력
bool space = false; // 스페이스바를 누르면 true
int hint = 5; // 힌트 개수
int main(void)
{
_wsetlocale(LC_ALL, L"Korean");
CmdSize(CONSOLSIZE * 2, CONSOLSIZE);
OutMain();
while (_getch() != KEYEXIT)
{
clrscr();
GameSet();
}
return 1;
}
void gotoxy(int x, int y) {
COORD Pos = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
void CmdSize(int x, int y)
{
char chCmdX[20] = "mode con:cols=";
char chCmdY[20] = "mode con:lines=";
char chSize[5];
_itoa_s(x, chSize, 10);
strcat_s(chCmdX, chSize);
system(chCmdX);
_itoa_s(y, chSize, 10);
strcat_s(chCmdY, chSize);
system(chCmdY);
return;
}
void clrscr() {
system("cls");
}
void GameSet(void) {
int x = CONSOLSIZE / 2 * 2 - 9, y = CONSOLSIZE / 2 - 14;
int tempx = 0, tempy = 0;
while (1) {
pairmake(); // 카드를 만든다
Outline(); // 테두리를 만든다
pairsee(); // 카드를 보여준다.
Score(); // 점수, 에너지, 레벨 출력
See = 0;
gotoxy(0, 0);
printf("%d", See);
while (1) {
gotoxy(0, 0);
printf("%d", See);
MoveXY(&x, &y, &tempx, &tempy); // 좌표움직이다 스페이스바를 누를시
tempx = x, tempy = y; // x, y좌표 임시저장하고
pairsee2(&x, &y); // 뒤집기하고 See 1증가
MoveXY(&x, &y, &tempx, &tempy); // 좌표움직이다 스페이스바를 누를시
pairsee2(&x, &y); // 뒤집기하고 See 1증가
pairsee3(&x, &y, &tempx, &tempy); // See=2일때 점수,에너지,레벨 카운트
Score(); // 점수, 에너지,레벨 출력
if (energy == 0) {
score = 0;
energy = PAIR;
Level = 0; // 0레벨로 초기화
clrscr(); // 콘솔 화면 지우기
GameOver(); // 게임 실패 화면 출력
Sleep(2000); // 5초 정지
return;
}
if (score == PAIR + (Level))
{
clrscr();
ShowLevelUp();
Sleep(1500);
clrscr();
Level++;
hint += 5;
score = 0;
break;
}
}// while(1);
}// while(1);
}
void AuGotoxy(int x, int y)
{
gotoxy(x * 2, y);
}
void MoveXY(int *x, int *y, int *tempx, int *tempy) {
char Move = 0;
int i = 0, j = 0;
bool M = false;
while (1) {
Move = _getch();
if (M == true) {
pairsee4(&*x, &*y, &*tempx, &*tempy);
M = false;
}
if (Move != KEYSPACE && Move != KEYENTER) {
switch (Move) {
case KEYLEFT:
if (*x > CONSOLSIZE - 9) {
*x = *x - 1;
M = true;
}
else {
*x;
M = true;
}
gotoxy(*x, *y); printf("*"); break;
case KEYRIGHT:
if (*x < CONSOLSIZE + 12) {
*x = *x + 1;
M = true;
}
else {
*x;
M = true;
}
gotoxy(*x, *y); printf("*"); break;
case KEYUP:
if (*y > CONSOLSIZE / 2 - 14) {
*y = *y - 1;
M = true;
}
else {
*y;
M = true;
}
gotoxy(*x, *y); printf("*"); break;
case KEYDONW:
if (*y < CONSOLSIZE / 2 + 7) {
*y = *y + 1;
M = true;
}
else {
*y;
M = true;
}
gotoxy(*x, *y); printf("*"); break;
}// switch문
}//if
else if (Move == KEYSPACE) {
return;
}
else if (Move == KEYENTER) {
if (hint != 0) {
if (See == 1) {
hint--;
Score();
HINT();
gotoxy(*tempx, *tempy);
printf("%c", pair[*tempx - ((CONSOLSIZE / 2) * 2 - 8)][*tempy - (CONSOLSIZE / 2 - 13)]);
}
else {
hint--;
Score();
HINT();
}
}
}
}// while
return;
}
void OutMain()
{
AuGotoxy(CONSOLSIZE / 2 - (lstrlen(STROUTMAIN) / 2), CONSOLSIZE / 2 - 1);
wprintf(TEXT("%s\n"), STROUTMAIN);
}
void Outline(void) { // 게임 테두리 출력
int i = 0;
for (i = 0; i <= MAX + 3; i++) {
gotoxy(i + (CONSOLSIZE / 2) * 2 - 10, CONSOLSIZE / 2 - 15);
printf("*");
gotoxy(i + (CONSOLSIZE / 2) * 2 - 10, MAX + 3 + CONSOLSIZE / 2 - 15);
printf("*");
gotoxy((CONSOLSIZE / 2) * 2 - 10, i + CONSOLSIZE / 2 - 15);
printf("*");
gotoxy(MAX + 3 + (CONSOLSIZE / 2) * 2 - 10, i + CONSOLSIZE / 2 - 15);
printf("*");
}
}
void GameOver(void) {
int i = 0;
int len = 0;
len = strlen("GAMEOVER");
clrscr();
gotoxy((CONSOLSIZE / 2) * 2 - 10, CONSOLSIZE / 2 - 2);
printf(" ");
for (i = 0; i < len + 4; i++) {
printf("-");
}
puts("");
gotoxy((CONSOLSIZE / 2) * 2 - 10, CONSOLSIZE / 2 - 1);
printf("| %s |\n", "GAMEOVER");
gotoxy((CONSOLSIZE / 2) * 2 - 10, CONSOLSIZE / 2);
printf(" ");
for (i = 0; i < len + 4; i++) {
printf("-");
}
puts("");
}
void Score(void) {
gotoxy(CONSOLSIZE / 2, CONSOLSIZE / 2);
printf(" ");
gotoxy(CONSOLSIZE / 2, CONSOLSIZE / 2 + 1);
printf(" ");
gotoxy(CONSOLSIZE / 2, CONSOLSIZE / 2 + 2);
printf(" ");
gotoxy(CONSOLSIZE / 2, CONSOLSIZE / 2 + 3);
printf(" ");
gotoxy(CONSOLSIZE - CONSOLSIZE / 15, CONSOLSIZE / 2 - 17);
printf("짝 맞추기");
gotoxy(CONSOLSIZE / 2, CONSOLSIZE / 2);
printf("점수:%d", score);
gotoxy(CONSOLSIZE / 2, CONSOLSIZE / 2 + 1);
printf("체력:%d", energy);
gotoxy(CONSOLSIZE / 2, CONSOLSIZE / 2 + 2);
printf("레벨:%d", Level);
gotoxy(CONSOLSIZE / 2, CONSOLSIZE / 2 + 3);
printf("힌트:%d", hint);
gotoxy(CONSOLSIZE, CONSOLSIZE / 2 + 10);
printf("이동 : 위(W)아래(S)왼쪽(A)오른쪽(D)");
gotoxy(CONSOLSIZE, CONSOLSIZE / 2 + 11);
printf("카드뒤집기[SPACE BAR] 힌트[ENTER]");
}
void HINT(void) {
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
if (pair[i][j] != 0x20) {
gotoxy(i + (CONSOLSIZE / 2) * 2 - 8, j + CONSOLSIZE / 2 - 13);
printf("%c", pair[i][j]);
}
}
printf("\n");
}
Sleep(3000); // 3초 정지
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
if (pairhide[i][j] != 0x20) {
gotoxy(i + (CONSOLSIZE / 2) * 2 - 8, j + CONSOLSIZE / 2 - 13);
printf("%c", pairhide[i][j]);
}
}
printf("\n");
}
return;
}
void ShowLevelUp(void) {
int i = 0;
int len = 0;
len = strlen("Level UP! HINT 5개 획득!");
clrscr();
gotoxy((CONSOLSIZE / 2) * 2 - 10, CONSOLSIZE / 2 - 2);
printf(" ");
for (i = 0; i < len + 4; i++) {
printf("-");
}
puts("");
gotoxy((CONSOLSIZE / 2) * 2 - 10, CONSOLSIZE / 2 - 1);
printf("| %s |\n", "Level UP! HINT 5개 획득!");
gotoxy((CONSOLSIZE / 2) * 2 - 10, CONSOLSIZE / 2);
printf(" ");
for (i = 0; i < len + 4; i++) {
printf("-");
}
puts("");
}
void pairmake(void) {
int cardpair = PAIR + (Level); // 레벨이 1증하면 카드(문자)짝 1증가
int i = 0;
int j = 0;
int a = 0;
int b = 0;
int tempi = 0;
int tempj = 0;
int recycle = 0;
for (i = 0; i < MAX; i++) {
for (j = 0; j < MAX; j++) { // 배열 초기화
pair[i][j] = 0x20;
pairhide[i][j] = 0x20;
}
}
while (1) {
if (recycle == 1) {
recycle = 0;
}
else {
cardpair--;
}
i = rand() % MAX; // [i][ ] index 랜덤 생성
j = rand() % MAX; // [ ][j] index 랜덤 생성
tempi = i; // 카드(문자)가 들어있는 [i][ ]임시 저장 공간
tempj = j; // 카드(문자)가 들어있는 [ ][j]임시 저장 공간
for (a = 0; a < MAX; a++) {
for (b = 0; b < MAX; b++) {
if (a == i && b == j) {
if (pair[a][b] != 0x20) // 배열에 카드가 들어있으면 continue;
{
recycle = 1;
}
}
}
}
if (recycle == 1) {
continue;
}
pair[i][j] = 'Z' - cardpair;
pairhide[i][j] = '?'; // 같은 index에 카드(문자)가리는 'A'를 담는다
while (tempi == i && tempj == j) { // 동일한 [i][j] index이면 다른 index가 나올 때까지
i = rand() % MAX; // [i][ ] index 랜덤 생성
j = rand() % MAX; // [ ][j] index 랜덤 생성
}
for (a = 0; a < MAX; a++) { // 배열에 카드가 들어있으면 continue
for (b = 0; b < MAX; b++) {
if (a == i && b == j) {
if (pair[a][b] != 0x20) {
recycle = 1;
}
}
}
}
if (recycle == 1) {
pair[tempi][tempj] = 0; // continue할때 동일한 (카드)문자가 다른배열에도 들어갈 경우 생각해서
pairhide[tempi][tempj] = 0; // 전에 담은 카드(문자) 초기화
continue;
}
pair[i][j] = pair[tempi][tempj]; // 동일한 카드(문자)를 [i][j] index에 담는다.
pairhide[i][j] = '?'; // 다른 배열에 [i][j] index에 카드(문자)를 가리는 'A'를 담는다.
if (cardpair == 0) break;
}//while문
return;
}
void pairsee(void) {
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
gotoxy(i + (CONSOLSIZE / 2) * 2 - 8, j + CONSOLSIZE / 2 - 13);
printf("%c", pair[i][j]);
}
printf("\n");
}
Sleep(3000); // 3초 정지
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
gotoxy(i + (CONSOLSIZE / 2) * 2 - 8, j + CONSOLSIZE / 2 - 13);
printf("%c", pairhide[i][j]);
}
printf("\n");
}
return;
}
void pairsee2(int *x, int *y) {
int i = 0, j = 0;
for (i = (CONSOLSIZE / 2) * 2 - 9; i < MAX + 3 + (CONSOLSIZE / 2) * 2 - 10; i++) {
for (j = CONSOLSIZE / 2 - 14; j < MAX + 3 + CONSOLSIZE / 2 - 15; j++) {
if (i == *x && j == *y) {
if (pair[i - ((CONSOLSIZE / 2) * 2 - 8)][j - (CONSOLSIZE / 2 - 13)] >= 65 && pair[i - ((CONSOLSIZE / 2) * 2 - 8)][j - (CONSOLSIZE / 2 - 13)] <= 90) {
gotoxy(*x, *y);
printf("%c", pair[i - ((CONSOLSIZE / 2) * 2 - 8)][j - (CONSOLSIZE / 2 - 13)]);
See++;
}
else {
See++;
}
}
}
}
gotoxy(0, 0);
printf("%d", See);
}
void pairsee3(int *x, int *y, int *tempx, int *tempy) {
int atSee1a = *tempy - (CONSOLSIZE / 2 - 13); // See가 1일때 pair ,pairhide 배열의 y 인덱스
int atSee1b = *tempx - ((CONSOLSIZE / 2) * 2 - 8); // See가 1일때 pair ,pairhide 배열의 x 인덱스
int atSee2a = *y - (CONSOLSIZE / 2 - 13); // See가 2일때 pair ,pairhide 배열의 y 인덱스
int atSee2b = *x - ((CONSOLSIZE / 2) * 2 - 8); // See가 2일때 pair ,pairhide 배열의 x 인덱스
int a = 0, b = 0;
int c = 0;
/*
for (a = 0; a < MAX; a++) {
for (b = 0; b < MAX; b++) {
if (pair[a][b] != 0x20) {
gotoxy(70, c);
printf("pair[%d][%d]=%c\n",a, b, pair[a][b]);
c++;
}
}
}
gotoxy(0, 4);
printf("(*x,*y)=(%d,%d),(*tempx,*tempy)=(%d,%d)", *x, *y, *tempx, *tempy);
gotoxy(0, 5);
printf("(atSee1b,atSee1a)=(%d,%d),(atSee2b,atSee2a)=(%d,%d)", atSee1a, atSee1b, atSee2a, atSee2b);
gotoxy(0, 6);
printf("%c %c", pair[atSee1b][atSee1a], pair[atSee2b][atSee2a]);
*/
if (See == 2) {
if (pair[atSee1b][atSee1a] == 0x20 && pair[atSee2b][atSee2a] == 0x20) {
energy--;
}
else if (pair[atSee1b][atSee1a] == pair[atSee2b][atSee2a]) { // 뒤집은 두 카드(문자)가 같으면
if (atSee1b == atSee2b && atSee1a == atSee2a) {
gotoxy(*tempx, *tempy);
printf("%c", pairhide[atSee1b][atSee1a]);
energy--;
}
else{
pair[atSee1b][atSee1a] = 0x20; // 배열 pair, pairhide 값을 0x20로 바꾸고 자리를 지움
pairhide[atSee1b][atSee1a] = 0x20;
gotoxy(*tempx, *tempy);
printf(" ");
pair[atSee2b][atSee2a] = 0x20;
pairhide[atSee2b][atSee2a] = 0x20;
gotoxy(*x, *y);
printf(" ");
score++;
}
}
else {
if (pair[atSee1b][atSee1a] >= ENDCHAR && pair[atSee1b][atSee1a] <= STARTCHAR && pair[atSee2b][atSee2a] >= 48 && pair[atSee2b][atSee2a] <= STARTCHAR) {
Sleep(1000);
gotoxy(*tempx, *tempy);
printf("%c", pairhide[atSee1b][atSee1a]);
gotoxy(*x, *y);
printf("%c", pairhide[atSee2b][atSee2a]);
energy--;
gotoxy(70, 10);
}
else if (pair[atSee1b][atSee1a] >= ENDCHAR && pair[atSee1b][atSee1a] <= STARTCHAR) {
Sleep(1000);
gotoxy(*tempx, *tempy);
printf("%c", pairhide[atSee1b][atSee1a]);
energy--;
}
else if (pair[atSee2b][atSee2a] >= ENDCHAR && pair[atSee2b][atSee2a] <= STARTCHAR) {
Sleep(1000);
gotoxy(*x, *y);
printf("%c", pairhide[atSee2b][atSee2a]);
energy--;
}
else {
energy--;
}
}
See = 0;
} // it(See == 2)
return;
}
void pairsee4(int *x, int *y, int *tempx, int *tempy) {
int i = 0, j = 0;
int a = 0, b = 0;
for (i = (CONSOLSIZE / 2) * 2 - 9; i < MAX + 3 + (CONSOLSIZE / 2) * 2 - 10; i++) {
for (j = CONSOLSIZE / 2 - 14; j < MAX + 3 + CONSOLSIZE / 2 - 15; j++) {
if (i == *x && j == *y) {
gotoxy(*x, *y);
printf(" ");
}
if (i == *x && j == *y) {
/*
gotoxy(0, 10);
printf(" ");
gotoxy(0, 10);
printf("*x:%d, *y:%d, i:%d, j:%d, %d %d", *x, *y, i, j, i - ((CONSOLSIZE / 2) * 2 - 8), j - (CONSOLSIZE / 2 - 13));
*/
if (pair[i - ((CONSOLSIZE / 2) * 2 - 8)][j - (CONSOLSIZE / 2 - 13)] >= 65 && pair[i - ((CONSOLSIZE / 2) * 2 - 8)][j - (CONSOLSIZE / 2 - 13)] <= 90) {
gotoxy(*x, *y);
printf("%c", pairhide[i - ((CONSOLSIZE / 2) * 2 - 8)][j - (CONSOLSIZE / 2 - 13)]);
if (*x == *tempx && *y == *tempy) {
gotoxy(*tempx, *tempy);
printf("%c", pair[i - ((CONSOLSIZE / 2) * 2 - 8)][j - (CONSOLSIZE / 2 - 13)]);
}
}
}
}
}
}