신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

3x3 퍼즐 게임

어렸을 적 한번쯤은 해봤을 퍼즐 게임입니다. 해당 글에서는 3x3 크기의 퍼즐을 만들어 봅니다.

처음에는 맨 하단 우측(좌표 2, 2)에서 시작합니다.

키보드를 이용하여 현재위치를 바꿈과 동시에 값을 바꿉니다.

위에서부터 오른쪽으로 1 ~ 9 까지 숫자가 순차적으로 나열된다면, 게임이 끝납니다.

소스코드

#include <stdio.h>
#include <termio.h>
#include <stdlib.h>

#define UP 65
#define DOWN 66
#define LEFT 68
#define RIGHT 67
#define N 3
#define M 3

int getch(void){
    int ch;
    struct termios buf, save;
    tcgetattr(0,&save);
    buf = save;
    buf.c_lflag &= ~(ICANON|ECHO);
    buf.c_cc[VMIN] = 1;
    buf.c_cc[VTIME] = 0;
    tcsetattr(0, TCSAFLUSH, &buf);
    ch = getchar();
    tcsetattr(0, TCSAFLUSH, &save);
    return ch;
}

int getKeyboard(){
    int keyboard = getch();
    if(keyboard == 91){
        return getch();
    }
    return 0;
}

void printMap(int puzzle[N][M]){
    system("clear");
    for(int i=0; i<N; i++){
        for(int j=0; j<M; j++){
            if(puzzle[i][j] != 0){
                printf("%2d", puzzle[i][j]);
            }else{
                printf("  ");
            }
        }// end for j
        printf("\n");
    }//end for i

}

int isClear(int puzzle[N][M]){
    for(int i=0; i<N; i++){
        for(int j=0; j<M; j++){
            if(puzzle[i][j] != i*N + j + 1){
                return 0;
            }
        }
    }
    return 1;
}
int main(void){
    int puzzle[N][M] = { { 9,1,8 },
                        { 6,2,3 },
                        { 4,5,7 } };
    int curRow = 2;
    int curCol = 2;
    int keyboard = 0;
     int temp = 0;
    while (!isClear(puzzle)){
        printMap(puzzle);
        printf("\n현재위치 : %d, %d\n", curRow, curCol);
        keyboard = getKeyboard();
        //printf("%2d", keyboard);
         switch(keyboard){
            case UP:
                if(curRow > 0){
                    temp = puzzle[curRow][curCol];
                    puzzle[curRow][curCol] = puzzle[curRow-1][curCol];
                    puzzle[curRow-1][curCol] = temp;
                    curRow--;
                }
                break;
            case DOWN:
                if(curRow < N-1){
                    temp = puzzle[curRow][curCol];
                    puzzle[curRow][curCol] = puzzle[curRow+1][curCol];
                    puzzle[curRow+1][curCol] = temp;
                    curRow++;
                }
                break;
            case LEFT:
                if(curCol > 0){
                    temp = puzzle[curRow][curCol];
                    puzzle[curRow][curCol] = puzzle[curRow][curCol-1];
                    puzzle[curRow][curCol-1] = temp;
                    curCol--;
                }
                break;
            case RIGHT:
                if(curCol < M-1){
                    temp = puzzle[curRow][curCol];
                    puzzle[curRow][curCol] = puzzle[curRow][curCol+1];
                    puzzle[curRow][curCol+1] = temp;
                    curCol++;
                }
                break;
        }
    }
    printf("clear");
    return 0;
}

관련 글

2018/02/22 - [Language/C&C++] - C++ :: 야구 게임(Baseball) 프로그램 만들기

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기