2017-03-03 7 views
0

Pythonでクラスインスタンスに変数を渡すときNameErrorはpythonでサンプル戦艦ゲームのプロジェクトに取り組んで

は、ここでは、ここで

class Ship: 

def __init__(self, ship_name, size, coordinates, direction): 
    self.ship_name = ship_name 
    self.size = size 
    self.coordinates = coordinates 
    self.direction = direction 

様々な船舶用船のクラスを作成し、私のコアbattleship.pyファイルがあります:私は次のエラーを取得しています

from ship import Ship 

SHIP_INFO = [ 
    ("Aircraft Carrier", 5), 
    ("Battleship", 4), 
    ("Submarine", 3), 
    ("Cruiser", 3), 
    ("Patrol Boat", 2) 
] 

BOARD_SIZE = 10 

VERTICAL_SHIP = '|' 
HORIZONTAL_SHIP = '-' 
EMPTY = 'O' 
MISS = '.' 
HIT = '*' 
SUNK = '#' 

board=[] 
for row in range(10): 
    board.append('O'*10) 


def clear_screen(): 
    print("\033c", end="") 


def print_board_heading(): 
    print(" " + " ".join([chr(c) for c in range(ord('A'), ord('A') + BOARD_SIZE)])) 


def print_board(board): 
    print_board_heading() 
    row_num = 1 
    for row in board: 
     print(str(row_num).rjust(2) + " " + (" ".join(row))) 
     row_num += 1 


def coord_prompt(): 
    while True: 
     coords = input("Where do you want the ship + (example: A1)?: ") 
     coords_strip = coords.strip() 
     coords_lower = coords_strip.lower() 
     x = coords_lower[0] 
     y = coords_lower[1:] 

     if (len(x)+len(y)) in range(2,4): 
      if x not in 'abcdefghij' or y not in '1,2,3,4,5,6,7,8,9,10': 
       print("Oops! That was not a valid entry. Try again...") 
       continue 

      else: 
       return x,y 
     else: 
      if len(coords_lower) < 2 or len(coords_lower) > 3: 
       print("Oops! That's too not the right amount of characters. Please try again...") 
       continue 


def pos_prompt(): 
    while True: 
     dir = input("[H]orizontal or [V]ertical?") 
     dir_strip = dir.strip() 
     dir_lower = dir_strip.lower() 

     if dir_lower not in 'hv': 
      print("Oops! That was not a valid entry. Try again...") 
      continue 

     else: 
      return dir_lower 


def make_ships(player): 
    ships = [] 
    for ship, size in SHIP_INFO: 
     coord_prompt() 
     pos_prompt() 
     ships.append(Ship(ship, size, (x, y), dir_lower)) 
    return ships 

player1 = input("What's Player 1's Name? ") 
player2 = input("What's Player 2's Name? ") 
print("\n") 
print_board(board) 
print("\n") 

# define player one's fleet 
make_ships(player1) 

Traceback (most recent call last): 
    File "C:/Users/chrisstuart/Desktop/battleship/battleship/battleship.py", line 91, in <module> 
    make_ships(player1) 
    File "C:/Users/chrisstuart/Desktop/battleship/battleship/battleship.py", line 81, in make_ships 
    ships.append(Ship(ship, size, (x, y), dir_lower)) 
NameError: name 'x' is not defined 

なぜ、coord_prompt関数から返されるxおよびy変数が、make_ships関数の実行時にShipのshipインスタンスに渡されないのか分かりません。私は、if文とwhileループのいくつかをフォーマットしていくつかのバリエーションを試したが、同じエラーが出るという問題を想定していました。

+0

そのあなたの 'coord_prompt()'ライン、あなたは戻り値を取得していない、代わりにこれを試してください: 'のX、Y = coord_prompt()' – RichSmith

答えて

2

呼び出し関数で戻り値を取得していないため、後続呼び出しで戻り値を使用していないためです。

xycoord_promptからローカルであり、その関数が終了したら、保存されません。値は返されますが、それでも何かに値を割り当てる必要があります。 pos_promptから返された値も同じです。

x, y = coord_prompt() 
    dir_lower = pos_prompt() 
    ships.append(Ship(ship, size, (x, y), dir_lower)) 
+0

ありがとうございました!非常に役立ちます。クイック質問 - 私は船の名前をcoord_prompt関数に入れたいと思っています - coords = input( "どこで船を望みますか?(例:A1)?")簡単な方法がありますか? –

+0

もちろん、名前をcoord_prompt関数のパラメータにする必要があります。 –

+0

ありがとうございます –

関連する問題