2015-01-20 4 views
1

나는 java를 사용하여 전쟁 게임을하고있다. 이 wargame에는 다른 전투 유닛이 있습니다. 유닛은 모두 '인간', '드워프', '엘프'등의 고유 한 속성을 가진 유닛입니다. 이러한 속성을 수용하기 위해 나는 추상적 인 'Unit'클래스를 확장 한 '인간', '드워프'및 '엘프'클래스를 현재 보유하고 있습니다.wargame 상호 작용을위한 디자인 패턴

이제 피해 도표를 프로그램하고 싶습니다. 예를 들어 인간이 왜소를 공격하면 56 데미지를 입 힙니다. 드워프가 엘프를 ​​공격하면 27의 피해를 입 힙니다. 단위 간의 각 상호 작용은 고유하며 숫자를 제공합니다.

새로운 유닛을 추가하고 손상 차트를 업데이트하여 서로 다른 유닛과 상호 작용할 수 있도록 디자인 패턴을 찾고 있습니다. 또한 유닛을 쉽게 제거해야합니다.

각 유닛에 고유 한 ID를 부여하고이 유닛과 같은 메소드를 넣는 방법에 대해 생각했습니다.

public int getDamage(Unit defender) { 
    switch(defender.getID() { 
     case 0: return 27; 
     case 1: return 50; 
     .... 
    } 
} 

그러나 추가하거나 '단위'를 구현하는 각 클래스에서 switch 문을 변경해야하기 때문에 단위 이런 식으로 제거하기가 매우 거추장스러운 것 같다. 그것은 또한 아주 읽기 쉽지 않다. switch 문을 별도의 'Damage Chart'클래스에 넣는 방법에 대해서도 생각했습니다. 그러나 이것은 공격자를위한 switch 문을 필요로하며 중첩 된 switch 문을 생성합니다 (추한 것입니다).

해결 방법이 있습니까? 어쩌면 이런 종류의 문제에 대한 디자인 패턴이 이미 존재할 수 있습니까?

답변

1

이런 종류의 문제를 "double dispatch"이라고하며 다른 해결책이 있습니다. 예를 들어, 주어진 종의 수가 있고 그 사이의 공격에 관심을 가질뿐만 아니라 실제 종에 의존하는 다양한 결정 (드로잉, 외교, 행운 등)이 증가하는 경우 visitor pattern을 사용하십시오.

+0

또한 방문자 패턴을 제안합니다. 제네릭과 결합해서, 그것은 꽤 잘해야합니다. – Korashen

+0

이것은 공격자와 수비수를 다른 모드로 방문하는 AttackVisitor를 의미합니다. 공격자와 방어자의 조합마다 적어도 하나의 방법을 쓰게됩니다. 그러한 조합은 (단위의 수, 제곱) 있습니다. 이것은 나에게 매우 다루기 힘든 것으로 들리지 않습니다. – Svante

+0

결국 n^2 숫자를 입력해야합니다. n^2 방법을 만드는 것은 그다지 다르지 않습니다. 또한 id-numbers (나는 싫어한다.)를 사용하지 못하게하고 코드를 읽을 수있게 해준다. 그러나 나는 나의 단위가 지금 양쪽 다 방문자이고 beiing하고있는 것을 보는 것은 약간 이상하게 보인다. 그러나 이것이 최선의 해결책이라고 생각합니다! Thnx! – kerel123

0

피해를 실제로 가하고 싶다면 공격자와 수비수에 따라 상황에 따라 다르므로이 수치를 관리해야합니다. 이것은 실제로 2 차원 행렬입니다. 다른 단위를 추가 할 때마다 현재 단위 수 (1 행 및 1 열)를 해당 행렬에 2 배 추가해야합니다. 나는 이것을 위해 2 차원 배열을 사용할 것이다.

많은 유닛이 있다면, 이것은 매우 지루합니다. 나는 공격과 방어 등급 (예 : 드워프 액스맨 30/20), "무엇인가"(예 : 엘프, 드워프)와 몇 가지 스페셜 (예 : 엘프에 대해 + 4/+ 1)으로 유닛을 태깅하거나, axemen에 대하여 5/0). 그렇게하면 나머지는 간단한 계산이므로 새 단위를 추가하고 몇 개의 태그와 스페셜을 적용하고 완료 할 수 있습니다.

즉, 나는 언어 문제가 아니라 데이터 문제가 있다고 생각합니다.