元胞自动机

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值