2008-10-26 2 views
1

게임을 만들고 있는데, 그 중 하나가 스킬 값에 따라 캐릭터의 기본 히트 수를 계산합니다. 이 방법은 현재 각 스킬을 짧은, 중간 및 긴 범위에서 사용할 수 있으므로 각 값을 개별적으로 계산합니다.게임의 "히트"값 리팩토링

필자는 원래 스킬을 튜플에 결합하고 반복하여 각 히트 번호를 동적으로 생성 할 수 있다고 생각했습니다. 그러나 실제로 현재 가능한지 여부는 알지 못합니다. 현재 각 히트 번호가 자신의 변수에 할당되어 있기 때문입니다.

또한 각 범위에 대한 메서드를 만들고 튜플을 인수로 전달하는 방법을 고려했습니다. 결과 값으로 새로운 튜플 또는리스트를 생성 한 다음 개별 변수에 할당 할 수는 있지만, 그렇게 보이지 않는다는 점을 제외하고는 이런 식으로하는 것이 더 낫지는 않습니다. 복사 & 붙여 넣기 .

def calcBaseHitNumbers(self, dict): 
     """Calculate character's base hit numbers depending on skill level.""" 

     self.skill_dict = dict 

     self.rifle = self.skill_dict.get('CRM', 0) 
     self.pistol = self.skill_dict.get('PST', 0) 
     self.big_gun = self.skill_dict.get('LCG', 0) 
     self.heavy_weapon = self.skill_dict.get('HW', 0) 
     self.bow = self.skill_dict.get('LB', 0) 
     #self.skill_tuple = (self.rifle, self.pistol, self.big_gun, self.heavy_weapon, 
     # self.bow) 

#---Short range 
##  for skill in self.skill_tuple: 
##   self.base_hit_short = skill * 0.6 
     self.charAttribs.bhCRM_short = self.rifle * 0.6 
     self.charAttribs.bhPST_short = self.pistol * 0.6 
     self.charAttribs.bhHW_short = self.heavy_weapon * 0.6 
     self.charAttribs.bhLCG_short = self.big_gun * 0.6 
     self.charAttribs.bhLB_short = self.bow * 0.6 
#---Med range 
     self.charAttribs.bhCRM_med = self.rifle * 0.3 
     self.charAttribs.bhPST_med = self.pistol * 0.3 
     self.charAttribs.bhHW_med = self.heavy_weapon * 0.3 
     self.charAttribs.bhLCG_med = self.big_gun * 0.3 
     self.charAttribs.bhLB_med = self.bow * 0.3 
#---Long range 
     self.charAttribs.bhCRM_long = self.rifle * 0.1 
     self.charAttribs.bhPST_long = self.pistol * 0.1 
     self.charAttribs.bhHW_long = self.heavy_weapon * 0.1 
     self.charAttribs.bhLCG_long = self.big_gun * 0.1 
     self.charAttribs.bhLB_long = self.bow * 0.1 

어떻게 당신이 더 역동적이다이 때문에 리팩토링 것 : 여기

내가 현재 가지고 무엇인가?


편집 : (3 회, 새 값을 때마다 (나는 주석 것과 같은) 튜플을하고 그것을 반복 : 나는 내가하고 싶은 것은이 같은 추측 각 스킬)을 각 특정 범위에 대한 수정자를 기반으로합니다. 그런 다음 결과 값이 해당 변수에 자동으로 지정됩니다.

내 머리 속에는 의미가 있습니다. 그러나 실제로 코드를 작성하려고하면 길을 잃을 수 있습니다. 제 생각에이 문제는 제가 처음 작성한 "실제"프로그램이라는 것입니다. 이전에 해본 모든 것은 작은 스크립트입니다.

이것은 내 프로그램의 0.1 버전에 불과하므로 지금 리팩터링하는 것은 중요하지 않습니다. 그러나이 작업을 수동으로 수행하는 것은 매우 불합리한 것으로 보입니다. 또한 상황이 변화 될 경우 대비해 "미래 보장"하고 싶습니다.

답변

0

@Vinko : 아마도 calcBaseHitNumbers를 만들고, if not self.calculatedBase : "내부적으로 확인하고, 이전에 완료 되었다면 아무 작업도하지 마십시오. 즉, 나는이 정보를 미리 계산할 필요가 절실하다는 것을 알 수 없다. 하지만 파이썬 성능 전문가는 아닙니다.

+0

나는 내 대답을 삭제 ' –

+0

더 나은 야고보과 같이 주석으로 그 추가해야 당신이 대답 –

+0

을 제시하지 않을 경우 내가 코멘트를 할 때를 게시 할 담당자가 없었어요 나는 그것을 썼다. –

1

당신이 이해할 수 있는지 보자. 각 무기마다 고유 한 명중 포인트가있어서 소총 1 개, 무거운 무기 2 개 등이있을 수있다. 그런 다음 각 캐릭터는 짧고 중간 정도의 값을 곱하여 무기의 히트 포인트.

전략 디자인 사용을 고려해야합니다. 그것은 히트 포인트 속성을 가진 무기 수퍼 클래스를 생성합니다. 라이플, 권총, 활 등을위한 서브 클래스 무기를 만드십시오. 나는 무기 간의 차이점이 히트 포인트 이상이라는 것을 확신합니다.

그런 다음 캐릭터에는 게임 플레이에 따라 하나 이상의 무기가 있습니다. 특정 무기의 히트 포인트를 계산하는 것은 간단

