-
리눅스로 제작한 미니게임 (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차원 배열 속 자신의 위치
- 지정된 위치에서 상하좌우의 연속된 블록을 제거
비교함과 동시에 제거하면 다음 블록에서 문제가 생긴다 그렇기에 기준은 마지막에
제거하며 같은 블록들을 먼저 제거한다.
- 배열의 가장 위부터 비어있는 곳에 블록을 채워 넣는다
이후 아래가 비어있는지 판단하여 채워넣고 다시 위를 채운다
'과제 결과물' 카테고리의 다른 글
리눅스로 제작한 미니게임 (C언어) - 2 (getch, kbhit, sleep) (0) 2018.06.08 아두이노 우노 알람시계 (0) 2018.06.06