import pygame
import numpy as np
import sys
# 初始化pygame
pygame.init()
# 常量定义
WIDTH, HEIGHT = 800, 600
CELL_SIZE = 4
GRID_WIDTH = WIDTH // CELL_SIZE
GRID_HEIGHT = HEIGHT // CELL_SIZE
FPS = 60
# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GRAY = (50, 50, 50)
# 创建屏幕
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("元胞自动机示例")
clock = pygame.time.Clock()
# 初始化网格
grid = np.zeros((GRID_HEIGHT, GRID_WIDTH), dtype=int)
# 在顶部中间设置初始状态
grid[0, GRID_WIDTH // 2] = 1
# 规则函数
def apply_rule(left, center, right, rule_number):
"""应用一维元胞自动机规则"""
pattern = (left << 2) | (center << 1) | right
return (rule_number >> pattern) & 1
# 更新网格
def update_grid(rule_number):
global grid
for i in range(1, GRID_HEIGHT):
for j in range(GRID_WIDTH):
left = grid[i-1, (j-1) % GRID_WIDTH]
center = grid[i-1, j]
right = grid[i-1, (j+1) % GRID_WIDTH]
grid[i, j] = apply_rule(left, center, right, rule_number)
# 绘制网格
def draw_grid():
screen.fill(BLACK)
for i in range(GRID_HEIGHT):
for j in range(GRID_WIDTH):
if grid[i, j] == 1:
pygame.draw.rect(screen, WHITE, (j * CELL_SIZE, i * CELL_SIZE, CELL_SIZE, CELL_SIZE))
pygame.display.flip()
# 主循环
def main():
rule_number = 30 # 初始规则
running = True
paused = False
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
paused = not paused
elif event.key == pygame.K_r:
# 重置网格
grid.fill(0)
grid[0, GRID_WIDTH // 2] = 1
elif event.key == pygame.K_UP:
rule_number = (rule_number + 1) % 256
print(f"规则: {rule_number}")
grid.fill(0)
grid[0, GRID_WIDTH // 2] = 1
elif event.key == pygame.K_DOWN:
rule_number = (rule_number - 1) % 256
print(f"规则: {rule_number}")
grid.fill(0)
grid[0, GRID_WIDTH // 2] = 1
if not paused:
update_grid(rule_number)
draw_grid()
clock.tick(FPS)
pygame.quit()
sys.exit()
if __name__ == "__main__":
main()
3811

被折叠的 条评论
为什么被折叠?



