用Python做康威生命游戏的设计流程及代码是什么
Admin 2022-06-28 群英技术资讯 857 次浏览
在实际应用中,我们有时候会遇到“用Python做康威生命游戏的设计流程及代码是什么”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“用Python做康威生命游戏的设计流程及代码是什么”文章能帮助大家解决问题。当周围仅有1个或没有存活细胞时, 原来的存活细胞进入死亡状态。(模拟生命数量稀少)当周围有2个或3个存活细胞时, 网格保持原样。当周围有4个及以上存活细胞时,原来的存活细胞亦进入死亡状态。(模拟生命数量过多)当周围有3个存活细胞时,空白网格变成存活细胞。(模拟繁殖)
代码如下(示例):
import sys import random import numpy as np import pygame
在这篇博客里面我们实现了下面第一个图的内容。

感兴趣的朋友也可以加下面的思路:

首先我们借用了之前的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次
这个游戏的实际设计并不是很困难,我们需要将具体的思路理顺,哪一步首先进行,需要我们准备哪些存储的矩阵等等。唯一的弯路是周围生命个数的检测,我的方法是穷举法,将每个位置索引只差手动计算存储起来。在小的计算量下,这层循环计算并不会浪费很多时间,如果您对此有好的建议欢迎交流。也欢迎对后面的游戏结束进行交流,后续我可以补上结束游戏的方法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
内容介绍1.plt.pie()2.饼图基本3.饼状图进阶4.环形图5.内嵌环形图1.plt.pie()饼图常常用来显示整体中各部分所占的比例,在python-matplotlib库中通过p
本文主要介绍了Python 列表推导式与字典推导式的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
一、super()的入门使用-在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如:classAnimal(object):def__init__(self,name):self.name=namedefgre
接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱,本文主要介绍了Pytest+request+Allure实现接口自动化框架,感兴趣的可以了解一下
今天通过园区停车信息这样一个场景分析python3 依赖倒置原则,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008