2016-08-16 3 views
7

나는 AI에 대한 선택에 따라 플레이어가 승리할지 여부를 결정하는 이동 테이블을 가지고 있습니다. 락, 페이퍼, 가위 등을 많이 생각하십시오. 필자는 결국 Python으로 코딩 할 것입니다.하지만 시작하기 전에 LOTS 및 LOTS 이상의 IF 문 대신이 작업을 수행하는 더 좋은 방법이 있는지 알고 싶습니다.많은 IF 문 대신 더 나은 대안이 있습니까? 값의 테이블

표는 다음과 같습니다

enter image description here

나는 이동 같은 번호 또는 뭔가를 할당 할 필요가 있다고 생각 해요? 어디서부터 시작해야할지 모르겠다. ...

+0

어쩌면라는 클래스 움직임을 만들고에게 원래 이길 이동의 목록을 제공하고 원래에 잃는 것. 이름으로 이동을 식별하고 반대 이동의 이름이 미리 정의 된 목록 중 하나에 있으면 그 결과를 사용하십시오 –

답변

8

dict를 사용할 수 있습니까? 이런 식으로 뭔가 :

#dict of winning outcomes, the first layer represents the AI moves, and the inner 
#layer represent the player move and the outcome 
ai = { 
    'punch' : { 
     'punch' : 'tie', 
     'kick' : 'wins', 
    }, 
    'stab' : { 
     'punch' : 'loses', 
     'kick' : 'loses' 
    } 
} 

ai_move = 'punch' 
player_move = 'kick' 
print ai[ai_move][player_move] #output: wins 


ai_move = 'stab' 
player_move = 'punch' 
print ai[ai_move][player_move] #output: loses 

나는 모든 움직임을지도하지 않았다, 그러나 당신은 요점을 얻을

+1

당신은 나보다 빨리 글을 씁니다 : D @dhdavvie – burakozgul

+1

하하하니 운 좋게도 나는 편집인을 열어 내 준비 상태로 만들었습니다. 화면 @burakozgul – dhdavvie

+0

@ dhdavvie 너는 가장 논리적으로 보인다 지금까지 – Jason

0

예, 모든 가능한 조합과 사전에 키/값 쌍으로 의사 결정을 저장 키 및 결정 결과. 기본적으로 가능한 이동에 대한 조회 테이블을 만듭니다.

모든 가능한 조합을 저장해야하는 대신 의사 결정 속도가 빨라집니다.

def tie(): 
    print("It's a tie!") 

def lose(): 
    print("You lose") 

def win(): 
    print("You win") 
moves = { 
    # player_ai action 
    'punch_punch': tie, 
    'punch_kick': lose, 
    'punch_stab': lose, 
    <..> 
} 
player_move = <move> 
ai_move = <move> 
key = "_".join([player_move, ai_move]) 
if key in moves: 
    # Execute appropriate function 
    return moves[key]() 
raise Exception("Invalid move") 
0

사전 (중첩 사전)을 시도해 볼 수 있습니다. 가독성을 높이려면 값에 매핑하는 대신 값과 키를 텍스트 형식으로 유지하십시오.

move = {'Punch': 0, 'Kick': 1} 

을 그리고 결과를 결정하는 매트릭스를 사용

outcome = {} 
outcome['punch'] = {} 
outcome['punch']['punch'] = 'Tie' 
outcome['punch']['kick'] = 'Lose' 
... 
outcome['kick'] = {} 
outcome['kick']['punch'] = 'Win' 
outcome['kick']['kick'] = 'Tie' 
... 
i_do = 'punch' 
he_does = 'fling' 
... 
if outcome[i_do][he_does] == 'Win': 
    print("Woohoo!") 
+0

가독성에 대한 의견 :이 접근 방식을 자세하게 사용하면 코드를 유지 관리하기가 매우 어려워집니다. 모든 공격을 기록하고 몇 가지를 더 추가하면 쉽게 읽을 수 없다는 것을 빨리 알 수 있습니다. – jurgemaister

+1

"자세한 정보"는 유지 관리에 도움이되며 실제로는 초기 데이터 채우기를 도우미 기능으로 수행 할 수 있습니다. 필자가 작성한 코드의 논리에 들어가면, if outcome [i_do] [he_does] == 'Win':'if'if [attacks.index ("i_do")] attacks.index ("he_does")] == 1 :'. –

0

당신은 번호 이동을 매핑 파이썬 사전을 사용할 수 있습니다. Numpy를 사용할 수 있습니다.

import numpy 
move = {'Punch': 0, 'Kick': 1} 

outcome = numpy.matrix([['Tie','Loses'],['Wins','Tie']]) 


# Punch vs Punch => Tie 
print outcome[move['Punch'], move['Punch']] 

# Punch vs Kick => Punch loses 
print outcome[move['Punch'], move['Kick']] 
1

이 경우 2 차원 목록을 사용합니다. 각 공격은 인덱스 0에서 5로 디코드되고 승부 동점과 패배는 1, 0 및 -1로 디코딩됩니다.

table = [[1,0,-1,0,1,-1],[1,1,0,1,0,-1],...,etc.] 

을 그리고 당신은 이런 식으로 검색됩니다 :

따라서이 같은 모양 목록 (귀하의 예제를 기반으로하지, 난 그냥 임의의 숫자를 넣어)

table[0][1] 
5

당신을 위 표와 비슷한 공격 맵을 만들 수 있습니다.

map = [ 
    [0,-1,-1,1,1,-1], 
    [1,0,-1,-1,1,-1], 
    [1,1,0,-1,-1,1], 
    [-1,1,1,0,-1,1], 
    [-1,-1,1,1,0,-1], 
    [1,1,-1,-1,1,0] 
] 

여기 0은 무승부, 1은 승리입니다. -1은 손실입니다.

이제 공격 위가 위의 맵과 일치하는 공격 배열을 생성하십시오.하나 개의 공격이 이기면

attacks = ["Punch", "Kick", "Stab", "Throw", "Fling", "Uppercut"] 

지금 당신은 쉽게 찾을 수있는 또 다른

map[attacks.index("Stab")][attacks.index("Punch")] 

>>> 1 

찔러 펀치 승

+0

참고 : 이것은 파이썬을 처음 작성한 사람입니다. 무언가가 꺼져있는 경우 내 게시물을 댓글을 달거나 편집하십시오. – jurgemaister

+1

또한 downvotes에 대한 의견을 많이 보내 주시면 감사하겠습니다. – jurgemaister

+0

imo 텍스트 키/값이 포함 된 중첩 사전은 매핑 된 값이있는 2 차원 배열보다 훨씬 더 읽기 쉽습니다. –

관련 문제