news 2026/4/3 4:59:38

元胞自动机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/4/3 4:27:54

项目计划如何制定才靠谱?WBS、甘特图、里程碑一次讲清

很多团队觉得“项目计划不好做”&#xff0c;其实不是难&#xff0c;而是没抓住方法论的核心。 项目计划不是排日历&#xff0c;也不是写大纲&#xff0c;它是一种“把未来的工作结构化、可控化”的技术活。这篇文章我将把 WBS、甘特图、里程碑三件套 讲清楚&#xff0c;也讲讲…

作者头像 李华
网站建设 2026/3/27 20:00:32

Applite:终极Mac软件管理神器,让Homebrew图形化操作如此简单

Applite&#xff1a;终极Mac软件管理神器&#xff0c;让Homebrew图形化操作如此简单 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为复杂的终端命令而头疼吗&#xff1f…

作者头像 李华
网站建设 2026/4/1 20:10:54

mysql常见指标计算笔记

文章目录1、用户拉新情况相关指标PV&#xff08;页面浏览量/访问量&#xff09;UV&#xff08;独立访客数&#xff09;PVUV&#xff08;人均页面浏览量&#xff09;2、用户留存率指标2.1 留存率计算3、用户行为4、用户定位RFM模型1、用户拉新情况相关指标 可以分析每日浏览深度…

作者头像 李华
网站建设 2026/4/1 7:31:42

ncmdumpGUI:网易云音乐ncm格式转换的终极解决方案

ncmdumpGUI&#xff1a;网易云音乐ncm格式转换的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经遇到过下载的网易云音乐ncm文件在其他…

作者头像 李华
网站建设 2026/3/30 22:56:37

雷科电力-REKE直流高压发生器

一、产品概述&#xff1a;雷科电力-REKE直流高压发生器是根据新的中国电力行业标准DL/T848.1-2004《直流高压发生器通用技术条件》设计制造的新一代便携式直流高压试验器。主要适用于电力部门、工矿、冶金、钢铁等企业动力部门对氧化锌避雷器等高压电气设备进行直流耐压试验。雷…

作者头像 李华
网站建设 2026/3/24 1:44:04

Flutter 列表优化:ListView 性能调优与复杂列表实现

Flutter 列表优化&#xff1a;ListView 性能调优与复杂列表实现 列表是 Flutter 应用中最常用的组件之一&#xff0c;用于展示大量有序数据&#xff08;如商品列表、消息记录、新闻流等&#xff09;。但在处理海量数据或复杂列表项&#xff08;包含图片、动画、多组件嵌套&…

作者头像 李华