# 샘플 게임 만들기 ## 과제 개요 이제 우주 게임에서 게임 종료 조건과 재시작 기능을 마스터했으니, 이 개념들을 완전히 새로운 게임 경험에 적용할 차례입니다. 다양한 종료 조건 패턴과 재시작 메커니즘을 보여주는 자신만의 게임을 설계하고 구축하세요. 이 과제는 게임 디자인에 대해 창의적으로 사고하는 동시에 배운 기술적 역량을 연습하도록 도전합니다. 다양한 승리 및 패배 시나리오를 탐구하고, 플레이어 진행을 구현하며, 흥미로운 재시작 경험을 만듭니다. ## 프로젝트 요구사항 ### 핵심 게임 기능 게임에는 다음과 같은 필수 요소가 포함되어야 합니다: **종료 조건 다양성**: 게임이 끝나는 최소 두 가지 방식을 구현하세요: - **점수 기반 승리**: 플레이어가 목표 점수에 도달하거나 특정 아이템을 수집 - **목숨 기반 패배**: 플레이어가 모든 목숨 또는 체력을 잃음 - **목표 달성**: 모든 적 처치, 특정 아이템 수집 또는 목표 달성 - **시간 기반**: 설정된 시간 또는 카운트다운이 0이 되면 종료 **재시작 기능**: - **게임 상태 초기화**: 이전 게임 객체 모두 제거 및 변수 초기화 - **시스템 재설정**: 새로운 플레이어 상태, 적, 목표와 함께 새로 시작 - **사용자 친화적 조작법**: 게임 재시작을 위한 명확한 안내 제공 **플레이어 피드백**: - **승리 메시지**: 플레이어 성취를 축하하는 긍정적인 피드백 - **패배 메시지**: 재도전을 독려하는 용기 부여 메시지 제공 - **진행 표시기**: 현재 점수, 목숨, 목표 상태 표시 ### 게임 아이디어 및 영감 아래 게임 컨셉 중 하나를 선택하거나 자신만의 게임을 만드세요: #### 1. 콘솔 어드벤처 게임 전투 메커니즘이 포함된 텍스트 기반 모험 게임 만들기: ``` Hero> Strikes with broadsword - orc takes 3p damage Orc> Hits with club - hero takes 2p damage Hero> Kicks - orc takes 1p damage Game> Orc is defeated - Hero collects 2 coins Game> ****No more monsters, you have conquered the evil fortress**** ``` **구현할 핵심 기능:** - 다양한 공격 옵션이 있는 **턴제 전투** - 플레이어와 적 모두의 **체력** - 동전이나 아이템을 수집하는 **인벤토리 시스템** - 난이도가 다른 **여러 유형의 적** - 모든 적 처치 시 **승리 조건** #### 2. 수집 게임 - **목표**: 장애물을 피하면서 특정 아이템 수집 - **종료 조건**: 목표 수집 횟수 달성하거나 목숨 모두 소진 - **진행**: 게임이 진행될수록 아이템 접근 난이도 증가 #### 3. 퍼즐 게임 - **목표**: 점차 어려워지는 퍼즐 해결 - **종료 조건**: 모든 레벨 완료 또는 이동/시간 소진 - **재시작**: 진행 상황 초기화 후 첫 레벨로 초기화 #### 4. 디펜스 게임 - **목표**: 적의 웨이브로부터 기지 보호 - **종료 조건**: 모든 웨이브 생존(승리) 또는 기지 파괴(패배) - **진행**: 적 웨이브 난이도 및 수 증가 ## 구현 지침 ### 시작하기 1. **게임 디자인 계획**: - 기본 게임 플레이 루프 스케치 - 종료 조건 명확히 정의 - 재시작 시 리셋할 데이터 식별 2. **프로젝트 구조 설정**: ``` my-game/ ├── index.html ├── style.css ├── game.js └── README.md ``` 3. **핵심 게임 루프 작성**: - 게임 상태 초기화 - 사용자 입력 처리 - 게임 로직 업데이트 - 종료 조건 확인 - 현재 상태 렌더링 ### 기술적 요구사항 **최신 자바스크립트 사용**: - 변수 선언에 `const`와 `let` 사용 - 적절한 곳에 화살표 함수 활용 - 템플릿 리터럴, 구조 분해 할당 등 ES6+ 기능 적용 **이벤트 기반 아키텍처**: - 사용자 상호작용에 대한 이벤트 핸들러 생성 - 이벤트를 통한 게임 상태 변경 구현 - 재시작 기능에 이벤트 리스너 활용 **깔끔한 코드 관행**: - 단일 책임 함수 작성 - 설명적인 변수 및 함수 이름 사용 - 게임 로직과 규칙에 대한 주석 추가 - 논리적 구역으로 코드 구성 ## 제출 요구사항 ### 제출물 1. **완성된 게임 파일**: 게임 실행에 필요한 모든 HTML, CSS, JavaScript 파일 2. **README.md**: 다음 내용이 포함된 문서 - 게임 플레이 방법 - 구현된 종료 조건 - 재시작 방법 - 특별 기능 또는 메커니즘 3. **코드 주석**: 게임 로직과 알고리즘에 대한 명확한 설명 ### 테스트 체크리스트 제출 전, 아래 항목을 확인하세요: - [ ] **브라우저 콘솔에서 오류 없이 실행됨** - [ ] **명시된 여러 종료 조건 구현됨** - [ ] **게임 상태가 깔끔히 초기화되며 정상 재시작됨** - [ ] **플레이어에게 명확한 게임 상태 피드백 제공** - [ ] **최신 자바스크립트 문법과 베스트 프랙티스 사용** - [ ] **README.md에 종합적인 문서 포함** ## 평가 기준표 | 평가 항목 | 우수 (4) | 능숙 (3) | 발전 중 (2) | 초급 (1) | |----------|---------------|----------------|----------------|--------------| | **게임 기능** | 다중 종료 조건, 원활한 재시작, 완성도 높은 게임 플레이 | 기본 종료 조건과 기능적 재시작 포함한 완전한 게임 | 일부 종료 조건 구현, 재시작에 약간 문제 있음 | 기능 제한 및 심각한 버그가 있는 불완전한 게임 | | **코드 품질** | 최신 자바스크립트와 깔끔한 구조, 풍부한 주석, 체계적 코드 | 최신 문법과 적절한 주석, 명확한 구조 | 일부 최신 문법과 최소한의 주석 포함 | 구식 문법, 주석 부족, 엉성한 코드 구조 | | **사용자 경험** | 직관적이고 명확한 안내, 우수한 피드백, 몰입도 높은 종료 및 재시작 | 충분한 안내와 피드백, 기능적인 종료 및 재시작 | 기본적 안내, 제한된 게임 상태 피드백 | 혼란스러운 안내와 열악한 사용자 피드백 | | **기술 구현** | 게임 개발 개념, 이벤트 처리, 상태 관리를 능숙하게 구현 | 게임 개념을 잘 이해하고 양호한 구현 | 기본 이해와 괜찮은 구현 | 이해 부족과 열악한 구현 | | **문서화** | 명확한 안내가 있는 포괄적 README, 잘 문서화된 코드, 철저한 테스트 증거 | 명확한 안내와 적절한 주석의 우수 문서 | 최소 안내의 기본 문서화 | 불충분하거나 부재한 문서화 | ### 점수 기준 - **우수 (16-20점)**: 창의적 기능과 완성도 높은 구현으로 기대 수준 초과 - **능숙 (12-15점)**: 모든 요구사항 충족, 탄탄한 실행 - **발전 중 (8-11점)**: 대부분 요구사항 충족, 일부 사소한 문제 존재 - **초급 (4-7점)**: 일부 요구사항 충족, 크게 개선 필요 ## 추가 학습 자료 - [MDN 게임 개발 가이드](https://developer.mozilla.org/en-US/docs/Games) - [자바스크립트 게임 개발 튜토리얼](https://developer.mozilla.org/en-US/docs/Games/Tutorials) - [Canvas API 문서](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API) - [게임 디자인 원칙](https://www.gamasutra.com/blogs/) > 💡 **프로 팁**: 간단한 것부터 시작해 기능을 점진적으로 추가하세요. 잘 다듬어진 간단한 게임이 버그 많은 복잡한 게임보다 훨씬 낫습니다! --- **면책 조항**: 이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있지만, 자동 번역에는 오류나 부정확성이 포함될 수 있음을 유의하시기 바랍니다. 원문은 해당 언어의 원본 문서가 권위 있는 출처로 간주되어야 합니다. 중요한 정보의 경우 전문 인간 번역을 권장합니다. 본 번역 사용으로 인한 오해나 오역에 대해 당사는 책임을 지지 않습니다.