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()元胞自动机Python康威生命游戏
张小明
前端开发工程师
关于VM的使用
1. VM功能介绍(1)功能一:挂起操作(将操作暂时保存起来,方便下次接着使用)(2)功能二:快照操作(将操作保存起来,防止操作不当,可以回退到…
3分钟搞定!文泉驿微米黑字体全平台安装终极指南
3分钟搞定!文泉驿微米黑字体全平台安装终极指南 【免费下载链接】fonts-wqy-microhei Debian package for WenQuanYi Micro Hei (mirror of https://anonscm.debian.org/git/pkg-fonts/fonts-wqy-microhei.git) 项目地址: https://gitcode.com/gh_mirrors/fo/font…
Flutter 状态管理全家桶:Provider、Bloc、GetX 实战对比
Flutter 状态管理全家桶:Provider、Bloc、GetX 实战对比 在 Flutter 开发中,状态管理是贯穿项目全生命周期的核心议题。从简单的按钮点击状态切换,到复杂的跨页面数据共享与业务逻辑联动,选择合适的状态管理方案直接决定了项目的…
Flutter 网络请求完全指南:Dio 封装与拦截器实战
Flutter 网络请求完全指南:Dio 封装与拦截器实战 在 Flutter 开发中,网络请求是连接前端与后端服务的核心桥梁,直接影响应用的交互体验与数据流转效率。Dio 作为 Flutter 生态中最主流的网络请求库,支持 RESTful API、FormData、…
DPO微调
🍋🍋AI学习🍋🍋🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主…
内容管理系统(CMS)的7个关键特点
一套高效的内容管理系统(CMS)能帮你节省时间、开辟内容个性化的空间,并提升在线形象——从而改善业务成效。合适的CMS可以保持数字形象井然有序、品牌风格统一,并让内容流程顺畅运转,有助于在营销各个环节吸引并留住潜…