게임 캐릭터 개발
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 90번째.
챌린지
쉬움서로 다른 캐릭터 클래스가 고유한 능력을 사용하여 전투를 벌이는 게임 캐릭터 개발 시스템을 구축해 보겠습니다. 상속, 인터페이스, 트레이트(trait), 캡슐화가 게임 컨텍스트 내에서 어떻게 함께 작동하는지 보여주는 경험치 및 레벨업 시스템을 갖춘 캐릭터 계층 구조를 만들 것입니다.
코드는 다음 6개의 파일로 구성됩니다.
Ability.php—getName(): string과use(Character $target): string이라는 두 가지 메서드를 가진Ability인터페이스를 정의합니다. 이 계약은 구체적인 효과에 관계없이 모든 능력이 일관되게 사용될 수 있도록 보장합니다.CombatLogger.php—logAction(string $action): string메서드를 제공하는CombatLogger트레이트를 만듭니다. 이 메서드는 액션 문자열 앞에"[COMBAT] "을 붙여서 반환해야 합니다. 캐릭터들은 이 트레이트를 사용하여 전투 메시지를 일관된 형식으로 출력합니다.Character.php— Ability 및 CombatLogger 파일을 포함합니다.CombatLogger트레이트를 사용하는 추상 클래스Character를 만듭니다.name(string, public readonly)에 생성자 프로모션(constructor promotion)을 사용하세요.health(int, 100에서 시작),level(int, 1에서 시작),experience(int, 0에서 시작)에 대한 private 속성을 포함합니다. 다음을 구현하세요:getHealth(): int및getLevel(): int— private 속성에 대한 게터(getter)takeDamage(int $amount): void— 체력을 감소시키되 0 미만으로 떨어지지 않게 합니다.heal(int $amount): void— 체력을 증가시키되 100을 초과하지 않게 합니다.gainExperience(int $xp): string— XP를 추가합니다. 경험치가 100 이상이 되면 레벨업(XP를 0으로 초기화, 레벨 증가, HP 20 회복)하고"[name] leveled up to [level]!"을 반환합니다. 그렇지 않으면"[name] gained [xp] XP"를 반환합니다.isAlive(): bool— 체력이 0보다 크면 true를 반환합니다.abstract getSpecialAbility(): Ability— 각 캐릭터 유형은 고유한 능력을 제공합니다.attack(Character $target): string— 대상에게 10의 데미지를 입히고,logAction()을 사용하여"[COMBAT] [name] attacks [target name] for 10 damage"를 반환합니다.
Warrior.php— Character 파일을 포함합니다.Character를 상속받는Warrior클래스를 만듭니다.Ability를 구현하는 익명 클래스를 반환하도록getSpecialAbility()를 구현하세요:getName()은"Shield Bash"를 반환합니다.use()는 25의 데미지를 입히고"[COMBAT] Shield Bash hits [target name] for 25 damage!"를 반환합니다 (트레이트의logAction()을 사용하세요).
Mage.php— Character 파일을 포함합니다.Character를 상속받는Mage클래스를 만듭니다.Ability를 구현하는 익명 클래스를 반환하도록getSpecialAbility()를 구현하세요:getName()은"Fireball"을 반환합니다.use()는 35의 데미지를 입히고"[COMBAT] Fireball engulfs [target name] for 35 damage!"를 반환합니다.
main.php— Warrior 및 Mage 파일을 포함합니다. 캐릭터 데이터(JSON)와 일련의 전투 액션(JSON)이라는 두 가지 입력을 받습니다.캐릭터 JSON 형식:
[{"type": "warrior", "name": "Thorin"}, {"type": "mage", "name": "Gandalf"}]액션 JSON 형식:
[{"action": "attack", "attacker": 0, "target": 1}, {"action": "special", "attacker": 1, "target": 0}, {"action": "xp", "character": 0, "amount": 100}, {"action": "status", "character": 0}]모든 캐릭터를 생성하고 배열(인덱스 0, 1 등)에 저장합니다. 각 액션을 처리합니다:
"attack"— attacker 인덱스의 캐릭터가 대상을 공격합니다. 결과를 출력합니다."special"— 캐릭터가 대상에게 특수 능력을 사용합니다. 결과를 출력합니다."xp"— 캐릭터가 경험치를 얻습니다. 결과를 출력합니다."heal"— 캐릭터가 주어진 양만큼 회복합니다."[name] healed to [health] HP"를 출력합니다."status"—"[name] - Level [level], HP: [health], Alive: [Yes/No]"를 출력합니다.
각 결과를 새 줄에 출력합니다.
이 시스템은 추상 클래스가 공유 캐릭터 동작을 정의하는 방법, 인터페이스가 능력이 일관된 계약을 따르도록 보장하는 방법, 트레이트가 재사용 가능한 로깅 기능을 제공하는 방법, 그리고 익명 클래스가 일회성 클래스로 코드베이스를 어지럽히지 않고 고유한 능력 구현을 만드는 방법을 보여줍니다.
직접 해보기
<?php
require_once 'Warrior.php';
require_once 'Mage.php';
// 입력 읽기
$charactersJson = trim(fgets(STDIN));
$actionsJson = trim(fgets(STDIN));
// JSON 입력 파싱
$charactersData = (array)json_decode($charactersJson, true);
$actionsData = (array)json_decode($actionsJson, true);
// TODO: 캐릭터 객체를 저장할 배열 생성
$characters = [];
// TODO: $charactersData를 반복하며 "type" 필드에 따라
// Warrior 또는 Mage 객체를 생성하고 $characters 배열에 저장
// TODO: $actionsData의 각 액션 처리
// 다음 액션 타입들을 처리:
// - "attack": 공격자 인덱스의 캐릭터가 대상을 공격; 결과 출력
// - "special": 캐릭터가 대상에게 getSpecialAbility()->use()를 사용; 결과 출력
// - "xp": 캐릭터가 경험치 획득; 결과 출력
// - "heal": 캐릭터가 회복; "[name] healed to [health] HP" 출력
// - "status": "[name] - Level [level], HP: [health], Alive: [Yes/No]" 출력
?>객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션