2016-03-30 2 views
0

Я пытаюсь использовать заливку заливом, но только на определенное расстояние (включая диагонали). Наводнение работает хорошо (вероятно, не идеально). Но после каждого движения, которое я делаю вверх/вниз/влево/вправо, предполагается перерисовать доску. Но вместо этого он перерисовывается поверх предыдущей доски, а также меняет глобальную доску, которая, как предполагается, никогда не изменится.Глобальный массив перезаписывается без переназначения

Я попробовал несколько различных способов назначения новой доски, прежде чем наводить наводнение, но ничего не изменило результат. Я предполагаю, что это как-то связано с

board = gameBoard[:] 

в игреFlow() функция. Но я не знаю, почему это было бы так. Я использовал [:] после прочтения этого другого stack exchange post, но, похоже, это не исправить проблему.

Пример вывод из заявлений печати я оставил в:

GameBoard 
######### 
#..  # 
#..  # 
#  # 
#   
#  # 
#  # 
#  # 
######### 
LightBoard 
######### 
#..  # 
#..  # 
#  # 
#   
#  # 
#  # 
#  # 
######### 

только свет Совет должен меняться во время игры Совет остается тем же самым.

Код:

import random 

#Sample Game Board 
gameBoard = [ 
      ["#","#","#","#","#","#","#", "#", "#"], 
      ["#"," "," "," "," "," "," ", " ", "#"], 
      ["#"," "," "," "," "," "," ", " ", "#"], 
      ["#"," "," "," "," "," "," ", " ", "#"], 
      ["#"," "," "," "," "," "," ", " ", " "], 
      ["#"," "," "," "," "," "," ", " ", "#"], 
      ["#"," "," "," "," "," "," ", " ", "#"], 
      ["#"," "," "," "," "," "," ", " ", "#"], 
      ["#","#","#","#","#","#","#", "#", "#"] 
      ] 

#Defining globals 
currentPlayerX = -1 
currentPlayerY = -1 
lightRadiusMax = -1 

#function flood 
#Params: 
# lightBoard: array, starts off empty 
# x: int, current x position to check, starts off as players starting x 
# y: int, current y position to check, starts off as players starting y 
# oldChard: char, character to replace 
# fillChar: char, character to replace with 
#Return: 
# returns the completed lightBoard 
def flood(lightBoard, x, y, oldChar, fillChar): 
    global currentPlayerX 
    global currentPlayerY 
    global lightRadiusMax 
    global gameBoard 
    width = len(gameBoard[0]) 
    height = len(gameBoard) 

    if gameBoard[y][x] == " ": 
      oldChar = lightBoard[y][x] 
    if gameBoard[y][x] == oldChar: 
     if (lightRadiusMax >= abs(currentPlayerX-x)) and (lightRadiusMax >= abs(currentPlayerY-y)): 
      lightBoard[y][x] = fillChar 
      if (lightRadiusMax == abs(currentPlayerX-x)) and (lightRadiusMax == abs(currentPlayerY-y)): 
       flood(lightBoard, x+1, y+1, oldChar, fillChar) 
      if x > 0: 
       flood(lightBoard, x-1, y, oldChar, fillChar) 
      if y > 0: 
       flood(lightBoard, x, y-1, oldChar, fillChar) 
      if x < width-1: 
       flood(lightBoard, x+1, y, oldChar, fillChar) 
      if y < height-1: 
       flood(lightBoard, x, y+1, oldChar, fillChar) 
    print("GameBoard") 
    for row in gameBoard: 
       for item in row: 
        print(item,end="") 
       print("") 
    print("LightBoard") 
    for row in lightBoard: 
       for item in row: 
        print(item,end="") 
       print("") 
    return lightBoard 


def gameFlow(): 
    global currentPlayerX 
    global currentPlayerY 
    global gameBoard 
    while(1): 
     board = gameBoard[:] 
     board = flood(board, currentPlayerX, currentPlayerY, None, ".") 
     board[currentPlayerY][currentPlayerX] = "@" 
     for row in board: 
       for item in row: 
        print(item,end="") 
       print("") 
     moveDirection = input("What would you like to do?\nMove (N,S,E,W) or (Q)uit: ") 
     moveDirection = moveDirection.lower() 
     if moveDirection == "n": 
      currentPlayerY -= 1 
     if moveDirection == "s": 
      currentPlayerY += 1 
     if moveDirection == "e": 
      currentPlayerX += 1 
     if moveDirection == "w": 
      currentPlayerX -= 1 
     if moveDirection == "q": 
      print("Thanks for playing!") 
      exit(0) 


def startGame(): 
    global currentPlayerX 
    global currentPlayerY 
    global lightRadiusMax 
    #randXStart = random.randint(1, len(gameBoard[0])-2) 
    #randYStart = random.randint(1, len(gameBoard)-2) 
    currentPlayerX = 1 
    currentPlayerY = 1 
    print(currentPlayerX) 
    print(currentPlayerY) 
    lightRadiusMax = int(input("Enter your light radius: ")) 
    gameFlow() 

startGame() 

Кредиты inventwithpython.com для обучения меня основам Заливка

ответ

0

Я думаю, что вы ищете для этого, это сделает копию всех элементов, а не только копия справки. Пробовал его на своем коде (заменяющего линию 70 с «доска = copy.deepcopy (GameBoard)», а теперь GameBoard делает пребывание пустой первой итерации.

import copy 
board = copy.deepcopy(gameBoard) 

И действительно упоминается в ответ, что вы ссылаетесь к.

+0

Спасибо за совет! Как только я вернусь домой, я попробую и отредактирую этот комментарий. – canpan14

+0

Работал отлично! Я не читал это другое сообщение должным образом и думал [:] сделал бы копию всех элементы также. – canpan14

Смежные вопросы