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

基于Pygame實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲

 更新時(shí)間:2021年12月07日 15:27:16   作者:我的天才女友  
Pygame是一個(gè)專門用來(lái)開(kāi)發(fā)游戲的Python模塊,主要用于開(kāi)發(fā)、設(shè)計(jì)?2D?電子游戲。本文主要為大家介紹了通過(guò)Pygame制作一個(gè)簡(jiǎn)單的貪吃蛇游戲,感興趣的同學(xué)可以關(guān)注一下

導(dǎo)入相關(guān)的包

import pygame, sys, random
from pygame.locals import *

設(shè)置屏幕大小以及基本參數(shù)

設(shè)置屏幕大小為400*400,mainClock = pygame.time.Clock()用來(lái)設(shè)置時(shí)間同步,不會(huì)根據(jù)計(jì)算機(jī)的運(yùn)行來(lái)決定運(yùn)行多少次, mainClock.tick(1) 一秒只會(huì)運(yùn)行一次,設(shè)置了屏幕的底色為白色。

# 定義屏幕的寬高
WIDTH = 400
HEIGHT = 400
# 初始化屏幕 設(shè)置窗口標(biāo)題
surface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('貪吃蛇')

pygame.init()
mainClock = pygame.time.Clock()

# 定義使用的顏色
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)


while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    surface.fill(WHITE)
    pygame.display.update()
    mainClock.tick(1)

設(shè)置貪吃蛇的位置,以及移動(dòng)的大小

這里設(shè)置了貪吃蛇的長(zhǎng)度和起始位置,和食物和蛇的寬度,這里必須設(shè)置為可以被食物和蛇的寬度整除的數(shù),這樣才能保證蛇能到任意的位置

# 設(shè)置蛇的初始長(zhǎng)度
snakeWidth = 4
# 設(shè)置蛇的起始位置為(40,40)
snakeX = 40
snakeY = 40
# 食物和蛇的寬度設(shè)置為8
FOODSNAKEWIDTH = 8
# 定義四個(gè)方向
moveLeft = False
moveRight = False
moveUp = False
moveDown = False
# 定義初始的方向
moveRight = True


