目錄
- 前言
- 一、康威生命游戲規則
- 二、設計流程
- 三、初始生命矩陣
- 四、周圍生命的檢測
- 五、生命的變化
- 六、生命的展示
- 七、完整代碼
- 總結
前言
康威生命游戲設計并不難,我的思路就是借助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次
總結
這個游戲的實際設計并不是很困難,我們需要將具體的思路理順,哪一步首先進行,需要我們準備哪些存儲的矩陣等等。唯一的彎路是周圍生命個數的檢測,我的方法是窮舉法,將每個位置索引只差手動計算存儲起來。在小的計算量下,這層循環計算并不會浪費很多時間,如果您對此有好的建議歡迎交流。也歡迎對后面的游戲結束進行交流,后續我可以補上結束游戲的方法。
到此這篇關于Python實戰之實現康威生命游戲的文章就介紹到這了,更多相關Python實現康威生命游戲內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- python pygame 憤怒的小鳥游戲示例代碼
- 只需要100行Python代碼就可以實現的貪吃蛇小游戲
- python編寫五子棋游戲
- 學會用Python實現滑雪小游戲,再也不用去北海道啦
- 教你用Python實現一個輪盤抽獎小游戲
- python實戰之利用pygame實現貪吃蛇游戲(二)
- python實現21點小游戲
- 教你用Python寫一個植物大戰僵尸小游戲
- 憶童年!用Python實現憤怒的小鳥游戲