2013-01-03 1 views
2
으로 번역

저는 파이썬에서 C#으로 게임 프로젝트를위한 코드를 이식하고 있습니다. 지금은 특정 코드 조각을 번역하는 데 어려움을 겪고 있습니다. 두 곳의 우주선이 우호적인지 아니면 서로 적대적인지를 게임에서 확인합니다. 진영은 정수를 통해 식별됩니다. 적대적인 또는 친숙한 진영 번호 목록이 사용됩니다.목록 생성의 지시문을 Python에서 C#

def is_hostile_faction(ownF, oppF): 
    hostile_factions = { 1:[5], 2:[4,5], 3:[5], 4:[2,5], 5:[1,2,3,4], 6:[5], 7:[8,9,10], 8:[5,7,9,10], 9:[7,8,10], 10:[7,8,9]} 
    if oppF in hostile_factions[ownF]: 
     return True 
    else: 
     return False 

def is_allied_faction(ownF, oppF): 
    allied_factions = { 1:[1,2], 2:[1,2,3], 3:[3], 4:[4], 5:[5], 6:[1,2,3,6], 7:[7], 8:[8], 9:[9], 10:[10] }  
    if oppF in allied_factions[ownF]: 
     return True 
    else: 
     return False 

각각 : 적의 friendlyness 또는 확인을위한

기능은 (파이썬)이다. 지금까지 그렇게 쉽게. 내가 좋아하는 추한 코드를 작성하지 않고 C#에서 동일한 기능을 다시 것입니다 방법 :

List<int> faction1hostiles = new List<int> {5}; 
List<int> faction2hostiles = new List<int> {4,5}; 
// etc 
Dictionary<int,List<int>> hostileFactions = new Dictionary<int,List<int>(); 
hostileFactions.Add(faction1hostiles); 
hostileFactions.Add(faction2hostiles); 
// etc 

public void isHostile(int ownF, int oppF) { 
    if (hostileFactions[ownF].Contains(oppF)) { 
     return true; } 
    else { return false; } 
} 

// same for friendly factions 

전 코드를 파이썬 (Panda3D를 프레임 워크)이며, 대상 코드는 C#을 (Unity3D 프레임 워크)입니다. 데이터 구조가 즉석에서 생성되는 Python 코드의 단순성을 고려할 때 C#의 경우에도 똑같이 간단한 솔루션이 필요합니까?

+4

이 * * 코드는 일반적으로 끔찍한 생각입니다 번역 시도 - 항상 다른 적합하지 않는 하나의 언어에 맞는 솔루션을 제공합니다. 단순히 다른 언어로 다시 구현하는 것이 가장 좋습니다. –

+0

@Lattyware에 완전히 동의합니다 –

답변

1

"못생긴 코드"에 따라 다릅니다. 당신은 다음과 같이 쓸 수있다 :

var allies = new Dictionary<int, List<int>>{ 
    {1, new List<int>{1,2}}, 
    {2, new List<int>{1,2,3}}, 
    //... 
}; 

을 또는 당신은 다음과 같은 특정 적대 행위와 제휴를 추적 할 수 있습니다 : 당신은 결코 동맹국의 실제 목록을 원하는 것 없습니다하는 경우,

var alliances = new[]{ 
    new {a=1,b=1}, 
    new {a=1,b=2}, 
    new {a=2,b=1}, 
    new {a=2,b=2}, 
    new {a=2,b=3}, 
    //... 
}; 

var allies = alliances.ToLookup(e => e.a, e => e.b); 

또는

private struct TeamPair 
{ 
    private int _team1; 
    private int _team2; 
    public TeamPair(int team1, int team2) 
    { 
     _team1 = team1; 
     _team2 = team2; 
    } 
} 

ISet<TeamPair> alliances = new HashSet<TeamPair>(
    new[]{ 
     new {a=1,b=1}, 
     new {a=1,b=2}, 
     new {a=2,b=1}, 
     new {a=2,b=2}, 
     new {a=2,b=3}, 
     // ... 
    }.Select(e => new TeamPair(e.a, e.b))); 


public bool isAllied(int ownF, int oppF) { 
    return alliances.Contains(new TeamPair(ownF, oppF)); 
} 

당신이 재치 올 수있는 확실 해요 : 주어진 팀, 대신 당신은 빨리 두 팀은 동맹을 가지고 있는지, 당신과 같이, 연합 팀 쌍의 집합을 만들 수 있습니다 발견 할 h 정말로 원한다면, 배열의 배열을 사용하는 좀 더 간결한 구문.

그러나 코드 외에도 XML 또는 CSV 파일 또는 관계형 데이터베이스에 얼라이언스 매핑을 저장 한 다음 코드를 사용하여 해당 데이터를 데이터 구조로 읽을 수 있습니다. 데이터에 코드를 너무 많이 묶는 것처럼 느껴집니다.

@Lattyware에서 언급했듯이 다시 쓰기를 수행하면 새로운 언어에 대한 프로그램을 작성하는 더 좋은 방법을 생각할 수있는 특별한 기회가 생깁니다. 직접 번역은 거의 사용하지 않는 것이 가장 좋습니다. 원저자조차도 오늘 다시 할 기회가 있다면 게임을 쓰지 않을 것입니다.

+0

코드에 감사드립니다. 나중에 자세히 살펴 보겠습니다. 네, 너무 많은 데이터를 제 코드로 연결하고 있습니다. 충분한 데이터가 축적되면 데이터를 기존 파일과 같은 XML 파일로 외부화합니다. 감사. – Bradamante

2

난 당신이 그런 일을 할 수 있다고 생각 :

Dictionary<int,int[]> hostileFactions = new Dictionary<int,int[]>(){ 
    {1,new[]{5}}, {2,new[]{4,5}} 
}; 

public void isHostile(int ownF, int oppF) { 
    return hostileFactions[ownF].Contains(oppF) 
} 
+0

예, 그런 정도의 것이 작동합니다. 감사. 나는 여기서 한 것처럼 새로운 문장을 "인라인"으로 사용할 수 있다고 생각하지 않았습니다. 나는 타입 선언 된 변수에 그것을 묶어야한다고 생각하고 이것을 참조 컬렉션에 추가한다. – Bradamante