트레이딩 카드 게임의 "특수 효과 카드"를 구현하는 방법은 무엇입니까?


16

나는 일종의 트레이딩 카드 게임을 여기에 쓰려고 노력하고 있습니다. 어떻게하면 매직 개더링 또는 Yu-Gi-Oh 와 비슷합니다 ! 카드 게임.

기본적으로 게임에 익숙하지 않은 사람들에게는 게임의 규칙을 구부릴 수있는 특수 효과가있는 특별한 종류의 카드 (맞춤법 카드 / 트랩 카드 등)가 있습니다. 내가 전혀 모르는 것은이 카드의 논리를 구현하는 방법입니다. 카드의 데이터를 어떤 종류의 능력을 나타낼 수있는 플래그로 저장하는 것에 대한 아이디어가 있지만, 할 수있는 일에는 매우 제한적입니다 (일부 간단한 통계 수정 일 것입니다).

이 카드가 어떤 효과를 가질 수 있는지에 대한 정보를 제공하기 위해 Yu-Gi-Oh에 존재하는 스펠 카드 효과의 예가 있습니다 ! 카드 게임:

  • 파괴 된 생물을 소생 시키십시오
  • 상대방의 생물을 지배하십시오
  • 특정 조건에 따라 생물의 통계를 수정합니다 (예 : 파괴 된 특정 이름을 가진 생물의 수)
  • 일부 조건이 충족되면 특정 생물을 특수 소환합니다.
  • 둘 이상의 생물을 더 강한 생물로 융합시킵니다.
  • 특수 카드 효과 중 일부에 대한 면역.

Konami는 AI와 수천 가지의 카드로 완성 된 게임의 여러 비디오 게임을 만들었습니다. 실제로 전체 데이터베이스를 하드 코딩하는 것이 가능하지 않다고 생각합니까?

물론, 제가하려고하는 것은 그 게임만큼 복잡한 곳이 없지만 궁금합니다. 어떻게 구현할까요?

답변:


17

이러한 특성의 여러 오픈 소스 프로젝트가 있으며 규칙을 구현하는 방법이 다릅니다. 다음은 잘 알려진 MtG 구현 중 하나 인 CardForge의 작성자가 작성한 블로그 항목 입니다. 전체 목록은 아니지만 코드를 찾아 보거나 포럼을 방문하여 특정 질문을 할 수있는 몇 가지 오픈 소스 프로젝트가 포함되어 있습니다.

실제 답변 : 강력한 프레임 워크에 대한 최선의 방법은 엄격하게 객체 지향 프로그래밍을 사용하는 것입니다. 모든 행동, 모든 방아쇠, 모든 능력은 개체입니다. Hand, Library와 같은 영역도 말할 것도없이 개체입니다. 규칙 엔진에서 게임 오브젝트를 설명하기 위해 문자열이나 정수와 같은 멍청한 오브젝트를 절대 전달하지 말고 오브젝트 만 설명하십시오.

모든 액션은 스택에 여러 트리거를 배치하며, 다른 모든 능력은 특정 트리거에 대해 관심이 있는지 여부를 확인할 수 있으며, 해당하는 경우 자체 액션을 실행하여 잠재적으로 새 트리거를 생성하는 등의 작업을 수행 할 수 있습니다.

그런 다음 스택이 비워 질 때까지 게임의 규칙에 따라 해당 스택을 처리하여 새로운 조치를 취할 수 있습니다.

게임 규칙을 완벽하게 구현하면 규칙 코드에 단일 하드 코드 된 카드가 포함되지 않는 것이 이상적입니다. 하드 코딩 카드는 편리한 지름길을 만들 수 있지만 장기적으로는 코드가 부풀려지고 새로운 카드가 출시 될 때와 같이 새로운 방식으로 해당 카드와 상호 작용할 수있는 잠재적 인 함정이 생길 수 있습니다. MtG와 같은 12,000 개가 넘는 고유 카드가 있고 끝이 보이지 않는 게임에는 많은 상호 작용이 있습니다.


1
좋은 대답입니다. 함수형 프로그래밍 세계에서 나온다면, 나는 각 카드가 게임 환경을 폐쇄하고 훨씬 더 엄청나게 만들었습니다. 예를 들어, 카드는 영역 목록에 카드 목록을 추가하여 새 "영역"을 만들 수 있습니다. 구체적으로 : Zombie Monster Mayhem : 패배 한 모든 생물은 특별한 능력없이 새로운 "공동 묘지"에서 부활하고 주사위 굴림에 따라 무작위로 플레이어를 공격합니다.
brice

추가 링크 : github.com/Fluorohydride/ygopro-core 유명한 오픈 소스 YGO 구현, YGO 이후는 질문에 언급되었다.
SK19

2

스위치와 변수만으로 모든 것을 통합하는 것은 헛된 일입니다. 함수를 하드 코딩하거나 런타임 중에 해석하는 스크립트가 있어야합니다. 보드와 데크 및 묘지의 상태를 스크립트에 확인하고 작업을 실행하는 기능 등을 확인하는 데 필요한 기능을 노출합니다. 그런 다음 스크립트는 카드와 관련된 다른 변수와 함께 저장할 간단한 문자열입니다.


또는 hackworth가 제안한 것처럼, 필요한 동작을 얻기 위해 결합 된 일종의 공통 블록을 가지고 있습니다. 그가 제안한 것 외에도 일부 논리 블록이 필요할 것이라고 생각합니다. 공유 동작 블록을 가지면 공유 품질이있는 카드를 더 쉽게 필터링 할 수 있습니다.
Toni

1

또한 mysql db로 웹 언어를 사용하여 카드 게임을 계획하고 있습니다. 나는 현재 매우 일반적인 설정을하려고하므로 새로운 고유 카드에 매우 유연하게 유지됩니다. 예를 들어 대신 :

reduceHitPoints() { } 
reduceMana() { }
reduceSpeed() { }

그것은 쉽게 될 수 있습니다 :

reduce($attacker, $target, $reduceWhat, $amount) { }
massReduce($attacker, Array $targets, $reduceWhat, $amount) { }

모든 행동에이 개념을 적용하면 클래스를 단순화 할 수 있으며 카드 테이블에 단일 행을 추가하여 새로운 카드를 만들 수 있습니다.

모든 옵션과 능력은 해당 단일 행의 db에 정의됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.