0

我在尝试让我的 while 循环继续循环直到满足两个条件时遇到问题。我只应该在必要时使用 while 循环或 if 语句/布尔值。

我正在尝试为网格大小 LENGTH X WIDTH 的游戏打印网格。所以假设

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

对于上面的表达式,如何让 while 循环为 x +=1 和 y +=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

我把我想用数字替换 x、x+1、...一直到 x = WIDTH - 1(或 x < WIDTH)的地方放在括号中。

我想我可以像这样连接这些片段,然后像上面那样只使用一个 while 循环,但是如果说网格尺寸很大,写出整个网格会占用太多空间。

4

4 回答 4

2

从概念上讲,while 循环与 for 循环完全相同,只是没有增量。因此,如果您需要使用 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
于 2013-06-12T12:46:08.740 回答
1

作为示例给出的两个示例代码的问题是您只使用一个循环。

一个可能有助于解决(编程)问题的“技巧”是试图描述你将如何“手工”完成这件事。在这里,要绘制网格,应该从第 1 行绘制单元格到第一列的 H 行,然后对第 2 列再次绘制,依此类推。

在伪代码中:

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循环。

于 2013-06-12T12:55:12.773 回答
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
于 2013-06-12T12:49:22.720 回答
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)
于 2013-06-12T12:55:08.200 回答