current_weapon * self.medium 

당신은 당신이 당신의 캐릭터가 어떤 무기를 처리 할 수 ​​있기 때문에 당신의 문자 코드를 편집하지 않아도 나중에 더 많은 무기를 추가하기로 결정하는 경우

있다.

의사 파이썬에서

class Weapon 
    hit = 1 
    #other properties of weapon 

class Rifle(Weapon) 
    #other properties of Rifle 

class Pistol(Weapon) 
    #other properties of Pistol 

class Character 
    weapon = Rifle() 
    long=0.6 
    def calcHit() 
     return self.long*weapon.hit 

john = Character() 
john.weapon= Rifle() 
john.calcHit 
0

당신은 동적 어떤 감각을 의미합니까?기술의 수 또는 가중 요인, 범위 수 (짧음, 중간, 긴) 또는이 모두가 다를 수 있습니다.

이후 bhPST_ * 값은 어떻게됩니까? 하나의 숫자로 결합 되나요? 밖으로 뛰어

한 가지 기술의 목록이 코드에 하드 와이어되는 것입니다 - 나는 방법 그래서

와 BH 변수를 대체하는 경향 될 것이다 (내가 처음을 모르는 고려하시기 바랍니다 당신의 체력 및에 기여하는 기술의 목록을 유지할 수 있습니다

이제
def bh_short(self, key) 
    skill = self.skill_dict.get(key, 0) 
    return skill * 0.6 

파이썬 :))에 대한 것은 bh_short 등을 호출하면

가능성도에게 범위 (긴 짧은 의대)를 통과 것을 반복 함수를 반환하거나 세 값을 모두 반환합니다. 모두 계산 된 체력 상태에 따라 다음에 수행 할 작업에 따라 다릅니다.

기본적으로, 우리는이

6

그것은 여러 가지로 히트 값을 기본 값을 처리하고 계산하는 속성을, 당신은 정말 클래스가 무기를 나타내는되어 원하는 느낌에 사용되는 컨텍스트에 대한 자세한 정보가 필요 수식어. 당신은 다음처럼 문자 객체의 내부 무기의 인스턴스를 만들 수 있습니다, 거기에서

SHORT_RANGE = 'S' 
MEDIUM_RANGE = 'M' 
LONG_RANGE = 'L' 
SHORT_RANGE_MODIFIER = 0.6 
MEDIUM_RANGE_MODIFIER = 0.3 
LONG_RANGE_MODIFIER = 0.1 

class Weapon(object): 
    def __init__(self, code_name, full_name, base_hit_value, 
       short_range_modifier=None, medium_range_modifier=None, 
       long_range_modifier=None): 
     self.code_name, self.full_name = code_name, full_name 
     self.base_hit_value = base_hit_value 
     self.range_modifiers = { 
      SHORT_RANGE: short_range_modifier or SHORT_RANGE_MODIFIER, 
      MEDIUM_RANGE: medium_range_modifier or MEDIUM_RANGE_MODIFIER, 
      LONG_RANGE: long_range_modifier or LONG_RANGE_MODIFIER, 
     } 

    def hit_value(self, range, modifier=1): 
     return self.base_hit_value * self.range_modifiers[range] * modifier 

: 다음

self.rifle = Weapon('CRM', 'rifle', 5) 
    self.pistol = Weapon('PST', 'pistol', 10) 

그리고 말, 문자는 짧은 거리에서 권총을 발사, 경우 다음은 간단한 예입니다 :

hit_value = self.pistol.hit_value(SHORT_RANGE) 

hit_value() 메서드에 대한 추가 인수를 사용하여 문자 또는 상황 별 수정 사항을 전달할 수 있습니다.

물론, 다음 단계는 무기의 하위 클래스로 무기를 직접 모델링하는 것입니다 (총기, 활, 수류탄 등의 특정 유형의 무기로 분해하여 각각 기본 값을 가짐) 캐릭터가 가지고있는 무기를 나타내는 Inventory 클래스를 추가하십시오.

이 모든 것은 꽤 지루하고 객체 지향적 인 디자인 절차이지만, 이런 유형의 사고는 당신을 신속하게 내리고 최소한의 기본 유연성을 제공합니다.

+0

사전 계산이 중요하다면 (나는 정말로 의심 스럽지만) 그는 hit_value 메소드에 대한 메모 작성을 사용할 수 있습니다 : http://code.activestate.com/recipes/52201/ –

0

(당신은 문자 클래스에서 일의 힙을 필요가 없습니다) 나는 캐릭터의 속성 클래스를 가질 것이며, 무기의 속성에 대한 클래스 :

class WeaponAttribute(object): 

    short_mod = 0.6 
    med_mod = 0.3 
    long_mod = 0.1 

    def __init__(self, base): 
     self.base = base 

    @property 
    def short(self): 
     return self.base * self.short_mod 

    @property 
    def med(self): 
     return self.base * self.med_mod 

    @property 
    def long(self): 
     return self.base * self.long_mod 


class CharacterAttributes(object): 

    def __init__(self, attributes): 
     for weapon, base in attributes.items(): 
      setattr(self, weapon, WeaponAttribute(base)) 

캐릭터의 CharacterAttributes 개체가 클래스는이처럼 사용

# Initialise 
self.charAttribs = CharacterAttributes(self.skill_dict) 
# Get some values 
print self.charAttribs.CRM.short 
print self.charAttribs.PST.med 
print self.charAttribs.LCG.long