news 2026/4/16 13:37:28

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

云原生资源合集

【51CTO-27936】[2023]kubernetes k8sDevOps云原生全栈技术基于世界1000强实战课程 - 带源码课件 文件大小: 20.9GB内容特色: 20.9GB大厂K8sDevOps全栈实战&#xff0c;含源码课件适用人群: 云原生运维、DevOps工程师、后端开发者核心价值: 对标世界1000强项目&#xff0c;速成…

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

《解锁深度学习识别游戏自适应外挂的隐性逻辑》

游戏场景中新型外挂的隐蔽性早已突破传统认知,不再是直白的数据篡改或操作异常,而是偏向“隐流篡改”与“行为拟真伪装”的深度特征逃逸,很多时候这类外挂操控的账号,在表层操作节奏、任务推进效率上与正常核心玩家几乎无差,甚至能模仿玩家的操作失误、决策犹豫,单靠肉眼…

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

DAY26 针对Kaggle平台提交一个比赛代码

今天是第一次实战&#xff0c;这次的目的主要是再次熟悉机器学习的训练流程&#xff0c;并能够在Kaggle平台上成功实现第一份作品的提交。 一、登录Kaggle并创建相应的账号 这一步利用谷歌邮箱或者是QQ邮箱均可快速实现在此不做过多赘述。 二、登录后选择Kaggle的competitions的…

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

LobeChat职场沟通话术训练模拟器

LobeChat职场沟通话术训练模拟器 在企业培训的日常实践中&#xff0c;一个老生常谈的问题始终存在&#xff1a;如何让员工真正掌握高难度的沟通技巧&#xff1f;比如面对情绪激动的客户时如何稳住局面&#xff0c;向上级汇报失误时怎样既坦诚又不失专业&#xff0c;或是跨部门协…

作者头像 李华
网站建设 2026/4/16 1:49:33

当InfluxDB还在“散步”,金仓数据库已经“起飞”了!——一次不太公平的时序对决实录

金仓数据库&#xff08;KingbaseES&#xff09;是中国成立最早、拥有完全自主知识产权的国产大型通用数据库管理系统。其核心产品KingbaseES因其高可靠、高性能、高安全、易管理、易使用的特性而广受认可&#xff0c;是企业级关键业务应用的坚实数据底座。 金仓数据库由北京人大…

作者头像 李华
网站建设 2026/4/13 23:36:48

C# 排序,字典以及类相关知识点扩宽

一、冒泡排序冒泡排序:俩两相比&#xff0c;如果前面大于后面的值这时候交换位置。 外循环要经过多少轮 一轮找出一个最值 内循环比较多少次 例如5个数比较4次即可&#xff0c;下一轮的时候 不用和上传最值进行比较&#xff0c;所以写内循环次数可以 这样写list.Count-1-iList&…

作者头像 李华