게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
짝맞추기 게임 소스코드
게시물ID : humordata_1594205짧은주소 복사하기
작성자 : bio왕바우
추천 : 0/5
조회수 : 8865회
댓글수 : 3개
등록시간 : 2015/02/13 16:00:44
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)]);
     }
    }
   }
  }
 }
}
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호