python编程练习 Game of Life实现与规则修改

本文分享了一段为2019华为软件精英挑战赛准备的生命游戏代码,详细介绍了如何使用元胞自动机实现生命游戏,并通过动画展示游戏进程。代码虽运行速度较慢,但在个人电脑上仍能有效运行,展示了不同规则下的生命游戏变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最初写这段代码是为了2019华为软件精英挑战赛准备,熟悉元胞自动机用。最终发现并没有留给我写判题器的时间。但这段代码还是保留下来了,存储gif的部分借鉴了别的博客,不过已经找不到原文了。这段代码写的不是很好,在我的电脑上运行很慢(还是自己优化水平太差),也算自己独立实现的,放在博客上自省。

生命游戏实现

生命游戏的规则可参考:生命游戏简介及算法分析(整理)
代码中可对burn、live、init、detector参数进行修改,采用不同规则进行生命游戏。

代码

# -*- coding: utf-8 -*-

import numpy as np
from numpy.linalg import cholesky
import matplotlib.pyplot as plt
from scipy import signal
from scipy import misc
from matplotlib import animation
import time
import copy


def update_cell(init, surrounding, burn, live):
	for i in range(0, init.shape[0]):
		for j in range(0, init.shape[1]):
			if(init[i][j] and (surrounding[i][j] < live or surrounding[i][j] > burn)):
				init[i][j] = not init[i][j]
			elif(not init[i][j] and surrounding[i][j] == burn):
				init[i][j] = not init[i][j]
	return init


def dominoes_six(height=50, width=50):
	init = np.zeros((height, width))
	x = int(height/2-1)
	y = int(width/2-2)
	init[x][y] = 1
	init[x][y+1] = 1
	init[x+1][y+1] = 1
	init[x+1][y+2] = 1
	init[x+2][y+2] = 1
	init[x+1][y+3] = 1
	return init


def dominoes_line(height=50, width=50):
	init = np.zeros((height, width))
	init[int(height/2), 20:-20] = 1
	init[20:-20, int(width/2)] = 1
	return init


def normal_detector():
	detector = np.array([[1, 1, 1],
						 [1, 0, 1],
						 [1, 1, 1]])
	return detector


def animate(init, detector, step, burn, live):	
	pic3 = np.empty(shape=[0, init.shape[0], init.shape[1]], dtype=int)
	pic4 = np.empty(shape=[0, init.shape[0], init.shape[1]], dtype=int)
	res = copy.copy(init)
	for i in range(0, step):
		surrounding = signal.convolve2d(res, detector, boundary='fill', mode='same')	
		res = update_cell(res, surrounding, burn, live)	
		pic3 = np.append(pic3, np.expand_dims(surrounding, axis=0), axis=0)			
		pic4 = np.append(pic4, np.expand_dims(res, axis=0), axis=0)
	return 	pic3, pic4


def game_of_life(init=dominoes_six(), burn=3, live=2, detector=normal_detector(), step=10):
	pic3, pic4 = animate(init, detector, step, burn, live)
	fig = plt.figure() 
	ax1 = fig.add_subplot(221)
	plt.imshow(init, cmap='gray')
	ax2 = fig.add_subplot(222)
	plt.imshow(detector, cmap='gray')	

	def update_pic(i):
		ax3 = fig.add_subplot(223)
		plt.imshow(pic3[i])
		ax4 = fig.add_subplot(224)
		plt.imshow(pic4[i], cmap='gray')
	ani = animation.FuncAnimation(fig, update_pic, frames=step, blit=False, interval=10, repeat=False)	
	ani.save('D:/data/gif/GameofLife_4.gif', writer='pillow', fps=15)
	plt.show()

	
if __name__ == '__main__':
	burn = 3
	live = 2
	init = dominoes_line(71, 71)
	detector = normal_detector()
	game_of_life(init, burn, live, detector, 200)
	print("done")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值