news 2026/9/3 4:44:57

元胞自动机Python康威生命游戏

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
元胞自动机Python康威生命游戏
import pygame import sys from pygame.locals import * # 初始化Pygame pygame.init() # ===================== 配置参数 ===================== # 单元格大小(像素) CELL_SIZE = 20 # 网格行列数 GRID_COLS = 40 # 列数 GRID_ROWS = 30 # 行数 # 窗口尺寸 WINDOW_WIDTH = CELL_SIZE * GRID_COLS WINDOW_HEIGHT = CELL_SIZE * GRID_ROWS # 颜色定义 BLACK = (0, 0, 0) # 死细胞/背景色 WHITE = (255, 255, 255) # 活细胞颜色 GRAY = (40, 40, 40) # 网格线颜色 # 设置窗口 screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("康威元胞自动机 | Enter启停 | 空格切换速度(0.1/0.5/1秒) | R键重置 | 左键放置/删除") # 初始化细胞状态:False=死(黑),True=活(白) cells = [[False for _ in range(GRID_COLS)] for _ in range(GRID_ROWS)] # 运行状态和更新间隔(毫秒) is_running = False # 速度档位:0.1秒(100ms)、0.5秒(500ms)、1秒(1000ms) speed_levels = [100, 500, 1000] current_speed_idx = 1 # 默认选中0.5秒(索引1) UPDATE_INTERVAL = speed_levels[current_speed_idx] # 自定义事件:更新细胞状态 UPDATE_CELLS_EVENT = USEREVENT + 1 pygame.time.set_timer(UPDATE_CELLS_EVENT, UPDATE_INTERVAL) # ===================== 核心函数 ===================== def count_neighbors(row, col): """ 计算指定单元格的活邻居数量 边界处理:超出网格的区域视为死细胞 """ count = 0 # 遍历8个邻居方向 for dr in (-1, 0, 1): for dc in (-1, 0, 1): if dr == 0 and dc == 0: continue # 跳过自身 # 计算邻居坐标并检查边界 r = row + dr c = col + dc if 0 <= r < GRID_ROWS and 0 <= c < GRID_COLS: if cells[r][c]: count += 1 return count def reset_cells(): """重置细胞状态:清空所有活细胞,暂停运行""" global cells, is_running cells = [[False for _ in range(GRID_COLS)] for _ in range(GRID_ROWS)] is_running = False pygame.time.set_timer(UPDATE_CELLS_EVENT, 0) # 关闭定时器 # ===================== 主循环 ===================== def main(): global is_running, UPDATE_INTERVAL, current_speed_idx while True: # 填充背景为黑色 screen.fill(BLACK) # 事件处理 for event in pygame.event.get(): # 关闭窗口 if event.type == QUIT: pygame.quit() sys.exit() # 键盘事件 elif event.type == KEYDOWN: # Enter键:切换运行/暂停状态 if event.key == K_RETURN: is_running = not is_running # 暂停时关闭定时器,运行时开启 pygame.time.set_timer(UPDATE_CELLS_EVENT, UPDATE_INTERVAL if is_running else 0) # 空格键:循环切换速度(0.1秒 → 0.5秒 → 1秒 → 0.1秒...) elif event.key == K_SPACE: current_speed_idx = (current_speed_idx + 1) % len(speed_levels) UPDATE_INTERVAL = speed_levels[current_speed_idx] if is_running: pygame.time.set_timer(UPDATE_CELLS_EVENT, UPDATE_INTERVAL) # R键:重置所有细胞(清空+暂停) elif event.key == K_r or event.key == K_R: reset_cells() # 鼠标左键点击:切换细胞状态(放置/删除) elif event.type == MOUSEBUTTONDOWN: if event.button == 1: # 左键 x, y = event.pos # 转换鼠标坐标为网格坐标 col = x // CELL_SIZE row = y // CELL_SIZE # 确保坐标在网格范围内 if 0 <= row < GRID_ROWS and 0 <= col < GRID_COLS: cells[row][col] = not cells[row][col] # 定时更新细胞状态(仅运行时生效) elif event.type == UPDATE_CELLS_EVENT and is_running: # 先复制当前状态(避免边遍历边修改导致错误) new_cells = [[False for _ in range(GRID_COLS)] for _ in range(GRID_ROWS)] # 应用康威元胞自动机规则 for row in range(GRID_ROWS): for col in range(GRID_COLS): neighbor_count = count_neighbors(row, col) current_state = cells[row][col] # 规则1:活细胞邻居<2 → 死亡 # 规则2:活细胞邻居=2/3 → 存活 # 规则3:活细胞邻居>3 → 死亡 # 规则4:死细胞邻居=3 → 复活 if current_state: new_cells[row][col] = 2 <= neighbor_count <= 3 else: new_cells[row][col] = neighbor_count == 3 # 更新细胞状态 cells[:] = new_cells # 绘制网格线 # 绘制竖线 for col in range(1, GRID_COLS): pygame.draw.line(screen, GRAY, (col * CELL_SIZE, 0), (col * CELL_SIZE, WINDOW_HEIGHT), 1) # 绘制横线 for row in range(1, GRID_ROWS): pygame.draw.line(screen, GRAY, (0, row * CELL_SIZE), (WINDOW_WIDTH, row * CELL_SIZE), 1) # 绘制细胞(活细胞为白色方块,死细胞为黑色背景) for row in range(GRID_ROWS): for col in range(GRID_COLS): if cells[row][col]: cell_rect = pygame.Rect( col * CELL_SIZE, # x坐标 row * CELL_SIZE, # y坐标 CELL_SIZE, # 宽度 CELL_SIZE # 高度 ) pygame.draw.rect(screen, WHITE, cell_rect) # 更新显示 pygame.display.flip() if __name__ == "__main__": main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 0:53:05

