# 游戏规则:
# 生命游戏(Game of Life),或者叫它的全称John Conway's Game of Life。是英国数学家约翰·康威在1970年代所发明的一种元胞自动机。
# 1. 活细胞周围的细胞数如果小于2个或多于3个则会死亡;(离群或过度竞争导致死亡)
# 2. 活细胞周围如果有2或3个细胞可以继续存活;(正常生存)
# 3. 死细胞(空格)周围如果恰好有3个细胞则会诞生新的活细胞。(繁殖)
# 这三条规则简称B3/S23。如果调整规则对应的细胞数量,还能衍生出其他类型的自动机。
 
主要想法就是先建立一个Cells类,先解决一个细胞的生死问题,然后将此细胞放入网格
CellGrid中, 然后再建立一个Game类,用来将活着的细胞显示出来:
# 游戏规则:
# 生命游戏(Game of Life),或者叫它的全称John Conway's Game of Life。是英国数学家约翰·康威在1970年代所发明的一种元胞自动机。
# 1. 活细胞周围的细胞数如果小于2个或多于3个则会死亡;(离群或过度竞争导致死亡)
# 2. 活细胞周围如果有2或3个细胞可以继续存活;(正常生存)
# 3. 死细胞(空格)周围如果恰好有3个细胞则会诞生新的活细胞。(繁殖)
# 这三条规则简称B3/S23。如果调整规则对应的细胞数量,还能衍生出其他类型的自动机。
import random class Cell:
"""
细胞类,单个细胞
"""
def __init__(self, ix, iy, is_live):
self.ix = ix
self.iy = iy
self.is_live = is_live
self.neighbour_count = 0 def __str__(self):
return "[{},{},{:5}]".format(self.ix, self.iy, str(self.is_live)) def calc_neighbour_count(self):
count = 0
pre_x = self.ix - 1 if self.ix > 0 else 0
for i in range(pre_x, self.ix+1+1):
pre_y = self.iy - 1 if self.iy > 0 else 0
for j in range(pre_y, self.iy+1+1):
if i == self.ix and j == self.iy:
continue
if self.invalidate(i, j):
continue
# type()
count += int(CellGrid.cells[i][j].is_live)
self.neighbour_count = count
return count def invalidate(self, x, y):
if x >= CellGrid.cx or y >= CellGrid.cy:
return True
if x < 0 or y < 0:
return True
return False def next_iter(self):
if self.neighbour_count > 3 or self.neighbour_count < 2:
self.is_live = False
elif self.neighbour_count == 3:
self.is_live = True
elif self.neighbour_count == 2:
print(self.is_live) class CellGrid:
"""
细胞网格类,所有细胞都处在一个长cx,宽cy的网格中
"""
cells = []
cx = 0
cy = 0 def __init__(self, cx, cy):
CellGrid.cx = cx
CellGrid.cy = cy
for i in range(cx):
cell_list = []
for j in range(cy):
cell = Cell(i, j, random.random() > 0.5)
cell_list.append(cell)
CellGrid.cells.append(cell_list) def next_iter(self):
for cell_list in CellGrid.cells:
for item in cell_list:
item.next_iter() def calc_neighbour_count(self):
for cell_list in CellGrid.cells:
for item in cell_list:
item.calc_neighbour_count()
import pygame
import sys
from life import CellGrid, Cell GREY = (190, 190, 190)
RED = (255, 0, 0) class Game:
screen = None def __init__(self, width, height, cx, cy):
self.width = width
self.height = height
self.cx_rate = int(width / cx)
self.cy_rate = int(height / cy)
self.screen = pygame.display.set_mode([width, height])
self.cells = CellGrid(cx, cy) def show_life(self):
for cell_list in self.cells.cells:
for item in cell_list:
x = item.ix
y = item.iy
if item.is_live:
pygame.draw.rect(self.screen, RED,
[x * self.cx_rate, y * self.cy_rate, self.cx_rate, self.cy_rate]) pygame.init()
pygame.display.set_caption("绘图")
game = Game(800, 800, 40, 40) clock = pygame.time.Clock()
while True:
game.screen.fill(GREY)
clock.tick(1) # 每秒循环1次
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
game.cells.calc_neighbour_count() for i in game.cells.cells:
txt = ""
for j in i:
txt += str(j)
print(txt) game.show_life()
pygame.display.flip()
game.cells.next_iter()

