2012-08-23 3 views
-3

나는이 같은 질문을하기 위해 눈살을 찌푸린다고 알고 있지만 파이썬 스크립트에서 모든 버그를 해결할 수는없는 것 같습니다. 그것은 전쟁 게임 (카드 게임)을 시뮬레이션합니다. 완벽하게 작동해야한다고 생각합니다. 나보다 파이썬에 대해 더 많이 알고있는 누군가가 내 스크립트를보고 기본적으로 그것을 고치려고하면 정말 고맙겠습니다.내 카드 게임 시뮬레이션 스크립트의 버그

import random 

cards = ['ace', 'ace', 'ace', 'ace', '1', '1', '1', '1', '2', '2', '2', '2', '3', '3', '3', '3', '4', '4', '4', '4', '5', '5', '5', '5', '6', '6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '8', '9', '9', '9', '9', '10', '10', '10', '10', 'jack', 'jack', 'jack', 'jack', 'queen', 'queen', 'queen', 'queen', 'king', 'king', 'king', 'king'] 

order = ['ace', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'jack', 'queen', 'king'] 
warcardvalue0 = 0 
warcardvalue1 = 0 
print "shuffling cards" 
cards = random.shuffle(cards,random.random) 
print "lets play" 
player0 = [cards[i] for i in range(len(cards)) if i % 2 == 1] 

player1 = [cards[i] for i in range(len(cards)) if i % 2 == 0] 

while (len(player0) > 0 or len(player1) > 0): 

    nextcard0 = player0[0] 
    nextcard1 = player1[0] 

    cardplayed0 = order.index(nextcard0) 

    cardplayed1 = order.index(nextcard1) 

    if cardplayed0 > cardplayed1: 

     player0.append(nextcard0) 
     player0.append(nextcard1) 
     player0.remove(nextcard0) 
     player1.remove(nextcard1) 

    elif cardplayed0 < cardplayed1: 

     player1.append(nextcard1) 
     player1.append(nextcard0) 
     player1.remove(nextcard1) 
     player0.remove(nextcard0) 

    elif cardplayed0 == cardplayed1: 
     while warcardvalue0 == warcardvalue1: 
      if len(player0) >= 4: 
       warcard0 = 4 
      elif len(player0) < 4: 
       warcard0 = len(player0) 

      if len(player1) >= 4: 
       warcard1 = 4 
      elif len(player1) < 4: 
       warcard1 = len(player1) 


      warcardvalue0 = order.index(warcard0) 
      warcardvalue1 = order.index(warcard1) 

      if warcardvalue0 > warcardvalue1: 
       player0.append(player0[range(warcard0 + 1)]) 
       player0.append(player1[range(warcard1 + 1)]) 
       player0.remove(player0[range(warcard0 + 1)]) 
       player1.remove(player1[range(warcard1 + 1)]) 

      elif warcardvalue0 < warcardvalue1: 
       player1.append(player1[range(warcard1 + 1)]) 
       player1.append(player0[range(warcard0 + 1)]) 
       player1.remove(player1[range(warcard1 + 1)]) 
       player0.remove(player0[range(warcard0 + 1)]) 
      else: 
       print "another war!" 


if len(player1) == 0: 
    print "player1 won!" 
elif len(player0) == 0: 
    print "player0 won!" 
+2

특히 제대로 작동하지 않는 코드는 무엇입니까? –

+0

코드가 매번 다르게 실행되기 때문에 "셔플 링"카드에 많은 오류가 있습니다. 기본적으로 많은 버그들 중 많은 것들이 내가 –

+2

@ A.Collins에 대해 모른다 : 당신이 알고있는 것으로 시작하는 것은 어떨까요? 우리 뼈를 던져. 다시 테스트 할 수 있도록 셔플 코드를 주석으로 처리하십시오. – mhawke

답변

2

글쎄, 우선, 나는, 당신은

warcardvalue0 = order.index(warcard0) 
warcardvalue1 = order.index(warcard1) 

warcardvalue0 = order.index(player0[warcard0]) 
warcardvalue1 = order.index(player1[warcard1]) 

그래서 당신은 전쟁 카드의 실제 값을 받고있어 일하기 원하는거야 생각하고 숫자가 아님 :

대신 91,363,210
 elif len(player1) < 4: 
      warcard1 = len(player1)-1 

:

 elif len(player1) < 4: 
      warcard1 = len(player1) 

그래서 당신은 당신의 배열의 끝을 실행하지 않는 것입니다.

또한 전쟁 카드 값을 정적으로 설정하는 대신 증가시켜 여러 차례의 전쟁을 치를 수 있도록해야합니다. 가독성을 위해 재귀 함수를 고려할 수 있습니다. 또는이 :

 if len(player0) >= warcard0 + 4: 
      warcard0 = warcard0+3 
     elif len(player0) < warcard0 + 4: 
      warcard0 = len(player0)-1 

(인덱스 3 실제로 네 번째 요소를 반환하므로 배열, 제로 기반으로, 기억) 그리고 난 당신이 마지막에 조각을 찾고 생각 :

  player1.append(player1[0:warcard1+1]) 

또한 한 명의 플레이어가 전쟁 중에 카드를 다 써 버렸고 다른 전쟁이 계속되는 경우는 고려하지 않았습니다. (전쟁 카드는 동일하지만 한 플레이어는 더 이상 없다). 비록 당신이 이전의 문제를 해결한다면, 이것은 이상하게도 해결 될 것이라고 생각합니다. (더 많은 카드를 가진 플레이어는 동일한 액면가를 계속 사용합니다.)

그렇지만 그 밖의 모든 사람들이 맞습니다. 우리가 더 잘 도와 줄 수 있도록 파산 된 방법에 대한 자세한 정보를 제공해야합니다. 이 수정으로 모든 일을 처리 할 수 ​​있을지는 알고 있지만 올바른 방향으로 나아갈 수 있습니다.

아, 끝났을 때 전쟁 카드 값을 다시 0으로 설정하는 것도 잊지 마십시오. (사실 흥미로운 기능이 될 수 있습니다.)

+0

감사합니다. 정말 도움이 된 –