婚礼誓词撰写:LobeChat见证幸福时刻

LobeChat&#xff1a;当开源AI遇见人生重要时刻 在某个安静的夜晚&#xff0c;一对即将步入婚姻殿堂的情侣坐在书桌前&#xff0c;反复修改着婚礼誓词。他们想把十年的感情浓缩成几句真挚的话语&#xff0c;却又担心写得不够动人、不够独特。这时&#xff0c;有人提议&#xff…

作者头像 李华
网站建设 2026/9/2 23:05:04

数组退化成指针的几种情况

一.什么是“数组退化成指针”&#xff1f;在许多情况下&#xff0c;数组名会退化为指针&#xff0c;即原本代表数组的变量&#xff0c;变成了指向数组第一个元素的指针。这意味着 数组名并不总是一个指向整个数组的指针&#xff0c;而是指向数组第一个元素的指针。二.举例1.作为…

作者头像 李华
网站建设 2026/9/2 5:25:19

java 判断string[]中是否有a

在 Java 中判断字符串数组是否包含特定字符串&#xff0c;有几种常见方法&#xff1a;方法1&#xff1a;使用 Arrays.asList() 和 contains()import java.util.Arrays;String[] array {"a", "b", "c"}; boolean containsA Arrays.asList(array…

作者头像 李华
网站建设 2026/9/3 0:56:28

如何实现 “右移”的智能监控,快速定位和恢复线上事故?

一、核心理念:从“被动响应”到“主动预警” 传统监控停留在“故障发生-告警-人工处理”,而智能“右移”强调生产环境的事前预防、事中定位、事后自愈。 二、智能监控体系分层设计 1. 数据采集层 多维度埋点: 应用层:日志(结构化/非结构化)、链路追踪(Trace)、关键业…

作者头像 李华
网站建设 2026/9/3 0:46:05

Flutter 自定义 Widget 开发:从基础绘制到复杂交互

Flutter 自定义 Widget 开发&#xff1a;从基础绘制到复杂交互 在 Flutter 开发中&#xff0c;系统提供的 Widget 虽能满足大部分基础需求&#xff0c;但在实现个性化 UI 或复杂交互逻辑时&#xff0c;自定义 Widget 成为核心技能。本文将从基础的绘制原理出发&#xff0c;逐步…

作者头像 李华
网站建设 2026/9/3 1:52:34

Flutter 路由进阶:命名路由、动态路由与路由守卫实现

Flutter 路由进阶&#xff1a;命名路由、动态路由与路由守卫实现 路由是 Flutter 应用中页面跳转与导航的核心机制&#xff0c;负责管理页面之间的跳转逻辑、参数传递与状态维护。基础路由&#xff08;如 Navigator.push、Navigator.pop&#xff09;虽能满足简单场景需求&…

作者头像 李华