python实现生命游戏的示例代码(Game of Life)
作者:其实我是一头猪 发布时间:2023-11-02 21:33:35
标签:python,生命游戏
生命游戏的算法就不多解释了,百度一下介绍随处可见。
因为网上大多数版本都是基于pygame,matlab等外部库实现的,二维数组大多是用numpy,使用起来学习成本比较高,所以闲暇之余写一个不用外部依赖库,console输出的版本。
# -*- coding: utf-8 -*-
from time import sleep
from copy import deepcopy
WORLD_HIGH = 20 #世界长度
WORLD_WIDE = 40 #世界宽度
ALIVE_CON = 3 #复活条件
KEEP_CON = 2 #保有条件
class Cell(object):
'''''细胞对象'''
def __init__(self, pos):
'''''自身坐标x,y, 已经是否还存活'''
self.point, self.is_alive = pos, False
self.x, self.y = self.point
def setAlive(self):
self.is_alive = True
def setDied(self):
self.is_alive = False
def display(self):
if self.is_alive:
return '*'
return ' '
def displayLinux(self):
'''''在linux环境下可以打印黑白块'''
if self.is_alive:
return '\033[0;37;47m \033[0m'
return '\033[0;30;40m \033[0m'
class GameManager(object):
def __init__(self):
self.world = self.initWorld()
self.initAliveCell()
def initWorld(self):
world = []
for pos_x in xrange(WORLD_WIDE):
column = []
for pos_y in xrange(WORLD_HIGH):
column.append(Cell((pos_x, pos_y)))
world.append(column)
return world
def initAliveCell(self):
from random import choice
for high in self.world:
for cell in high:
if choice((0, 1)) == 0:
continue
cell.setAlive()
def getNeighbours(self, cell_obj):
alive_count = 0
for x_of in xrange(-1, 2):
for y_of in xrange(-1, 2):
c_x, c_y = cell_obj.x + x_of, cell_obj.y + y_of
if ((c_x, c_y) == cell_obj.point) or \
(c_x < 0 or c_x >= WORLD_WIDE) or \
(c_y < 0 or c_y >= WORLD_HIGH):
'''''排除自身和越界的点'''
continue
if self.world[c_x][c_y].is_alive:
alive_count += 1
return alive_count
def display(self):
print '='*WORLD_WIDE #等号分割线
for index in xrange(WORLD_HIGH):
print ''.join([high[index].displayLinux() for high in self.world])
print '='*WORLD_WIDE
def gameStart(self):
while True:
self.display()
new_world = deepcopy(self.world)
for p_x, wide_list in enumerate(self.world):
for p_y, _ in enumerate(wide_list):
current_cell = new_world[p_x][p_y]
nei_num = self.getNeighbours(current_cell)
if nei_num == ALIVE_CON:
current_cell.setAlive()
elif nei_num != KEEP_CON:
current_cell.setDied()
self.world = new_world
sleep(0.2)
if __name__ == '__main__':
world = GameManager()
try:
world.gameStart()
except KeyboardInterrupt:
'''''防止ctrl+c退出报错'''
pass
来源:http://blog.csdn.net/valiensun/article/details/77533596
0
投稿
猜你喜欢
- 这个示例使用的Python版本为3.7版本,一、bing壁纸接口访问bing的官网,通过浏览器开发者工具,查看网络可以找到一个请求壁纸的接口
- 一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin() 函数,如下实例 echo decbin(12)
- 散点图,顾名思义是一些散乱的点构成的图。那么这些散乱的点有什么作用呢?散点图通过用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是
- 通过优化CSS代码,减小对系统资源的占用。自己整理出几个能减少系统资源占用的CSS写法,要优化网站的页面加载速度,这些注意点不能忽视!一、尽
- 自动换行问题,正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大,挺让人头疼,下面介绍的是CSS如何实现换行的方法对于div,
- 前言最近微信小游戏跳一跳大热,自己也是中毒颇久,无奈手残最高分只拿到200分。无意间看到教你用Python来玩微信跳一跳一文,在电脑上利用a
- 把下面SQL里的SELECT单独执行,没有问题,但是用来CREATE VIEW 就报错了.CREATE OR REPLA
- ipython notebook经常被我用作debug的工具。今天调试一段代码,里面用到了argparse这个包来解析命令行参数。但是在ip
- 本文介绍了几乎所有关于对象的基本概念,什么是对象,如何创建对象,对象的属性的设置和读取,删除属性的方法,构造函数,对象原型,父类,子类,继承
- 使用工具:pexpect库pexpect可以理解为Linux下expect(不知道的可以百度下linux expect)的python封装。
- 目前为止,我们使用函数时所用的参数都是位置参数,即传入函数的实际参数必须与形式参数的数量和位置对应。而本节将介绍的关键字参数,则可以避免牢记
- 目录查找算法 -- 简介顺序查找二分查找插值查找斐波那契查找树表查找1、二叉树查找算法。2、平衡查找树之2-3查找树(2-3 Tree)3、
- 我就废话不多说了,还是直接看代码吧!from time import ctimeimport threadingimport timedef
- 这里我们将分析一下如何开启和使用smarty缓存,如何清除smarty缓存以及smarty的全局缓存,部分缓存,局部缓存三种缓存机制。一、开
- f-string,亦称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化
- 1. 什么是 CSV 文件CSV(逗号分隔值)文件是使用逗号分隔信息的文本文件。该文件的每一行都是一条数据记录,也就意味着它可以用于以表格的
- 备注:Ken Henderson 从开发者的角度来阐述了SQL SERVER 2000内存管理的内部机制简介在本专栏中,我们将从一个开发者的
- 机器学习之随机森林,供大家参考,具体内容如下1、Bootstraping(自助法)  
- 1. 想学asyncio,得先了解协程携程的意义:计算型的操作,利用协程来回切换执行,没有任何意义,来回切换并保存状
- Windows环境: (1)离线安装 首先在线搜索并下载你需要的第三方库:网址https