Небольшое изменение делает скрипт зависшим - не понимаю почему - PullRequest
0 голосов
/ 03 ноября 2018

Я создал игру для поиска слов. Она выведет сетку, содержащую несколько слов. Код выглядит так:

import random
DirectionList = []

# Create a grid filled with "." representing a blank
def createGrid():
    grid=[]
    for row in range(15):
        grid.append([])
        for column in range(50):
            grid[row].append(".")
    return grid

# Print the grid to the screen
def printGrid(grid):
    for row in range(len(grid)):
        for column in range(len(grid[row])):
            print(grid[row][column],end="")
        print()

# Try to place the word. Return True if successful
# False if it failed and we need to try again.
def tryToPlaceWord(grid,word):
    # Figure out the direction of the work.
    # Change the 8 to a 7 if you don't want backwards
    # words.
    status_check = []
    direction=random.randrange(0,8)
    DirectionList.append(direction)
    if( direction == 0 ):
        x_change=-1
        y_change=-1
    if( direction == 1 ):
        x_change=0
        y_change=1
    if( direction == 2 ):
        x_change=1
        y_change=-1
    if( direction == 3 ):
        x_change=1
        y_change=0
    if( direction == 4 ):
        x_change=1
        y_change=1
    if( direction == 5 ):
        x_change=0
        y_change=1
    if( direction == 6 ):
        x_change=-1
        y_change=1
    if( direction == 7 ):
        x_change=-1
        y_change=0

    # Find the length and height of the grid
    height=len(grid)
    width=len(grid[0])

    # Create a random start point
    column=random.randrange(width)
    row=random.randrange(height)

    # Check to make sure  the word won't run off the edge of the grid.
    # If it does, return False. We failed.
    if( x_change < 0 and column < len(word) ):
        status_check.append(False)
        status_check.append("None")
        return status_check
    if( x_change > 0 and column > width-len(word) ):
        status_check.append(False)
        status_check.append("None")
        return status_check
    if( y_change < 0 and row < len(word) ):
        status_check.append(False)
        status_check.append("None")
        return status_check
    if( y_change > 0 and row > height-len(word) ):
        status_check.append(False)
        status_check.append("None")
        return status_check

    # Now check to make sure there isn't another letter in our way
    current_column=column
    current_row=row
    for letter in word:
        # Make sure it is blank, or already the correct letter.
        if grid[current_row][current_column]==letter or grid[current_row][current_column]=='.':
            current_row += y_change
            current_column += x_change
        else:
            # Oh! A different letter is already here. Fail.
            status_check.append(False)
            status_check.append("None")
            return status_check

    # Everything is good so far, actually place the letters.
    current_column=column
    current_row=row
    for letter in word:
        grid[current_row][current_column]=letter
        current_row += y_change
        current_column += x_change
    if 7 in DirectionList:
        status_check.append(True)
        status_check.append("True")
        return status_check
    else:
        status_check.append(True)
        status_check.append("None")
        return status_check

# This just calls tryToPlaceWord until we succeed. It could
# repeat forever if there is no possible place to put the word.
def placeWord(grid,words):
    for word in words:
        succeed=False

        while not(succeed):
            status_check=tryToPlaceWord(grid,word)
            succeed=status_check[0]
    backward = status_check[1]
    return backward

# Create an empty grid
grid = createGrid()

# A list of words
words = ["pandabear","fish","snake","porcupine","dog","cat","tiger","bird","alligator","ant","camel","dolphin"]

# Place some words
placeWord(grid,words)

backward = placeWord(grid,words)
print("Current status:\n"
      "\tGenerating a word searching diagram...\n"
      "\tWords :",len(words),"\n"
      "\tBackword :",backward)

# Print it out
printGrid(grid)

Затем я хочу, чтобы код выводил случайные буквы вместо точек (.) Поэтому я внес небольшие изменения.

import random
import string
DirectionList = []

# Create a grid filled random letters representing a blank
def createGrid():
    grid=[]
    for row in range(15):
        grid.append([])
        for column in range(50):
            grid[row].append(random.choice(string.ascii_uppercase))
    return grid

Но питон перестает работать, он долго ничего не печатает. Я подумал, что python нужно много времени для генерации 15 х 50 случайных букв, поэтому я изменил код на grid[row].append("a"), но python все еще не работает.

Что пошло не так?

Edit:

Изменен код на

for letter in word:
        # Make sure it is blank, or already the correct letter.
        if grid[current_row][current_column]==letter or grid[current_row][current_column]==' ':
            current_row += y_change
            current_column += x_change

Но код все еще висит ...

1 Ответ

0 голосов
/ 03 ноября 2018

Вы используете '.' также проверить, свободна ли ячейка в вашей сетке (строка 87), поэтому, если вы заполните ячейки случайными буквами, они больше не будут свободными. Вместо этого вы можете заполнить пустые места случайными буквами после ввода слов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...