Python实战之实现康威生命游戏
作者:源来很巧 发布时间:2022-06-30 14:21:12
前言
康威生命游戏设计并不难,我的思路就是借助pygame进行外观的展示,最近一段时间的游戏项目都是使用pygame进行的,做起来比较顺利。内部代码的实现也比较简单根据他的规则我们需要的是多次的计算和判断,再刷新数组。
一、康威生命游戏规则
当周围仅有1个或没有存活细胞时, 原来的存活细胞进入死亡状态。(模拟生命数量稀少)当周围有2个或3个存活细胞时, 网格保持原样。当周围有4个及以上存活细胞时,原来的存活细胞亦进入死亡状态。(模拟生命数量过多)当周围有3个存活细胞时,空白网格变成存活细胞。(模拟繁殖)
二、设计流程
1. 引入库
代码如下(示例):
import sys
import random
import numpy as np
import pygame
2. 设计思路
在这篇博客里面我们实现了下面第一个图的内容。
感兴趣的朋友也可以加下面的思路:
3. 设计窗口
首先我们借用了之前的pygame窗口的代码,实现窗口的调用。与之前有所不同的变化是,我们在展开窗口之前首先确定大小。
我们实现了游戏大小的自定义,窗口大小的自定义,可以与后面游戏设计增加统一性,增加美观性。
中间的部分代码是一些颜色的调出,和窗口的填充。
import sys
import random
import numpy as np
import pygame
pygame.init()#初始化init()及设置
n=int(input("请输入阶数:"))
size=width,height=50*n+2,50*n+2
screen=pygame.display.set_mode(size)#窗口大小
pygame.display.set_caption("康威生命游戏")#窗口名字
icon=pygame.image.load("Icon.jpg")
pygame.display.set_icon(icon)
BLACK=pygame.Color("black")
GAINSBORO=pygame.Color("gainsboro")
MOCCASIN=pygame.Color("moccasin")
WHITE=pygame.Color("white")
screen.fill(MOCCASIN)
fps=5
fclock=pygame.time.Clock()#创建一个Clock对象用于操作时间
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT: # 点击了退出
sys.exit() # 退出
pygame.display.update() # 对显示窗口进行更新,默认窗口全部重绘
fclock.tick(fps) # 窗口刷新速度,每秒3次
三、初始生命矩阵
我们通过循环产生随机数来产生随机的初始生命。
random.randint(a,b)
:产生一个位于a-b之间的随机整数,包括a,b。
## 生成初始生命
a=[]
for i in range(0,n):
a.append([])
for j in range(0,n):
a[i].append(random.randint(0,1))
四、周围生命的检测
我们将生命周围八个位置的索引差值存放在一个列表中,通过循环检测有效位置上生命的个数,存放入列表中。
包含两个判断。
1.首先要判断位置的有效性
2.另一个是判断是否有生命
direction = [[-1, -1], [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0]]
c = []
# 计算周围生命个数
for i in range(0, n):
c.append([])
for j in range(0, n):
count = 0 # 每一个方格
for o in direction:
ide = np.array([i, j]) + np.array(o)
# 保证判断的位置在范围内,针对边界方格
if 0 <= ide[0] < n and 0 <= ide[1] < n:
if a[ide[0]][ide[1]] == 1:
count += 1
c[i].append(count)
五、生命的变化
将每个位置上的生命根据计数列表进行更新,更新生命矩阵。
## 按照生命的发展规律进行新一轮的生面变化
for i in range(0, n):
for j in range(0, n):
if c[i][j] <= 1 or c[i][j] >= 4:#当生命稀少或者过多时生命死亡
a[i][j] = 0
elif c[i][j] == 3:#当生命的周围有三个生命时,生成新生命
a[i][j] = 1
六、生命的展示
画出生命的方格很简单,我们调用pygame的绘制图形代码:
pygame.draw.rect(screen, BLACK, (i*50, j*50, 50, 50)):这样展示出来的是一个填充的矩形,展示在:screen上,初始位置为:(i * 50, j * 50),大小为:(50, 50),颜色为:black,默认边框为0,即全部填充的矩形,当后面添加一个数字时,代表无填充,框线为数字大小的矩形,如:pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)代表不填充,框线为2
通过画图重叠,我们实现每个生命之间的间隔的样式,增强渲染效果。
for i in range(0, n):
for j in range(0, n):
if a[i][j]==1:
#先画一个满填充的方格,有生命方格
pygame.draw.rect(screen, BLACK, (i*50, j*50, 50, 50))
#再画一个不填充,框线为2的方格,套在上面的方格上面
pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)
else:#无生命方格
pygame.draw.rect(screen, WHITE, (i*50, j*50, 50, 50))
pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)
七、完整代码
"""
# -*- coding: utf-8 -*-
# @Time : 2021/4/23 0023 17:14
# @Author : 源来很巧
# @FileName: 康威生命游戏2.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/qq_44793283
"""
import sys
import random
import numpy as np
import pygame
pygame.init()#初始化init()及设置
n=int(input("请输入阶数:"))
size=width,height=50*n+2,50*n+2
screen=pygame.display.set_mode(size)#窗口大小
pygame.display.set_caption("康威生命游戏")#窗口名字
icon=pygame.image.load("Icon.jpg")
pygame.display.set_icon(icon)
BLACK=pygame.Color("black")
GAINSBORO=pygame.Color("gainsboro")
MOCCASIN=pygame.Color("moccasin")
WHITE=pygame.Color("white")
screen.fill(MOCCASIN)
fps=1
fclock=pygame.time.Clock()#创建一个Clock对象用于操作时间
## 生成初始生命
a=[]
for i in range(0,n):
a.append([])
for j in range(0,n):
a[i].append(random.randint(0,1))
## 八个方位的索引变化
direction = [[-1, -1], [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0]]
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT: # 点击了退出
sys.exit() # 退出
c = []
# 计算周围生命个数
for i in range(0, n):
c.append([])
for j in range(0, n):
count = 0 # 每一个方格
for o in direction:
ide = np.array([i, j]) + np.array(o)
# 保证判断的位置在范围内,针对边界方格
if 0 <= ide[0] < n and 0 <= ide[1] < n:
if a[ide[0]][ide[1]] == 1:
count += 1
c[i].append(count)
## 按照生命的发展规律进行新一轮的生面变化
for i in range(0, n):
for j in range(0, n):
if c[i][j] <= 1 or c[i][j] >= 4:#当生命稀少或者过多时生命死亡
a[i][j] = 0
elif c[i][j] == 3:#当生命的周围有三个生命时,生成新生命
a[i][j] = 1
for i in range(0, n):
for j in range(0, n):
if a[i][j]==1:
#先画一个满填充的方格,有生命方格
pygame.draw.rect(screen, BLACK, (i*50, j*50, 50, 50))
#再画一个不填充,框线为2的方格,套在上面的方格上面
pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)
else:#无生命方格
pygame.draw.rect(screen, WHITE, (i*50, j*50, 50, 50))
pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)
print(np.array(a))
pygame.display.update() # 对显示窗口进行更新,默认窗口全部重绘
fclock.tick(fps) # 窗口刷新速度,每秒3次
来源:https://blog.csdn.net/qq_44793283/article/details/114886537
猜你喜欢
- PHP程序员玩转Linux系列文章:1.PHP程序员玩转Linux系列-怎么安装使用CentOS2.PHP程序员玩转Linux系列-lnmp
- 本文实例讲述了Golang算法问题之整数拆分实现方法。分享给大家供大家参考,具体如下:一个整数总可以拆分为2的幂的和,例如:7=1+2+47
- 深度学习中对于网络的训练是参数更新的过程,需要注意一种情况就是输入数据未做归一化时,如果前向传播结果已经是[0,0,0,1,0,0,0,0]
- 在PHP界谈模板引擎,必不可免的要拿Smarty开刀, 这个无比傻帽的却又带有一点点官方色彩的模板引擎, 如果没有我这样人富有正义感又富有创
- 本文实例讲述了jQuery+php简单实现全选删除的方法。分享给大家供大家参考,具体如下:<input type="chec
- 一、TensorFlow变量管理1. TensorFLow还提供了tf.get_variable函数来创建或者获取变量,tf.variabl
- NumPy中asarray的用法函数说明asarray(a, dtype=None, order=None)转换输入为数组 array输入参
- 目录1、可迭代对象1.1什么是可迭代对象1.2怎么判断2、字符串的for循环3、列表的for循环4、元组的for循环5、字典的for循环5.
- 目录一、pyecharts绘制词云图WordCloud.add()方法简介二、绘制词云图对应轮廓按diamond显示三、对应完整代码如下所示
- 优点:·减少使用空间·使后面的背景层模糊或者渐隐出现让用户的焦点集中在当前层。什么时候使用(对话框等)模式窗口?·图片/视频灯箱效果·联系表
- 一、scapy简介与安装scapy(http://www.secdev.org/projects/scapy/)是一个强大的交互式数据包处理
- 不通过数据源名DSN也能访问Access数据库吗?代码如下:<% dim conn &nbs
- PHP程序都要用MYSQL,如果没有MYSQL,就不能用它们.第一:配置数据库信息,改成自己所需的;第二:导入数据库;第三:安装wamp5
- 叨逼叨首先,介绍一下 pdb 调试,pdb 是 python 的一个内置模块,用于命令行来调试 Python 代码。或许你会说,现在用 Py
- 当你需要一个简单易用的导航菜单得时候。CSS Menu是个不错的选择。相对于Flash/Javascript,他们小巧轻便,而且方便使用。当
- 前言小程序跳一跳最近很火,之前爆出微信游戏小程序漏洞,网上也不乏大神。这里就用一大神的python脚本来刷下高分。 跳一跳python脚本传
- 前言快520了,咱们来玩玩五子棋陶冶情操。快拿这个和你女朋友去对线。(分了别来找我哇)。多的不说直接进入正题人人对战游戏规则:p1为黑子,p
- 等了好久的小程序,终于在近日曝光了。现在就带大家来尝尝鲜。以下是一张随便看看的图。一、构建微信小程序的步骤下载开发工具考虑到微信0.9.09
- python queue队列类型及函数1.队列的种类Python queue模块的FIFO队列先进先出。 class queue.Queue
- 处理数据的时候,偶然遇到要把一个Dataframe中的某些行添加至一个空白的Dataframe中的问题。最先想到的方法是创建Datafram