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


猜你喜欢
- 介绍获取协程返回值的四种方式:1、通过ensure_future获取,本质是future对象中的result方2、使用loop自带的crea
- 前言daemon 音标 : [‘di:mən] , 中文含义为守护神或精灵的意思 . 其实它还有个意思 : 守护进程 .Daemon程序是一
- 前言Kettle下载与安装保姆级教程(最新)Kettle下载安装pdi-ce-7.1.0.0-12教程win10环境安装kettle与lin
- 前言上一篇文章Go 实现 WebSockets和什么是 WebSockets我们先介绍了什么是 WebSock
- 注意:第三种方法要在 XSell 中使用,在 finalsell 中使用不了方式一:临时使用自动补全功能mysql -u root -p -
- 首先抛出我们在讨论使用回调编程时的一些观点:激活errback是非常重要的。由于errback的功能与except块相同,因此用户需要确保它
- Python读取相对路径文件例如下图目录结构:第一种情况1)xxx.py想要打开a.txt,使用相对路径,有如下两种方式:思路:xxx.py
- 深度学习中,模型训练一般都需要很长的时间,由于很多原因,导致模型中断训练,下面介绍继续断点训练的方法。方法一:载入模型时,不必指定迭代次数,
- 误区 #30:有关备份的30个误区全是错的在开始有关备份的误区之前,如果你对备份的基础没有了解,请看之前我在TechNet Magazine
- 1、pyecharts绘制饼图(显示百分比)# 导入模块from pyecharts import options as optsfrom
- 首先确保已安装jupyter notebook,而且添加到了环境变量再找到保存ipynb文件的文件夹,在路径处直接输入cmd,然后回车进入命
- 在讲样式表开发管理之前,我想插播一个小知识。前几天看web标准设计组里,看到龍佑康同学问到关于 block 和 inline 的区别。记得以
- 原文:http://research.microsoft.com/~helenw/papers/subspace.pdfwindow.nam
- 这篇文章中的内容是来源于去年我用美国的VPS搭建博客的初始阶段,那是有很多恶意访问,我就根据access log中的源IP来进行了很多统计,
- 为了解决传统RNN无法长时依赖问题,RNN的两个变体LSTM和GRU被引入。LSTMLong Short Term Memory,称为长短期
- 本文实例讲述了php设计模式之正面模式。分享给大家供大家参考,具体如下:星际里面的战斗都是在地图上进行的,只要我们可以编辑地图,就可以创造一
- 流行的 JavaScript 库有jQuery,MooTools,Prototype,Dojo和YUI等,这些 JavaScript 库功能
- 前言对话框是很常用的组件 , 在很多地方都会用到,一般我们可以使用自带的alert来弹出对话框,但是假如是设计出的图该怎么办呢 ,所以我们需
- 多层索引的创建普通-多个index创建在创建数据的时候加入一个index列表,这个index列表里面是多个索引列表Series多层索引的创建
- join用来连接字符串,split恰好相反,拆分字符串的。不用多解释,看完代码,其意自现了。>>>li = ['m