An open API service indexing awesome lists of open source software.

https://github.com/seongwonp/shooting_game

C 언어와 Windows 콘솔 환경을 활용해 개발한 우주선 슈팅 게임입니다.
https://github.com/seongwonp/shooting_game

c console-game windows

Last synced: 9 months ago
JSON representation

C 언어와 Windows 콘솔 환경을 활용해 개발한 우주선 슈팅 게임입니다.

Awesome Lists containing this project

README

          

# 🚀 슈팅 게임 – C 언어 콘솔 프로젝트

게임 시작 화면

> C 언어와 Windows 콘솔 환경을 활용해 개발한 **우주선 슈팅 게임**입니다.
> 시작 화면부터 플레이어/적 이동, 총알 발사, 충돌 판정, 점수 시스템까지
> 다양한 기능을 직접 구현하며 콘솔 기반 게임 프로그래밍을 경험했습니다.

---

## 🎯 주요 특징

- ASCII 아트로 구성된 시작 화면
- 방향키 이동 및 스페이스바 총알 발사
- 적 랜덤 생성 및 충돌 판정
- 점수 집계, 생명 시스템, 게임 오버 화면
- 실시간 입력 처리 (`GetAsyncKeyState`) 및 커서 제어 (`gotoxy`)

---

## 📌 프로젝트 개요

- **언어**: C
- **개발 환경**: Visual Studio (Windows 10)
- **플랫폼**: Windows 콘솔 애플리케이션
- **목표**: Windows API와 C 언어만을 활용하여 고전 슈팅 게임 구현
- **주요 기능**:
- ASCII 아트로 구성된 시작 화면
- 플레이어 및 적 이동
- 총알 발사 및 충돌 판정
- 점수 집계 및 게임 오버 화면

---

## 🔍 기술적 연구

- `windows.h`, `stdbool.h` 헤더 학습
- 커서 이동을 위한 `gotoxy()` 구현
- `kbhit()` 대신 `GetAsyncKeyState()`를 사용하여 실시간 입력 처리
- 캐릭터 겹침 현상 및 무한 생성 버그 해결
- 메모리 최적화 및 성능 개선

---

## 🎮 게임 기능

### 🖼️ 시작 화면
- ASCII 아트 인트로
- 메뉴 옵션: 게임 시작, 도움말, 종료

### 🎮 게임 플레이
- 방향키로 플레이어 이동
- 스페이스바로 총알 발사
- 적은 랜덤 위치에서 생성되어 이동
- 총알과 적의 충돌 판정
- 적 처치 시 점수 +10

### 💥 게임 오버
- 플레이어는 3개의 생명(하트)을 가짐
- 생명 소진 시 게임 종료
- 최종 점수와 "THE END" 메시지 출력

---

## ⚙️ 구현 세부사항

### 📁 헤더 파일

- `player_functions.h`: 텍스트 색상, 커서 숨김, gotoxy 함수
- `game_functions.h`: 메뉴, 도움말 화면, 플레이어 그리기/지우기

### 📂 소스 파일

- `player_functions.c`: Windows API 기반 커서 및 색상 처리
- `game_functions.c`: UI 및 플레이어 렌더링
- `Shooting_game.c`: 메인 게임 루프, 입력 처리, 적 로직, 충돌 판정

### ⌨️ 실시간 입력 처리

```c
if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
*ch = LEFT;
}
```

- 부드러운 이동 지원
- 다중 키 입력 가능
- 게임과 같은 인터랙티브 환경에 적합

---

## 🛠️ 개발 로그

| 날짜 | 진행 내용 |
|--------------|-----------|
| 2023-09-01 | 프로젝트 시작 |
| 2023-09-08 | 주제 선정 및 계획 |
| 2023-09-20 | 기본적인 뼈대 완성 |
| 2023-10-08 | 시작 화면 구현 완료 |
| 2023-10-31 | ASCII 아트 수정, 도움말 화면 추가, 입력 버그 수정 |
| 2023-11-02 | 총알 발사(Space), 속도 조절(Q/E) 기능 추가 |
| 2023-11-15 | 적 랜덤 생성, 겹침 현상 해결 |
| 2023-11-20 | 적 총알 로직, 생명 시스템 추가 |
| 2023-11-25 | 점수 시스템 구현, 충돌 버그 수정 |
| 2023-12-03 | 적 생성 위치 조정, 총알 시각 개선 |
| 2023-12-10 | 시작 화면 리디자인, 최종 테스트 완료 |
| 2023-12-13 | ASCII 문자 → "●" 변경, 테두리 추가 |

---

## 📸 게임 화면

### 🧵 시작 화면 리디자인

**이전 버전**
![Old Start Screen](images/start_old.png)

⬇️

**최신 버전**
![New Start Screen](images/start_new.png)

---

### ❓ 도움말 페이지
> 조작법 안내 후 키 입력 대기

![Help Page](images/help_page.png)

---

### ❤️ 생명 시스템

![Life System](images/life1.png)
➡️
![Life System](images/life2.png)
➡️
![Life System](images/life3.png)

---

### 🕹️ 게임 플레이 미리보기

![Gameplay GIF](images/gamePlay.gif)

---

### 💀 게임 오버 화면

![Game Over GIF](images/gameover.gif)

---

## 🔧 예정 기능

- 아이템 드롭 (추가 생명, 무기 강화)
- 단계별 난이도 조절
- 배경음 및 효과음 추가
- 저장 기능 및 최고 점수 랭킹

---

## 🧠 어려웠던 점 & 배운 것

- `kbhit()` 없이 실시간 입력 구현이 까다로웠음
- ASCII 아트 디자인에 많은 시간 소요
- 헤더/소스 파일 분리로 모듈화 학습
- Windows 콘솔 프로그래밍에 대한 이해도 향상

---

## 📚 참고 자료

- 윤성우의 열혈 C 프로그래밍 (2010)
- Dongkyung 블로그
- Cinrueom 블로그
- Coding Factory
- Wikipedia: [windows.h](https://ko.wikipedia.org/wiki/Windows.h)

---

## 💭 회고

이번 슈팅 게임 프로젝트는 단순한 콘솔 게임 구현을 넘어
**C 언어의 구조적 사고와 시스템 프로그래밍의 기초를 몸으로 익히는 과정**이었습니다.

처음에는 단순히 캐릭터를 움직이고 점수를 올리는 기능을 구현하는 데 집중했지만,
점차 게임의 흐름을 제어하고, 사용자 입력을 실시간으로 처리하며,
**모듈화된 구조로 기능을 분리하는 설계의 중요성**을 깊이 체감하게 되었습니다.

특히 `gotoxy()`와 `GetAsyncKeyState()`를 활용한 커서 제어와 실시간 입력 처리 과정은
**콘솔 환경에서도 충분히 인터랙티브한 사용자 경험을 만들 수 있다는 가능성**을 보여주었고,
단순한 텍스트 기반 UI에서도 **몰입감 있는 게임 플레이**를 구현할 수 있다는 점에서 큰 재미와 성취감을 느꼈습니다.

또한, 헤더 파일과 소스 파일을 기능별로 나누고,
게임 루프, 충돌 판정, 점수 시스템 등을 구조적으로 설계하면서
**코드의 가독성과 유지보수성**이 얼마나 중요한지 직접 경험할 수 있었습니다.

무엇보다도, 이 프로젝트는 “C 언어로 무엇을 만들 수 있을까?”라는 질문에
**나만의 답을 찾아가는 여정**이었고,
그 과정에서 얻은 자신감은 앞으로의 콘솔 게임 프로그래밍 학습에 큰 자산이 될 것입니다.