最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)戰(zhàn)之實(shí)現(xiàn)康威生命游戲

 更新時(shí)間:2021年04月26日 11:29:26   作者:源來(lái)很巧  
這篇文章主要介紹了Python實(shí)戰(zhàn)之實(shí)現(xiàn)康威生命游戲,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下

前言

康威生命游戲設(shè)計(jì)并不難,我的思路就是借助pygame進(jìn)行外觀的展示,最近一段時(shí)間的游戲項(xiàng)目都是使用pygame進(jìn)行的,做起來(lái)比較順利。內(nèi)部代碼的實(shí)現(xiàn)也比較簡(jiǎn)單根據(jù)他的規(guī)則我們需要的是多次的計(jì)算和判斷,再刷新數(shù)組。

一、康威生命游戲規(guī)則

當(dāng)周圍僅有1個(gè)或沒有存活細(xì)胞時(shí), 原來(lái)的存活細(xì)胞進(jìn)入死亡狀態(tài)。(模擬生命數(shù)量稀少)當(dāng)周圍有2個(gè)或3個(gè)存活細(xì)胞時(shí), 網(wǎng)格保持原樣。當(dāng)周圍有4個(gè)及以上存活細(xì)胞時(shí),原來(lái)的存活細(xì)胞亦進(jìn)入死亡狀態(tài)。(模擬生命數(shù)量過(guò)多)當(dāng)周圍有3個(gè)存活細(xì)胞時(shí),空白網(wǎng)格變成存活細(xì)胞。(模擬繁殖)

二、設(shè)計(jì)流程

1. 引入庫(kù)

代碼如下(示例):

import sys
import random
import numpy as np
import pygame

2. 設(shè)計(jì)思路

在這篇博客里面我們實(shí)現(xiàn)了下面第一個(gè)圖的內(nèi)容。

在這里插入圖片描述

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

在這里插入圖片描述

3. 設(shè)計(jì)窗口

首先我們借用了之前的pygame窗口的代碼,實(shí)現(xiàn)窗口的調(diào)用。與之前有所不同的變化是,我們?cè)谡归_窗口之前首先確定大小。
我們實(shí)現(xiàn)了游戲大小的自定義,窗口大小的自定義,可以與后面游戲設(shè)計(jì)增加統(tǒng)一性,增加美觀性。

中間的部分代碼是一些顏色的調(diào)出,和窗口的填充。

在這里插入圖片描述

import sys
import random
import numpy as np
import pygame
pygame.init()#初始化init()及設(shè)置
n=int(input("請(qǐng)輸入階數(shù):"))
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()#創(chuàng)建一個(gè)Clock對(duì)象用于操作時(shí)間

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 點(diǎn)擊了退出
            sys.exit()  # 退出

    pygame.display.update()  # 對(duì)顯示窗口進(jìn)行更新,默認(rèn)窗口全部重繪
    fclock.tick(fps)  # 窗口刷新速度,每秒3次

三、初始生命矩陣

我們通過(guò)循環(huán)產(chǎn)生隨機(jī)數(shù)來(lái)產(chǎn)生隨機(jī)的初始生命。

random.randint(a,b):產(chǎn)生一個(gè)位于a-b之間的隨機(jī)整數(shù),包括a,b。

## 生成初始生命
a=[]
for i in range(0,n):
    a.append([])
    for j in range(0,n):
        a[i].append(random.randint(0,1))

四、周圍生命的檢測(cè)

我們將生命周圍八個(gè)位置的索引差值存放在一個(gè)列表中,通過(guò)循環(huán)檢測(cè)有效位置上生命的個(gè)數(shù),存放入列表中。
包含兩個(gè)判斷。

1.首先要判斷位置的有效性

2.另一個(gè)是判斷是否有生命

direction = [[-1, -1], [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0]]
    c = []
    # 計(jì)算周圍生命個(gè)數(shù)
    for i in range(0, n):
        c.append([])
        for j in range(0, n):
            count = 0   # 每一個(gè)方格
            for o in direction:
                ide = np.array([i, j]) + np.array(o)
                # 保證判斷的位置在范圍內(nèi),針對(duì)邊界方格
                if 0 <= ide[0] < n and 0 <= ide[1] < n:
                    if a[ide[0]][ide[1]] == 1:
                        count += 1
            c[i].append(count)

