人生游戏,增添无尽领域

Game of life, adding endless field

我有一个问题。我在 pygame“生命游戏”中玩游戏。我有一个目标。我不知道如何在我的游戏中添加无尽的领域。你能帮我吗?添加,抱歉 - 我的英语很糟糕(。我想在我的游戏中添加无尽的领域。堆栈溢出让我添加一些 txt。我不知道为什么

import pygame
import copy

class GameLife:
    def __init__(self, width, height, left=10, top=10, cell_size=30):
        self.width = width
        self.height = height
        self.board = [[0] * width for _ in range(height)]
        self.set_view(left, top, cell_size)
        self.pause = True
        self.speed = 10
        self.tick = 0
    def set_view(self, left, top, cell_size):
        self.left = left
        self.top = top
        self.cell_size = cell_size

    def get_cell(self, pos):
        if 0 < pos[0] - self.left < self.width * self.cell_size and 0 < pos[1] - self.top < self.height * self.cell_size:
            return (pos[0] - self.left) // self.cell_size, (pos[1] - self.top) // self.cell_size
        return None

    def on_click(self, cell):
        self.board[cell[1]][cell[0]] = (self.board[cell[1]][cell[0]] + 1) % 2

    def get_click(self, mouse_pos):
        cell = self.get_cell(mouse_pos)
        if cell and self.pause:
            self.on_click(cell)

    def render(self, scr):
        for x in range(self.width):
            for y in range(self.height):
                pygame.draw.rect(scr, 'white',
                                 (x * self.cell_size + self.left, y * self.cell_size + self.top,
                                  self.cell_size, self.cell_size), 1)
                if self.board[y][x]:
                    pygame.draw.rect(scr, pygame.Color('green'),
                                     (x * self.cell_size + self.left + 1, y * self.cell_size + self.top + 1,
                                    self.cell_size - 2, self.cell_size - 2))

    def change_status_pause(self):
        self.pause = not self.pause

    def next_move(self):
        if not self.pause and self.speed == self.tick:
            neighbors = [[0]*self.width for _ in range(self.height)]
            newboard = [[0] * self.width for _ in range(self.height)]
            for x in range(self.width):
                for y in range(self.height):
                    amount_neighbors = 0
                    for xx in range(x -1, x + 2):
                        for yy in range(y-1, y + 2):
                            if 0 < xx < self.width and 0 < yy < self.height and self.board[yy][xx]:
                                amount_neighbors += 1
                    neighbors[y][x] = amount_neighbors - self.board[y][x]
                    if neighbors[y][x] == 3 or neighbors[y][x] == 2 and self.board[y][x]:
                        newboard[y][x] = 1
            self.board = copy.deepcopy(newboard)

    def addtick(self):
        self.tick += 1
        if self.tick > self.speed:
            self.tick = 0


pygame.init()
size = width, height = 820, 420
screen = pygame.display.set_mode(size)
cell_size = 20
top, left = 20, 10
board = GameLife((width - left * 2) // cell_size, (height - 2 * top) // cell_size, left, top, cell_size)
clock  = pygame.time.Clock()
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            board.get_click(event.pos)
        if event.type == pygame.KEYDOWN and pygame.key.get_pressed()[pygame.K_SPACE]:
            board.change_status_pause()
    board.next_move()
    board.addtick()
    screen.fill((0, 0, 0))
    board.render(screen)
    pygame.display.flip()
    clock.tick(50)
pygame.quit()

如果我没理解错的话,只有一个条件需要改变。使用 %(取模)运算符计算整数除法的余数:

if 0 < xx < self.width and 0 < yy < self.height and self.board[yy][xx]:

if self.board[yy % self.height][xx % self.width]: 

解释行为:

  • 如果0 <= yy < self.height,则yy % self.height的结果是yy
  • 如果yy == -1,那么yy % self.height的结果就是self.height-1
  • 如果yy == self.height,那么yy % self.height的结果就是0