news 2026/11/4 22:42:31

元胞自动机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/11/3 3:59:36

Linux系统RTL8852BE无线网卡驱动完整解决方案

Linux系统RTL8852BE无线网卡驱动完整解决方案 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 在Linux系统中使用Realtek RTL8852BE无线网卡时&#xff0c;你是否经常遇到设备无法识别、Wi…

作者头像 李华
网站建设 2026/11/3 5:52:57

pyside6.QtCore.Slot 的简单研究

在 PySide6 中&#xff0c;Slot() 是 信号与槽&#xff08;Signal & Slot&#xff09;机制 的核心装饰器&#xff0c;用于将普通 Python 方法声明为 槽函数&#xff08;Slot&#xff09;—— 槽函数是专门响应信号&#xff08;Signal&#xff09;触发的回调方法&#xff0c…

作者头像 李华
网站建设 2026/11/5 4:57:44

在DevSecOps中,如何将安全测试(SAST/DAST等) 无缝集成到CI/CD流水线?

一、核心理念:安全左移,持续防护 将安全测试从传统“发布前检测”转变为开发全流程的嵌入式检查,实现“安全即代码”。 二、集成架构设计 分层安全测试策略 text CI/CD流水线安全防护链: ├── 提交前(Pre-commit) │ ├── Git Hooks:代码规范/敏感信息扫描 │…

作者头像 李华
网站建设 2026/11/5 11:02:53

腾讯云云渠道商:如何利用镜像实现跨云平台迁移?

一、引言 随着多云战略的普及&#xff0c;跨云迁移已成为企业数字化转型的关键环节。数据显示&#xff0c;超过40%​ 的企业采用多云架构&#xff0c;每年平均迁移23个应用。传统迁移方式存在停机时间长&#xff08;平均8-12小时&#xff09;、数据丢失风险&#xff08;高达15%…

作者头像 李华
网站建设 2026/11/4 18:39:46

ThinkPad风扇控制终极指南:让你的笔记本告别噪音烦恼

ThinkPad风扇控制终极指南&#xff1a;让你的笔记本告别噪音烦恼 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 还在忍受ThinkPad风扇的嗡嗡声吗&#xff1f;无论是编…

作者头像 李华
网站建设 2026/11/4 23:07:21

量化模型部署:LobeChat运行7B级别模型的可行性

量化模型部署&#xff1a;LobeChat运行7B级别模型的可行性 在个人开发者和小型团队中&#xff0c;越来越多的人希望搭建属于自己的AI对话系统——不依赖OpenAI、无需支付高昂API费用&#xff0c;还能保障数据隐私。然而&#xff0c;现实挑战摆在眼前&#xff1a;像LLaMA-2-7B或…

作者头像 李华