五、生命的變化

將每個(gè)位置上的生命根據(jù)計(jì)數(shù)列表進(jìn)行更新,更新生命矩陣。

## 按照生命的發(fā)展規(guī)律進(jìn)行新一輪的生面變化
    for i in range(0, n):
        for j in range(0, n):
            if c[i][j] <= 1 or c[i][j] >= 4:#當(dāng)生命稀少或者過(guò)多時(shí)生命死亡
                a[i][j] = 0
            elif c[i][j] == 3:#當(dāng)生命的周圍有三個(gè)生命時(shí),生成新生命
                a[i][j] = 1

六、生命的展示

畫出生命的方格很簡(jiǎn)單,我們調(diào)用pygame的繪制圖形代碼:

pygame.draw.rect(screen, BLACK, (i*50, j*50, 50, 50)):這樣展示出來(lái)的是一個(gè)填充的矩形,展示在:screen上,初始位置為:(i * 50, j * 50),大小為:(50, 50),顏色為:black,默認(rèn)邊框?yàn)?,即全部填充的矩形,當(dāng)后面添加一個(gè)數(shù)字時(shí),代表無(wú)填充,框線為數(shù)字大小的矩形,如:pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)代表不填充,框線為2

通過(guò)畫圖重疊,我們實(shí)現(xiàn)每個(gè)生命之間的間隔的樣式,增強(qiáng)渲染效果。

for i in range(0, n):
        for j in range(0, n):
            if a[i][j]==1:
                #先畫一個(gè)滿填充的方格,有生命方格
                pygame.draw.rect(screen, BLACK, (i*50, j*50, 50, 50))
                #再畫一個(gè)不填充,框線為2的方格,套在上面的方格上面
                pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)

            else:#無(wú)生命方格
                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  : 源來(lái)很巧
# @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()及設(shè)置
n=int(input("請(qǐng)輸入階數(shù):"))
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()#創(chuàng)建一個(gè)Clock對(duì)象用于操作時(shí)間


## 生成初始生命
a=[]
for i in range(0,n):
    a.append([])
    for j in range(0,n):
        a[i].append(random.randint(0,1))

## 八個(gè)方位的索引變化
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:  # 點(diǎn)擊了退出
            sys.exit()  # 退出
    c = []
    # 計(jì)算周圍生命個(gè)數(shù)
    for i in range(0, n):
        c.append([])
        for j in range(0, n):
            count = 0   # 每一個(gè)方格
            for o in direction:
                ide = np.array([i, j]) + np.array(o)
                # 保證判斷的位置在范圍內(nèi),針對(duì)邊界方格
                if 0 <= ide[0] < n and 0 <= ide[1] < n:
                    if a[ide[0]][ide[1]] == 1:
                        count += 1
            c[i].append(count)
    ## 按照生命的發(fā)展規(guī)律進(jìn)行新一輪的生面變化
    for i in range(0, n):
        for j in range(0, n):
            if c[i][j] <= 1 or c[i][j] >= 4:#當(dāng)生命稀少或者過(guò)多時(shí)生命死亡
                a[i][j] = 0
            elif c[i][j] == 3:#當(dāng)生命的周圍有三個(gè)生命時(shí),生成新生命
                a[i][j] = 1
    for i in range(0, n):
        for j in range(0, n):
            if a[i][j]==1:
                #先畫一個(gè)滿填充的方格,有生命方格
                pygame.draw.rect(screen, BLACK, (i*50, j*50, 50, 50))
                #再畫一個(gè)不填充,框線為2的方格,套在上面的方格上面
                pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)

            else:#無(wú)生命方格
                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()  # 對(duì)顯示窗口進(jìn)行更新,默認(rèn)窗口全部重繪
    fclock.tick(fps)  # 窗口刷新速度,每秒3次

總結(jié)

這個(gè)游戲的實(shí)際設(shè)計(jì)并不是很困難,我們需要將具體的思路理順,哪一步首先進(jìn)行,需要我們準(zhǔn)備哪些存儲(chǔ)的矩陣等等。唯一的彎路是周圍生命個(gè)數(shù)的檢測(cè),我的方法是窮舉法,將每個(gè)位置索引只差手動(dòng)計(jì)算存儲(chǔ)起來(lái)。在小的計(jì)算量下,這層循環(huán)計(jì)算并不會(huì)浪費(fèi)很多時(shí)間,如果您對(duì)此有好的建議歡迎交流。也歡迎對(duì)后面的游戲結(jié)束進(jìn)行交流,后續(xù)我可以補(bǔ)上結(jié)束游戲的方法。

