使用 2D 列表在板上打印形状,生命游戏,家庭作业

Using 2D Lists to Print a Shape on a Board, Game of Life, Homework

在接触二维列表之前,我对概念的掌握非常好,最近我的家庭作业失败了,我不得不使用二维列表简单地再现 "Conway's Game of Life"。我能够使用 for 循环打印电路板和 U 形,但我什至无法开始尝试对 2D 列表执行相同的操作。我只是迷路了,我觉得如果我能找到一个起点,我就可以解决剩下的问题。另一个问题是 "U" 形状是静态的,我用 "randint" 函数尝试了一些不同的东西,但无法让整个 "U" 形状四处移动。

编辑: 添加代码到底部,从 "tempGen" 开始。

我想出了如何使用 2D 列表打印 30 x 60 板,目前我正在尝试弄清楚如何将我的 "U" 形状合并到那里。

#! python3
import random
from random import randint
MAX_ROW = 30
MAX_COL = 60
currentGen = [ [MAX_ROW], [MAX_COL] ]
tempGen = [ [MAX_ROW], [MAX_COL] ]

def displayMenu(): #DISPLAY OUTPUT OPTIONS, DON'T COLLECT
    print("[P]lay - Press 'P' to play.\n[Q]uit - Press 'Q' to exit.\n")

def setZeroList(): #INITIALIZE 2-D LISTS TO ZERO
    currentGen = [[0], [0]]
    tempGen = [[0], [0]]
    return currentGen, tempGen

def copyList(): #COPY 2D LIST TO ANOTHER 2D LIST
    print("?????")

def displayList(): #PRINTS ANY 2D LIST
    print("?????")

def setInitialPatternList(): #CREATE THE "U" SHAPE
    for MAX_ROW in range(30):
        for MAX_COL in range(60):
            if ((MAX_COL == 0 or MAX_COL == 6) and MAX_ROW <= 5) or (MAX_ROW == 5 and (MAX_COL >= 0 and MAX_COL <= 6)):
                print("X", end="")
            else:
                print(end = ".")
        print()


tempGen = [["*"]* MAX_COL] * MAX_ROW

print("\ntable:")
for row in range(MAX_ROW):
    for col in range(MAX_COL):
        if (col == (MAX_COL - 1)):
            print(tempGen[row][col], end = "\n")
        else:
            print(tempGen[row][col], end = "")

让我们从真正的二维列表开始。二维列表只是列表的列表。使用普通列表,您可以执行

my_list[0] = 4

对于二维列表,每个元素都是一个列表-

list_of_lists[4] = ["a","b"]

这里是list_of_list[4][0]returns"a",因为我们真的是在做(list_of_list[4])[0]。您可以将 something[i][j] 表示法等同于 Coordinate Plane: 'something', Position: (i, j),其中 ij 是 x 和 y 值。

考虑到这一点,让我们考虑制作二维列表。由于二维列表中的每个 "row" 都包含一个列表,因此您需要先用空列表填充原始列表。像

list_of_lists = []
for i in range(depth):
    list_of_lists.append([])

这将允许您在 [0,depth) 范围内分配附加到二维列表的任何行。您不能像原来的 post 那样简单地使用 tempGen = [["*"]* MAX_COL] * MAX_ROW,因为二维列表的每一行都将引用同一个列表,因此更改一行会相同地影响所有行。如果您还想访问每个元素而不附加,请考虑用 [0] * width[None] * width 之类的内容填充原始列表,而不是空列表 [].

现在假设您构建了一个二维列表,用一些数据填充了它,现在您想要向右移动所有元素。你可以写一个函数来做这个

def right_shift(my_list):
    for row_num in range(len(my_list)):           # for each list in our list of lists
        row = my_list[row_num]
        for col_num in range(len(row)-2, -1, -1): # skip the last element, and iterate backwards
            row[col_num + 1] = row[col_num]       # assign the (col_num+1)th element to equal the col_num 'th element in that row.
    return my_list

只需编写处理一行的逻辑,然后将该逻辑扩展到列表列表的所有其他行(通常只使用一个 for 循环)。

为了更好的衡量,让我们覆盖打印二维数组-

def print_matrix(list_of_lists):
   for row in list_of_lists:
       print("".join(map(str, row))) # here map(str,...) is used to make sure every element is a string.

熟悉二维列表后,您可能需要考虑查看字典。您可以通过使用元组作为键来避免嵌套列表,例如 my_dict[(14, 27)] = "A",或者甚至使用 defaultdict 来避免用空的 list/dict 填充每个条目 - from collections import defaultdict; my_2D_dict = defaultdict(dict),然后可以直接使用my_2D_dict[4][2] = "something".