def getSnake():
    # 設(shè)置蛇的初始長(zhǎng)度為4,并設(shè)置蛇的初始位置為(40,40)
    # 因?yàn)樨澇陨邥?huì)拐彎,所以將蛇設(shè)置為一個(gè)列表
    snake = []
    for i in range(snakeWidth):
        snake.append(pygame.Rect(snakeX + i * FOODSNAKEWIDTH, snakeY, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
    return snake


# 貪吃蛇
snake = getSnake()

繪制蛇

surface.fill(WHITE)
for s in snake:
    pygame.draw.rect(surface, BLACK, s)

讓蛇動(dòng)起來(lái)

這里將蛇列表最后一位移除,然后將第一位的位置根據(jù)方向加減坐標(biāo)

    snake.pop()
    newTop = copy.deepcopy(snake[0])
    # 改變蛇的位置
    if moveRight:
        newTop.left += FOODSNAKEWIDTH
    if moveLeft:
        newTop.left -= FOODSNAKEWIDTH
    if moveUp:
        newTop.top -= FOODSNAKEWIDTH
    if moveDown:
        newTop.top += FOODSNAKEWIDTH

    snake.insert(0, newTop)

這樣會(huì)有一個(gè)問(wèn)題,如果超出屏幕呢,我們將超出屏幕,那么就會(huì)消失,我們只需要你移動(dòng)第一個(gè)元素的時(shí)候,如果超出則將元素移動(dòng)另一個(gè)位置。

    # 改變蛇的位置
    if moveRight:
        if newTop.right == WIDTH:
            newTop.left = 0
        else:
            newTop.left += FOODSNAKEWIDTH
    if moveLeft:
        if newTop.left == 0:
            newTop.right == WIDTH
        else:
            newTop.left -= FOODSNAKEWIDTH
    if moveUp:
        if newTop.top == 0:
            newTop.bottom = HEIGHT
        else:
            newTop.top -= FOODSNAKEWIDTH
    if moveDown:
        if newTop.bottom == HEIGHT:
            newTop.top = 0
        else:
            newTop.top += FOODSNAKEWIDTH

實(shí)現(xiàn)貪吃蛇拐彎

為了實(shí)現(xiàn)對(duì)應(yīng)的功能,我們將方向變量改為一個(gè)變量,這樣我們方便修改方向

# 定義四個(gè)方向
# moveLeft moveRight moveUp moveDown
# 定義初始的方向
snakeDirection = "moveRight"
  ----
  省略的代碼
  ----
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                if snakeDirection == "moveRight":
                    snake.reverse()
                snakeDirection = "moveLeft"
            if event.key == K_RIGHT:
                if snakeDirection == "moveLeft":
                    snake.reverse()
                snakeDirection = "moveRight"
            if event.key == K_UP:
                if snakeDirection == "moveDown":
                    snake.reverse()
                snakeDirection = "moveUp"
            if event.key == K_DOWN:
                if snakeDirection == "moveUp":
                    snake.reverse()
                snakeDirection = "moveDown"

為了方便看到效果,我將mainClock.tick(1) 設(shè)置為mainClock.tick(3)

實(shí)現(xiàn)隨機(jī)食物

這里用了很啰嗦的代碼,我自己也看不下去,有點(diǎn)含糊,這里為了簡(jiǎn)單只設(shè)計(jì)了一個(gè)食物,遍歷屏幕上不是貪吃蛇的可以放食物的集合,然后隨機(jī)生成一個(gè)食物。

    if len(foods) < foodnum:

        canFoodColl = []
        # 獲取當(dāng)前不是貪吃蛇的位置集合
        for x in range(sizeNum):
            for y in range(sizeNum):
                foodExist = True
                for sn in snake:
                    if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
                        foodExist = False
                        break
                if foodExist:
                    canFoodColl.append({'x': x, 'y': y})
        f = canFoodColl[random.randint(0, len(canFoodColl))]
        foods.append(pygame.Rect(f['x'], f['y'], FOODSNAKEWIDTH, FOODSNAKEWIDTH))

吃食物

這里用 colliderect判斷二者是否相撞,然后食物集合置空,不減去貪吃蛇集合的最后一個(gè)元素。

    if len(foods) < foodnum:

        canFoodColl = []
        # 獲取當(dāng)前不是貪吃蛇的位置集合
        for x in range(sizeNum):
            for y in range(sizeNum):
                foodExist = True
                for sn in snake:
                    if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
                        foodExist = False
                        break
                if foodExist:
                    canFoodColl.append({'x': x, 'y': y})
        f = canFoodColl[random.randint(0, len(canFoodColl))]
        foods.append(pygame.Rect(f['x'] * FOODSNAKEWIDTH, f['y'] * FOODSNAKEWIDTH, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
        print(f['x'])
        print(f['y'])
    else:
        if newTop.colliderect(foods[0]):
            foods = []
            eatFlg = True
        print('xxx')

完整代碼?

import pygame, sys, random
from pygame.locals import *
import copy

# 定義屏幕的寬高
WIDTH = 400
HEIGHT = 400
# 初始化屏幕 設(shè)置窗口標(biāo)題
surface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('貪吃蛇')

pygame.init()
mainClock = pygame.time.Clock()

# 定義使用的顏色
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)

# 設(shè)置蛇的初始長(zhǎng)度
snakeWidth = 4
# 設(shè)置蛇的起始位置為(40,40)
snakeX = 40
snakeY = 40
# 食物和蛇的寬度設(shè)置為8
FOODSNAKEWIDTH = 8
# 定義四個(gè)方向
# moveLeft moveRight moveUp moveDown
# 定義初始的方向
snakeDirection = "moveRight"

# 食物區(qū)間
foods = []
# 用去寬度處以對(duì)應(yīng)的 大小,減去1 就是食物矩形起點(diǎn)可以存在的區(qū)間
#sizeNum = HEIGHT / FOODSNAKEWIDTH - 1
# 這里為了減少計(jì)算
sizeNum = 39
# 為了簡(jiǎn)單我們只設(shè)置一個(gè)食物
foodnum = 1


def getSnake():
    # 設(shè)置蛇的初始長(zhǎng)度為4,并設(shè)置蛇的初始位置為(40,40)
    # 因?yàn)樨澇陨邥?huì)拐彎,所以將蛇設(shè)置為一個(gè)列表
    snake = []
    for i in range(snakeWidth):
        snake.append(pygame.Rect(snakeX + i * FOODSNAKEWIDTH, snakeY, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
    return snake


# 貪吃蛇
snake = getSnake()

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                if snakeDirection == "moveRight":
                    snake.reverse()
                snakeDirection = "moveLeft"
            if event.key == K_RIGHT:
                if snakeDirection == "moveLeft":
                    snake.reverse()
                snakeDirection = "moveRight"
            if event.key == K_UP:
                if snakeDirection == "moveDown":
                    snake.reverse()
                snakeDirection = "moveUp"
            if event.key == K_DOWN:
                if snakeDirection == "moveUp":
                    snake.reverse()
                snakeDirection = "moveDown"
    surface.fill(WHITE)
    for s in snake:
        pygame.draw.rect(surface, BLACK, s)
    for f in foods:
        pygame.draw.rect(surface, GREEN, f)
    pygame.display.update()


    # 是否吃了食物
    eatFlg = False

    newTop = copy.deepcopy(snake[0])
    # 改變蛇的位置
    if snakeDirection == "moveRight":
        if newTop.right == WIDTH:
            newTop.left = 0
        else:
            newTop.left += FOODSNAKEWIDTH
    if snakeDirection == "moveLeft":
        if newTop.left == 0:
            newTop.right = WIDTH
        else:
            newTop.left -= FOODSNAKEWIDTH
    if snakeDirection == "moveUp":
        if newTop.top == 0:
            newTop.bottom = HEIGHT
        else:
            newTop.top -= FOODSNAKEWIDTH
    if snakeDirection == "moveDown":
        if newTop.bottom == HEIGHT:
            newTop.top = 0
        else:
            newTop.top += FOODSNAKEWIDTH

    if len(foods) < foodnum:

        canFoodColl = []
        # 獲取當(dāng)前不是貪吃蛇的位置集合
        for x in range(sizeNum):
            for y in range(sizeNum):
                foodExist = True
                for sn in snake:
                    if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
                        foodExist = False
                        break
                if foodExist:
                    canFoodColl.append({'x': x, 'y': y})
        f = canFoodColl[random.randint(0, len(canFoodColl))]
        foods.append(pygame.Rect(f['x'] * FOODSNAKEWIDTH, f['y'] * FOODSNAKEWIDTH, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
        print(f['x'])
        print(f['y'])
    else:
        if newTop.colliderect(foods[0]):
            foods = []
            eatFlg = True
        print('xxx')



    snake.insert(0, newTop)
    if not eatFlg:
        snake.pop()

    mainClock.tick(3)

以上就是基于Pygame實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的詳細(xì)內(nèi)容,更多關(guān)于Pygame 貪吃蛇游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python httpx庫(kù)入門指南(最新推薦)

    Python httpx庫(kù)入門指南(最新推薦)

    Httpx 是一個(gè)用于發(fā)送 HTTP 請(qǐng)求的 Python 庫(kù),它提供了簡(jiǎn)單易用的 API,可以輕松地發(fā)送 GET、POST、PUT、DELETE 等請(qǐng)求,并接收響應(yīng),下面介紹下Python httpx庫(kù)入門指南,感興趣的朋友一起看看吧
    2023-12-12
  • python爬取m3u8連接的視頻

    python爬取m3u8連接的視頻

    這篇文章主要為大家詳細(xì)介紹了python如何爬取m3u8連接的視頻,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 解決python中使用PYQT時(shí)中文亂碼問(wèn)題

    解決python中使用PYQT時(shí)中文亂碼問(wèn)題

    今天小編就為大家分享一篇解決python中使用PYQT時(shí)中文亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Python imread、newaxis用法詳解

    Python imread、newaxis用法詳解

    這篇文章主要介紹了python imread、newaxis用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • pandas中std和numpy的np.std區(qū)別及說(shuō)明

    pandas中std和numpy的np.std區(qū)別及說(shuō)明

    這篇文章主要介紹了pandas中std和numpy的np.std區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python+Selenium實(shí)現(xiàn)無(wú)頭瀏覽器網(wǎng)頁(yè)截圖

    Python+Selenium實(shí)現(xiàn)無(wú)頭瀏覽器網(wǎng)頁(yè)截圖

    這篇文章主要為大家詳細(xì)介紹了Python+Selenium實(shí)現(xiàn)無(wú)頭瀏覽器網(wǎng)頁(yè)截圖的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • python不支持i++運(yùn)算原理實(shí)例解析

    python不支持i++運(yùn)算原理實(shí)例解析

    這篇文章主要為大家介紹了python不支持 i++運(yùn)算原理實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • python實(shí)現(xiàn)微信接口(itchat)詳細(xì)介紹

    python實(shí)現(xiàn)微信接口(itchat)詳細(xì)介紹

    這篇文章主要介紹了python實(shí)現(xiàn)微信接口(itchat)詳細(xì)介紹,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • 安裝pyecharts1.8.0版本后導(dǎo)入pyecharts模塊繪圖時(shí)報(bào)錯(cuò): “所有圖表類型將在 v1.9.0 版本開(kāi)始強(qiáng)制使用 ChartItem 進(jìn)行數(shù)據(jù)項(xiàng)配置 ”的解決方法

    安裝pyecharts1.8.0版本后導(dǎo)入pyecharts模塊繪圖時(shí)報(bào)錯(cuò): “所有圖表類型將在 v1.9.0 版本開(kāi)始

    這篇文章主要介紹了安裝pyecharts1.8.0版本后導(dǎo)入pyecharts模塊繪圖時(shí)報(bào)錯(cuò): “所有圖表類型將在 v1.9.0 版本開(kāi)始強(qiáng)制使用 ChartItem 進(jìn)行數(shù)據(jù)項(xiàng)配置 ”的解決方法,需要的朋友可以參考下
    2020-08-08
  • Python計(jì)數(shù)器collections.Counter用法詳解

    Python計(jì)數(shù)器collections.Counter用法詳解

    本文主要介紹了Python計(jì)數(shù)器collections.Counter用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論

普陀区| 秀山| 同江市| 浙江省| 北流市| 万安县| 甘孜| 鄂伦春自治旗| 辉南县| 米脂县| 青阳县| 文化| 河南省| 湛江市| 平昌县| 龙南县| 三明市| 满洲里市| 门源| 奈曼旗| 陇西县| 邢台县| 合川市| 永昌县| 寿宁县| 隆昌县| 克拉玛依市| 凤凰县| 邳州市| 腾冲县| 醴陵市| 龙游县| 阿勒泰市| 龙泉市| 兴义市| 香格里拉县| 万年县| 肃北| 玉树县| 商城县| 泸西县|