到此這篇關(guān)于Python實(shí)戰(zhàn)之實(shí)現(xiàn)康威生命游戲的文章就介紹到這了,更多相關(guān)Python實(shí)現(xiàn)康威生命游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • maven沖突問題解決

    maven沖突問題解決

    這篇文章主要介紹了maven沖突問題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python離線安裝第三方庫(kù)詳細(xì)操作流程

    Python離線安裝第三方庫(kù)詳細(xì)操作流程

    在使用Python開發(fā)過(guò)程中,我們經(jīng)常需要使用各種第三方庫(kù)來(lái)擴(kuò)展Python的功能,這篇文章主要給大家介紹了關(guān)于Python離線安裝第三方庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 一篇文章帶你了解python迭代器和生成器

    一篇文章帶你了解python迭代器和生成器

    這篇文章主要介紹了Python中的迭代器和生成器,涉及到Python中很多重要的特性,需要的朋友可以參考下,希望能夠給你帶來(lái)幫助
    2021-08-08
  • 最詳細(xì)的python工具Anaconda+Pycharm安裝教程

    最詳細(xì)的python工具Anaconda+Pycharm安裝教程

    這篇文章主要介紹了最詳細(xì)的python工具Anaconda+Pycharm安裝教程,文中有非常詳細(xì)的圖文示例,對(duì)不會(huì)安裝的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • python輸入錯(cuò)誤后刪除的方法

    python輸入錯(cuò)誤后刪除的方法

    在本篇文章里小編給讀者們整理了關(guān)于python輸入錯(cuò)誤后刪除的方法以及相關(guān)知識(shí)點(diǎn),有興趣的朋友們學(xué)習(xí)下。
    2019-10-10
  • python 實(shí)現(xiàn)網(wǎng)上商城,轉(zhuǎn)賬,存取款等功能的信用卡系統(tǒng)

    python 實(shí)現(xiàn)網(wǎng)上商城,轉(zhuǎn)賬,存取款等功能的信用卡系統(tǒng)

    本篇文章主要介紹 基于python 實(shí)現(xiàn)信用卡系統(tǒng),附有代碼實(shí)例,對(duì)于用python 開發(fā)網(wǎng)絡(luò)上傳系統(tǒng)具有參考價(jià)值,有需要的朋友可以看下
    2016-07-07
  • python實(shí)現(xiàn)讀取excel表格詳解方法

    python實(shí)現(xiàn)讀取excel表格詳解方法

    python操作excel主要用到xlrd和xlwt兩個(gè)庫(kù),xlrd讀取表格數(shù)據(jù),支持xlsx和xls格式的excel表格;xlwt寫入excel表格數(shù)據(jù)
    2022-07-07
  • 深度辨析Python的eval()與exec()的方法

    深度辨析Python的eval()與exec()的方法

    這篇文章主要介紹了深度辨析Python的eval()與exec()的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • python使用opencv讀取圖片的實(shí)例

    python使用opencv讀取圖片的實(shí)例

    下面小編就為大家?guī)?lái)一篇python使用opencv讀取圖片的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • python將ip地址轉(zhuǎn)換成整數(shù)的方法

    python將ip地址轉(zhuǎn)換成整數(shù)的方法

    這篇文章主要介紹了python將ip地址轉(zhuǎn)換成整數(shù)的方法,涉及Python針對(duì)IP地址的轉(zhuǎn)換技巧,需要的朋友可以參考下
    2015-03-03

最新評(píng)論

布拖县| 夏邑县| 衡水市| 张掖市| 澜沧| 聊城市| 卓资县| 绥滨县| 南陵县| 进贤县| 招远市| 聊城市| 南皮县| 定兴县| 布尔津县| 和龙市| 灵宝市| 丰城市| 金山区| 阿合奇县| 庄浪县| 郓城县| 定州市| 琼海市| 金山区| 惠州市| 溧水县| 仲巴县| 汝阳县| 馆陶县| 大余县| 论坛| 龙州县| 三原县| 连城县| 洛扎县| 武平县| 阳西县| 六安市| 洪洞县| 社会|