生命游戏(python实现,pygame显示图形)的更多相关文章

  1. Python实现生命游戏

    1. 生命游戏是什么 生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个 ...

  2. Python和Pygame游戏开发 pdf

    Python和Pygame游戏开发 目录 第1章 安装Python和Pygame 11.1 预备知识 11.2 下载和安装Python 11.3 Windows下的安装说明 11.4 Mac OS X ...

  3. Python 速通爆肝、列表推导式、生成器、装饰器、生命游戏

    列表推导式.赋值.切片(替换.插入).字符串处理与判断.enumerate().格式化字符串.读写文件.global 关键字.字符串startswith().类与对象.生成器.装饰器.Self.*ar ...

  4. python实现简单动画——生命游戏

    生命游戏 生命游戏的宇宙是一个无限的,其中细胞的二维正交网格,每个细胞处于两种可能的状态之一,即*活着*或*死亡*(分别是*人口稠密*和*无人居住*).每个细胞与它的八个邻居相互作用,这八个邻居是水平 ...

  5. Python,OpenGL生命游戏

    初学Python和OpenGL,练手的第一个小程序life.py,这个小程序在日后会不断调整,增加类.优化判断及操作 执行效果: 按正规生命游戏的规则: 1.周围生命等于3时产生生命 2.周围生命等于 ...

  6. 用Python和Pygame写游戏-从入门到精通(py2exe篇)

    这次不是直接讲解下去,而是谈一下如何把我们写的游戏做成一个exe文件,这样一来,用户不需要安装python就可以玩了.扫清了游戏发布一大障碍啊! perl,python,java等编程语言,非常好用, ...

  7. 吴裕雄--天生自然python学习笔记:python用OpenCV 读取和显示图形

    Open CV 是一个开源.跨平台的计算机视觉库,它可 以在商业和研究领域中免费使用,目前已广泛应用于人机 互动.人脸识别.动作识别.运动跟踪等领域. 要识别特定的图像,最重要的是要有识别对象的特征 ...

  8. 生命游戏 Java

    本程序由四个类组成:其中Init_data,用于初始化各个活细胞的状态judge_state,用于判断下一代的细胞状态,并进行更新.set_color,用于给GUI界面中各个细胞涂色set_frame ...

  9. Conway生命游戏

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/9986679.html 作者:窗户 Q ...

随机推荐

  1. cobbler部署错误总结

    web 报错500 Internal Server Error解决方案 在安装使用Cobbler web界面的时候提示HTTP 500错误,也就是服务器内部错误,检查防火墙和selinux都是为关闭状 ...

  2. php一句话木马+中国菜刀拿服务器文件目录

    使用工具: 中国菜刀 一句话php木马 <?php @eval($_POST['123456']);?> 第一步,将php木马上传至服务器,为了方便我就直接在服务器上建立. [root@p ...

  3. Detectron2源码阅读笔记-(二)Registry&build_*方法

    ​ Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...

  4. 51Nod1686 第K大区间 和 NOI2016 区间

    谈一下尺取法的经典题. 第K大区间 定义一个区间的值为其众数出现的次数. 现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数:区间里出现次数最多的数字,例如:1 1 2 2 2,区间[1 ...

  5. Linux中的CentOS 7克隆之后修改

    1.VMware Workstation软件查看克隆完成后的虚拟机网卡mac地址,记录下来 2.输入[cd /etc/sysconfig/network-scripts/]命令后,再执行[ip add ...

  6. 数据库join解释 与视图

    数据库的视图是表运算的结果. 数据库的表是数据单元: join是运算符: 视图是运算结果. 数据库join解释 1.join:将两个表结构连接成一个视图 2.left.right.inner: 从基准 ...

  7. webpack打包vue单文件组件

    一.vue单文件组件 ①文件扩展名为 .vue 的 就是single-file components(单文件组件) ②参考文档:单文件组件 二.webpack加载第三方包 ①项目中,如果需要用到一些第 ...

  8. bzoj1176: [Balkan2007]Mokia cdq

    链接 bzoj 思路 cdq入门题,拆成4个矩阵,然后cdq. 代码 /************************************************************** P ...

  9. .NET 爬虫总结

    前言 技术本身并无罪,罪恶本质在于人心,好比厨师手中的菜刀用来创造美味佳肴,而杀手手上的刀却用来创造无限的罪恶. 环境 win7 IIS 6.0  SQLserver2012 .NET 4.0 win ...

  10. 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量

    P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...