ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스로 제작한 미니게임 (C언어)
    과제 결과물 2018. 6. 6. 15:39


    2018-06-02

    (제작 소요 시간 : 4시간)


    1.
    작품의 개요


    * 리눅스로 제작한 간단한 퍼즐 게임

     

    * 애니팡에 푹 빠진 어머님의 모습을 보고 제작을 시작

     

    * 추후 Unity 엔진을 이용하여 버전 업그레이드 및 프로젝트 구성 중


    2. 시스템 구성도(설계도)

     

    * system.h, system.c (저장 및 로드 관련)

    - Load(void), Save(int Score) : 최고 점수를 읽어들이고 현재 점수를 저장하는 함수

     

     

    * input.h, input.c (입력 값에 관한 함수 및 헤더파일 관리)

    - unistd.h, sys/select.h, termios.h, string.h, stdlib.h, stdio.h

     

    - InputKey(void), MoveCursor(int dir) : 이동 및 선택 관련 함수

     

    - linux_kbhit(void), linux_getch(void) : kbhit, getch를 리눅스에 맞는 함수로 변형

     

    - ScoreUP,Down(void), GetGoal(void) : 현재점수 및 목표점수 관련 함수

     

    - Struct Point (int x, int y) : 현재 커서 위치 저장

     

    - ActiveBoom(void) : 자신의 위치를 기준으로 상하좌우를 비교하여 다른 값이 있다면

    멈추고 제거, 특별 폭탄 (십자) 관련 함수

     

    * view.h, view.c (사용자에게 보여줄 텍스트와 블록 관리)

    - define (TITLE_X, Y), (TITLE_Y_SCORE), (GAME_X, Y),

    (WALL, EMPTY, BLOCK1, 2, 3, 4, 5, BOOM), (BOTTOM_SCORE)

     

    - Title(void), GameTitle(void) : 첫 화면과 게임 상단 타이틀 화면 표시

     

    - GameRender(void), GameMapSource(void) : 블록을 배열에 맞게 세팅, 주변 테두리

     

    - SourceCursor(int x, int y) : 유저의 커서 위치를 알기 위한 애니메이션

     

    - GameMapSourceFill(void), GameMapSourceDown(void) : 빈 공간 설정 및 랜덤하게 블록 채워넣음

     

    - CheckBoomHorizontal, Vertical : 자신의 위치를 기준으로 상하좌우 비교

     

    - InitializeView(void), Gotoxy(int x, int y) : 시작 화면 초기화, printf를 이용하여 x, y 좌표에 맞는 커서 이동 (리눅스)

     

     

    * main.c (system, view, input을 모두 받아들여 순서에 맞게 각 이용 함수들 호출)



    3. 사용자 매뉴얼 (구현기능 설명)

     

    * 9 x 9 크기의 블록의 맵, 5가지 (빨강, 파랑, 초록, 노랑, 하늘) 색의 블록

     

    * 이동은 (WASD) 순서대로 위, 왼쪽, 아래, 오른쪽으로 커서가 이동

     

    * 자신의 위치에 맞게 블록을 누르면 (SpaceBar) 블록이 제거 됨

     

    * 제거 기준은 상하좌우로 블록 2개 이상일 경우 제거 됨

     

    * 블록이 4개가 이상일 경우, 특별한 블록이 생성 됨

    특별한 블록은 블록을 기준으로 십자 모양의 블록을 제거

     

    * 제거할 수 없는 블록이라면 25, 제거한 블록은 + 100

     

    * 게임의 목표는 최대한 오래 플레이하는 것이며

    초기 제거 횟수는 5, 제거 블록 목표는 10개이다.

    10개 이상을 제거한다면 횟수가 5번 추가되고, 목표가 10개 더 추가된다.

     

    * 횟수가 0이 되면 게임이 종료되고 최고 점수가 저장



    4. 개발 과정 소개

     

    * 과정

    - main.c, system.c, input.c, view.c 및 헤더파일 오브젝트로 변환(gcc)

     

    - 각 헤더파일을 가지고있는 main.c에서 순서대로 메소드를 호출 (system.h, input.h, view.h)

    인트로 화면 (InputKey) -> 타이틀 및 블록 생성 -> 키 입력 -> 종료

     

    * 문제점

    - 프로토 타입에서는 시간 45초가 주어져 최대한 점수를 많이 내려했다.

    Thread를 이용하여 Gotoxy 좌표로 시간을 변경하려했었으나 그 타이밍에 입력 된

    문자들이 함께 출력되며 오류가 발생하여 게임 목표를 수정하게 되었다.

     

    - 난이도 조절이 어려웠다.

    랜덤으로 제작되는 블록이기에 재미요소나 스테이지 개념을 추가하지 못하였다.

     

    * 구현 기술

    - (x, y) 위치를 기준으로 2차원 배열 속 자신의 위치

     

    - 지정된 위치에서 상하좌우의 연속된 블록을 제거

    비교함과 동시에 제거하면 다음 블록에서 문제가 생긴다 그렇기에 기준은 마지막에

    제거하며 같은 블록들을 먼저 제거한다.

     

    - 배열의 가장 위부터 비어있는 곳에 블록을 채워 넣는다

    이후 아래가 비어있는지 판단하여 채워넣고 다시 위를 채운다



     

Designed by Tistory.