과제 결과물

리눅스로 제작한 미니게임 (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차원 배열 속 자신의 위치

 

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

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

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

 

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

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