2013-07-15 1 views
0

음 ... 코드를 작동 시키는데 끔찍한 시간이 걸렸지 만 일을 재정렬하고 갑자기 올바르게 작동하기 시작했습니다. 내가 솔직하게 무엇을했는지 확신 할 수 없으므로이 질문의 주제가 될 것입니다. 두 개의 .txt 파일에서 업로드 한 데크를 사용하는 간단한 텍스트 기반 카드 게임을 제작 중입니다. Magic : the Gathering을 목표로하지만 사람들이 창의력을 발휘하면 다른 사람들과 함께 작업 할 것입니다. 여기에, 대략적인 개요를 제공하는 것은 일을 배열하는 방법입니다 파이썬 할당 연산자, 함수 정의 및 변수 정의

import random 

def shuffle(board1): 

def game(): 
    #board=[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]] 
    #performs most of the actions relating to the game 
    board[0]=20 
    board[10]=20 


def gameboard(board2): 
    #displays game board 

def draw(board3, numcards, player): 
    #draws cards 

def upload(deckname): 
    #uploads cards from file 

def life(board4): 
    #asks about which player the life total is changing on, by how much, etc. 
    #and then does it 

def maketoken(board5): 
    #creates tokens, counters, etc. based on user input 

def move(board5): 
    #accepts user input and moves cards from zone to zone 

def play(board6): 
    #handles casting spells, using abilities, triggered abilities, etc. 

#main body of program is below function definitions 

board=[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]] 

deckname1=input("\nWhat is the name of deck 1?") 
deckname2=input("\nWhat is the name of deck 2?") 

deck1=upload(deckname1) 
deck2=uplaod(deckname2) 

board[1]=deck1 
board[11]=deck2 

#this is where a lot of the other variables get set 
game() 

(주의 : 대부분의 코드는 간결하고 귀여움 제거되었습니다, 내 코드는 아주 못생긴로)

을 나는 대학을 -level C++ 배경을 만들었고, 최근에 키보드를 고르려고 결정을 내 렸습니다. 할당 연산자 (=)가 예상대로 작동하지 않아서 나를 괴롭 히고 있습니다. 따라서, 파이썬에서 C++의 기능을 사용할 수있는 방법이 있는지 궁금 해서요 .txt 파일에서 데크를 업로드하고 완료되면 upload() 함수를 사용하고 싶습니다. (나는 deck1 = upload (deckname)을 사용한다. (deck2와 같다.) 각 게임 후에 데크를 보충하기 위해 'deck1'과 'deck2'를 사용하고 싶지만, '=' ] = deck1은 보드 [1]이 deck1의 저장 영역을 가리키고 보드 [1] 로의 변경은 deck1을 변경할 것임을 의미하지만, 나는 그것을 원하지 않습니다 ... GRRRR !!!!!! 11). 나에게 열매를 맺기 때문에 어딘가에 해결책이있을 것이라고 확신하지만 그것을 찾을 수 없었다. 감사!!!

편집 : 이것은 내가 일이 이런 식으로 설정할 때받은 오류였다

Traceback (most recent call last): 
    File "C:\Users\inventor487\Desktop\simplepy.py", line 444, in <module> 
    game() 
    File "C:\Users\inventor487\Desktop\simplepy.py", line 114, in game 
    board[1]=deck1 
UnboundLocalError: local variable 'board' referenced before assignment 

요약 :

  1. 가 나는 경우에도 게임() 함수에 보드를 통과해야합니까 그것은 전역 변수로 설정되어 있습니다 (또는 적어도 나는 그것이라고 생각 했었습니다)? 내가 게임() 함수 (이걸 보여주기 위해 주석 처리 한 것) 안에 배정하면 모든 것이 잘 작동하는 것처럼 보입니다. (편집 : 신경 쓰지 마 ... 나는 바보 야.)
  2. board (보드)의 일부를 game() 내의 값에 할당하면 로컬 변수가됩니다 (예 : board [0] = 20). (편집 : 예, 분명히 ...)
+3

글로벌 스코프 다른 사용하는 것입니다, 어떻게 파이썬 핸들 경계. 그러나 더 많은 정보가 없으면 여기서 우리가 당신을 도울 수있는 것이별로 없습니다. 오류가 무엇입니까? –

+2

예기치 않은 동작을 실제로 재생하는 코드를 표시하면 대답하기가 훨씬 쉽습니다. – sth

+0

C++ 배경 : 목록을 사용하여 참조/개체에 대한 포인터로 작업하고 있습니다. 그래서 여러분이'a = b = c = []'라고 말할 때 모든 변수는 같은 목록 객체를 참조합니다. 리스트를 전달할 때/변수를 할당/수정할 때 만들어지는 복사본은 없습니다. – sth

답변

0

파이썬에서 = 연산자는 C++에서와 같이 객체의 복사본을 만들지 않습니다. 복사본을 다른 변수에 저장하려면 해당 변수에 대해 명시해야합니다.

board[1] = deck1[:] # the slicing operator copies a subset or the whole list 

더 일반적인 방법은 copy module 당신은 (game``내부) * 범위 *, 로컬 범위에 의해 혼동하는 것

import copy 
board[1] = copy.copy(deck1) 
board[1] = copy.deepcopy(deck1) 
0

편집 :이 클래스는 매우 쉽고 훨씬 더 깨끗하게 해결됩니다. 각 영역에 대해 별도의 변수가 있으면 모든 것이 훨씬 원활 해집니다. 얘들 아, 도와 줘서 고마워. 매우 감사.