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