2013-06-12 2 views
0

У меня возникли проблемы с попыткой получить мой цикл while, чтобы продолжить цикл до тех пор, пока не будут выполнены оба условия. Я должен использовать только циклы или if-statements/booleans, если это необходимо.Python: использование двух циклов для создания сетки. Нет для циклов

Я пытаюсь распечатать сетку для игры с размером сетки ДЛИНА X ШИРИНА. Итак, пусть

LENGTH = 5 
WIDTH = 6 

def create_grid(grid): 

    x = 0 
    y = 0 

    while x < WIDTH and y < LENGTH: 
      table = print(grid[WIDTH * x + y] + '|') 
      x +=1 
      y +=1 

    return table 

Как получить время цикла в цикле как для х + = 1 и у = + 1 для приведенного выше выражения? я хочу его так, что он будет печатать это выражение

while y < LENGTH: 
    print('|' + grid[(0) * WIDTH + y] + '|' + '|' + grid[(1) * WIDTH + y] + ... 
    + '|' + grid[(all the way up to WIDTH - 1) * WIDTH + y] + '|') 

    y += 1 

return ###expression above 

я ставлю в скобках, где я хотел бы заменить число для х, х + 1, ... всех путей вплоть до й = ШИРИНА - 1 (или x < ШИРИНА).

Я полагаю, что я мог бы просто конкатенировать такие фрагменты и использовать только один цикл, как показано выше, но сказать, что размеры сетки были огромными, и выписать всю сетку занимало бы слишком много места.

+2

Назначение возвращаемого значения 'print' переменной не имеет никакого смысла, поскольку гарантируется, что оно будет' None' (если вы не затенете встроенную функцию 'print' чем-то еще). Это означает, что утверждение типа 'return print" something "' тоже не имеет смысла, поскольку оно возвращает значение 'None', которое является значением по умолчанию. Поэтому вы должны решить, должна ли функция возвращать строку или просто печатать ее и возвращать 'None' ... – l4mpi

ответ

1

Вы обычно бы сделать это с помощью for цикла; Я бы просто использовать нарезку:

def create_grid(grid): 
    table = '' 

    for y in range(0, LENGTH * WIDTH, WIDTH): 
     table += '|'.join(grid[y:y+WIDTH]) + '\n' 

    return table 

С while петлей, где вы бы увеличивающей себя, вы будете использовать:

def create_grid(grid): 
    y = 0 
    size = LENGTH * WIDTH 
    table = '' 
    while y < size: 
     table += '|'.join(grid[y:y+WIDTH]) + '\n' 
     y += WIDTH 

    return table 

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

def create_grid(grid): 
    y = 0 
    size = LENGTH * WIDTH 
    table = '' 
    while y < size: 
     x = 0 
     while x < WIDTH: 
      if x: 
       table += '|' 
      table += grid[y + x] 
      x += 1 
     table += '\n' 
     y += WIDTH 

    return table 

Перечислять сетки по столбцам (так, транспонированной), вам нужно использовать:

def create_grid(grid): 
    y = 0 
    size = LENGTH * WIDTH 
    table = '' 
    while y < LENGTH: 
     x = 0 
     while x < size: 
      if x: 
       table += '|' 
      table += grid[y + x] 
      x += LENGTH 
     table += '\n' 
     y += 1 

    return table 
+0

Удивительный! Спасибо! Мы не рассматривали или не разрешали использовать методы, поэтому последний пример действительно помог. Тем не менее, мне нужна строка, которую я вводил, чтобы идти вниз по столбцу, а не по строке, следовательно, x * LENGTH внутри сетки индекса. Я попробовал table + = grid [y + (x * LENGTH)], но теперь я получаю индекс строки вне диапазона. > _ < – muros

+0

Итак, если ваша сетка была заполнена цифрами от 0 до 29, вы хотите напечатать '0 | 5 | 10 | 15 | 20 | 25', затем' 1 | 6 | 11 | 16 | 21 | 26' и т. Д. .? Поскольку 'WIDTH' и' LENGTH' и 'x' и' y' все еще могут быть интерпретированы неоднозначно, мне бы это понравилось, если бы вы добавили к вашему вопросу пример значения «grid» и образец вашего ожидаемого результата. –

+0

Да, если я набрал в create_grid ('123456789abcdefghijklmnopqrstu'). Выходной сигнал был бы | 1 | 6 | b | g | l | q | и следующую строку прямо под | 2 | 7 | c | h | m | r | .. и т. д. Здесь x = WIDTH = 6 и y = LENGTH (или высота) = 5. – muros

2

Концептуально цикл while является точно таким же, как цикл for, за исключением без приращения. Поэтому, если вам нужно реализовать цикл, используя while, вы просто делаете это так же, как и для циклов, но делаете прирост самостоятельно. Таким образом, это означает, что вы только гнездо два в то время как:

x = 0 
table = '' 

while x < WIDTH: 
    y = 0 
    while y < LENGTH: 
     table += grid[WIDTH * x + y] + '|' 
     y +=1 
    table += '\n' 
    x +=1 

return table 
+0

Я тоже это пробовал, но дело в том, что стол выглядит искаженным, когда я делаю это так. Спасибо за вашу помощь! – muros

+0

Я добавил символ новой строки: это помогает? –

+0

hmm .. он просто добавляет '\ n' как строку, а не новую строку. – muros

0

Вы должны использовать вложенную петли, но я все еще не уверен, что понимаю ваш код, поскольку он, кажется, перезаписывает значение table на каждом цикле. Это делает трюк?

LENGTH = 5 
WIDTH = 6 

def create_grid(grid): 

    x = 0 
    y = 0 

    table = "" 

    while y < LENGTH: 
     while x < WIDTH: 
     table += grid[WIDTH * x + y] + '|' 
     x +=1 
     print "\n" ### if you want a new-line when y is incremented 
     y +=1 

    return table 

print create_grid(grid) 
1

Проблема с двумя примерами кода, приведенными в качестве примера, заключается в том, что вы используете только один цикл.

Один «трюк», который может помочь решить проблему (программирование), пытается описать, как вы будете делать вещь «вручную». Здесь, чтобы построить сетку, нужно выделить ячейку из строки 1 в строку H первого столбца, затем повторить ее для столбца 2 и так далее.

Здесь в pseuso-код:

HEIGHT = 5 
WIDTH = 6 

current_row = 0 
current_column = 0 

# Draw the first column 
while current_row < HEIGHT: 
    draw_cell(current_column, current_row) 
    current_row += 1 

# Draw next column column 
current_column += 1 
while current_row < HEIGHT: 
    draw_cell(current_column, current_row) 
    current_row += 1 

# ... 
# ... and so on until last column 
current_column += 1 
while current_row < HEIGHT: 
    draw_cell(current_column, current_row) 
    current_row += 1 

Очевидно, что существует много повторения же кода.Это вызывает вложенные петли. Это ваш первый цикл внутри другого цикла:

HEIGHT = 5 
WIDTH = 6 

current_row = 0 
current_column = 0 

# For each column 
while current_column < WIDTH: 
    # Draw the column 
    while current_row < HEIGHT: 
     draw_cell(current_column, current_row) 
     current_row += 1 

    # The "inner" loop is done. 
    # Time to go to the next column 
    current_column += 1 

Здесь я использую while петлю, так как это, кажется, что вы предпочитаете. Но, как уже было сказано, «естественным» инструментом такого рода является цикл for.

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