人生游戏,增添无尽领域
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
我有一个问题。我在 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