2016-07-06 8 views
0

だと思います。私は約1日前にcodeacademyを使ってPythonを学び始めました。私はすぐに進歩しました。戦艦部隊の最後に到達した後、私は自分ができることを見て自分に挑戦するように挑戦しました。だから、私はゲームを2人プレイにするために出発した。ただし、プログラムを終了すると、2番目のプレーヤーの船の列変数が定義されていないことがわかります。どうして?ここで変数は定義されていませんが、私はそれが

コードです:プレイヤー1は推測を作る直後

board1 = [] 
board2 = [] 
for i in range(5): 
    board1.append(["O"] * 5) 
    board2.append(["O"] * 5) 
# Creates 2 boards, one for each player to view 

def printboard(board): 
    for row in board: 
     print " ".join(row) 
# Prints one of the boards, depending on which player is meant to see it 

def boardset1(): 
    print "Player 1, set your coordinates!" 
    ship_col1 = int(raw_input("X:")) 
    ship_row1 = int(raw_input("Y:")) 
    if ship_col1 not in range(1,6) or ship_row1 not in range(1,6): 
     print "Invalid coordinates!" 
     boardset1() 
    else: 
     ship_col1 = abs(ship_col1 - 5) 
     ship_row1 = abs(ship_row1 - 5) 
     for i in range(10): 
      print "" 
     print "Coordinates set!" 

def boardset2(): 
    print "Player 2, set your coordinates!" 
    ship_col2 = int(raw_input("X:")) 
    ship_row2 = int(raw_input("Y:")) 
    if ship_col2 not in range(1,6) or ship_row2 not in range(1,6): #< Issue is here, I think 
     print "Invalid coordinates!" 
     boardset2() 
    else: 
     ship_col2 = abs(ship_col2 - 5) #< Might be here 
     ship_row2 = abs(ship_row2 - 5) 
     for i in range(10): 
      print "" 
     print "Coordinates set!" 
# 2 above functions set coordinates based on player input 

def play1(): 
    printboard(board1) 
    print "Player 1: Where is the opponent's ship?" 
    guess_col1 = int(raw_input("X:")) 
    guess_row1 = int(raw_input("X:")) 
    if guess_col1 not in range(1,6) or guess_row1 not in range(1,6): 
     print "Invalid coordinates!" 
     play1() 
    else: 
     guess_col1 = abs(guess_col1 - 5) 
     guess_row1 = abs(guess_row1 - 5) 
     if board1[guess_col1][guess_row1] == "X": 
      print "You already guessed here!" 
      play1() 
     elif guess_col1 == ship_col2 and guess_row1 == ship_row2: 
      win = True 
      print "You have won!" 
     else: 
      board1[guess_col1][guess_row1] = "X" 
     print "You have missed!" 

def play2(): 
    if win == False: 
     printboard(board2) 
     print "Player 2: Where is the opponent's ship?" 
     guess_col2 = int(raw_input("X:")) 
     guess_row2 = int(raw_input("X:")) 
     if guess_col2 not in range(1,6) or guess_row2 not in range(1,6): 
      print "Invalid coordinates!" 
      play2() 
     else: 
      guess_col2 = abs(guess_col2 - 5) 
      guess_row2 = abs(guess_row2 - 5) 
      if board2[guess_col2][guess_row2] == "X": 
       print "You already guessed here!" 
       play2() 
      elif guess_col2 == ship_col1 and guess_row2 == ship_row1: 
       win = True 
       print "You have won!" 
      else: 
       board2[guess_col2][guess_row2] = "X" 
      print "You have missed!" 
# Play functions are for gameplay 
win = False 
boardset1() 
boardset2() 

for i in range(25): 
    if win == False: 
     play1() 
     play2() 
    else: 
     break 

、このエラーが発生します。

Traceback (most recent call last): 
     File "python", line 97, in <module> 
     File "python", line 59, in play1 
    NameError: global name 'ship_col2' is not defined 

何かアドバイスや解決策は大歓迎です。私がまだ学んでいるように、より詳細な、より良い。

ありがとうございます!

+0

' ship_col2'が定義している:ここでは

は、あなたがよりよく理解するのに役立つかもしれないいくつかの更なる読書です。したがって、グローバルではなく、 'play1'関数の中では目に見えません。 – Evert

+1

'boardset1()'は最初に追加される 'global ship_col1、ship_col2'を必要とします。この関数内でのみ使用できるローカル変数を定義しています。それらをグローバルにすることは、他の関数がそれらを使用できることを意味します。 – zondo

+1

アドバイス:グローバル変数を避け、変数を関数の引数として関数に渡し、関数の終わり(例えばタプルの内側)を関数を呼び出したコードに戻します。 – Evert

答えて

0

あなたの問題は、変数ship_col2が関数内で定義されているということです。これは、その機能が実行され、それが削除されるまで存在することを意味します。その関数と他の関数の外部で利用できるようにするには、グローバル変数として宣言しなければなりません。ファイルの先頭にデフォルト値のboard1board2を定義して、これを定義できます。そのような複数の関数で使用するすべての変数を定義する必要があります。 *関数 `boardset2`内* http://python-textbok.readthedocs.io/en/1.0/Variables_and_Scope.html

関連する問題