日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

如何用python写游戏_一步步教你怎么用python写贪吃蛇游戏

發(fā)布時(shí)間:2024/10/14 python 104 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何用python写游戏_一步步教你怎么用python写贪吃蛇游戏 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

0 引言

1 環(huán)境

2 需求分析

3 代碼實(shí)現(xiàn)

4 后記

0 引言

前幾天,星球有人提到貪吃蛇,一下子就勾起了我的興趣,畢竟在那個(gè)Nokia稱霸的年代,這款游戲可是經(jīng)典中的經(jīng)典啊!而用Python(蛇)玩Snake(貪吃蛇),那再合適不過(guò)了🤣🤣🤣

先通過(guò)下面這個(gè)效果圖來(lái)感受下吧!

1 環(huán)境

操作系統(tǒng):Windows

Python版本:3.7.3

2 需求分析

我們先來(lái)回顧下貪吃蛇中的游戲元素及游戲規(guī)則。

首先呢,需要有貪吃蛇、有食物;需要能控制貪吃蛇來(lái)上下移動(dòng)獲取食物;貪吃蛇在吃取食物后,自身長(zhǎng)度增加,同時(shí)食物消失并隨機(jī)生成新的食物;如果貪吃蛇觸碰到四周墻壁或是觸碰到自己身體時(shí),則游戲結(jié)束。

游戲規(guī)則就是這么簡(jiǎn)單,接下來(lái)我們借助一個(gè)第三方庫(kù)pygame來(lái)實(shí)現(xiàn)它。

Pygame是一個(gè)利用SDL庫(kù)的游戲庫(kù), 是一組用來(lái)開發(fā)游戲軟件的 Python 程序模塊。

SDL(Simple DirectMedia Layer)是一個(gè)跨平臺(tái)庫(kù),支持訪問(wèn)計(jì)算機(jī)多媒體硬件(聲音、視頻、輸入等),SDL非常強(qiáng)大,但美中不足的是它是基于 C 語(yǔ)言的。

PyGame是 SDL 庫(kù)的 Python 包裝器(wrapper),Pygame 在SDL庫(kù)的基礎(chǔ)上提供了各種接口,從而使用用戶能夠使用python語(yǔ)言創(chuàng)建各種各樣的游戲或多媒體程序。

它的安裝方法很簡(jiǎn)單,如下:

pip install pygame

想要了解更多pygame功能的朋友也可以查閱官方的文檔。

3 代碼實(shí)現(xiàn)

首先導(dǎo)入我們要用到的模塊,除了第三方庫(kù)pygame外,我們還會(huì)用到一些Python內(nèi)置的模塊如sys、random、time等,一并導(dǎo)入即可。

import pygame, sys, random, time

# 從pygame模塊導(dǎo)入常用的函數(shù)和常量

from pygame.locals import *

3.1 一些全局參數(shù)的初始化

接下來(lái),我們需要聲明一些全局參數(shù)。如初始化pygame、定義游戲窗口的大小、窗口的標(biāo)題、定義全局的顏色變量等信息。

# 初始化Pygame庫(kù)

pygame.init()

# 初始化一個(gè)游戲界面窗口

DISPLAY = pygame.display.set_mode((640, 480))

# 設(shè)置游戲窗口的標(biāo)題

pygame.display.set_caption('人人都是Pythonista - Snake')

# 定義一個(gè)變量來(lái)控制游戲速度

FPSCLOCK = pygame.time.Clock()

# 初始化游戲界面內(nèi)使用的字體

BASICFONT = pygame.font.SysFont("SIMYOU.TTF", 80)

# 定義顏色變量

BLACK = pygame.Color(0, 0, 0)

WHITE = pygame.Color(255, 255, 255)

RED = pygame.Color(255, 0, 0)

GREY = pygame.Color(150, 150, 150)

3.2 初始化貪吃蛇及食物

游戲中需要有貪吃蛇及食物,我們給定一個(gè)初始值。我們將整個(gè)界面看成許多20*20的小方塊,每個(gè)小方塊代表一個(gè)標(biāo)準(zhǔn)小格子,貪吃蛇的長(zhǎng)度就可以用幾個(gè)標(biāo)準(zhǔn)小格子表示。我們將貪吃蛇身體用列表的形式存儲(chǔ),方便之后的刪減。

'''初始化貪吃蛇及食物'''

# 貪吃蛇的的初始位置

snake_Head = [100,100]

# 初始化貪吃蛇的長(zhǎng)度 (注:這里以20*20為一個(gè)標(biāo)準(zhǔn)小格子)

snake_Body = [[80,100],[60,100],[40,100]]

# 指定蛇初始前進(jìn)的方向,向右

direction = "right"

# 給定第一枚食物的位置

food_Position = [300,300]

# 食物標(biāo)記:0代表食物已被吃掉;1代表未被吃掉。

food_flag = 1

3.3 實(shí)現(xiàn)貪吃蛇的上下左右移動(dòng)

我們需要控制貪吃蛇的上下左右的移動(dòng),這里通過(guò)監(jiān)聽鍵盤輸入來(lái)實(shí)現(xiàn)。利用鍵盤中的上下左右鍵或WASD鍵來(lái)控制貪吃蛇的運(yùn)動(dòng)。

# 檢測(cè)按鍵等Pygame事件

for event in pygame.event.get():

if event.type == QUIT:

# 接收到退出事件后,退出程序

pygame.quit()

sys.exit()

# 判斷鍵盤事件,用 方向鍵 或 wsad 來(lái)表示上下左右

elif event.type == KEYDOWN:

if (event.key == K_UP or event.key == K_w) and direction != DOWN:

direction = UP

if (event.key == K_DOWN or event.key == K_s) and direction != UP:

direction = DOWN

if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:

direction = LEFT

if (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:

direction = RIGHT

接下來(lái)就是將蛇前進(jìn)方向按照鍵盤的輸入進(jìn)行轉(zhuǎn)彎操作,并將蛇的頭部當(dāng)前的位置加入到蛇身的列表中。

# 根據(jù)鍵盤的輸入,改變蛇的頭部,進(jìn)行轉(zhuǎn)彎操作

if direction == LEFT:

snake_Head[0] -= 20

if direction == RIGHT:

snake_Head[0] += 20

if direction == UP:

snake_Head[1] -= 20

if direction == DOWN:

snake_Head[1] += 20

# 將蛇的頭部當(dāng)前的位置加入到蛇身的列表中

snake_Body.insert(0, list(snake_Head))

3.4 判斷是否吃到食物

如果蛇頭與食物的位置重合,則判定吃到食物,將食物數(shù)量清零;而沒吃到食物的話,蛇身就會(huì)跟著蛇頭運(yùn)動(dòng),蛇身的最后一節(jié)將被踢出列表。

# 判斷是否吃掉食物

if snake_Head[0]==food_Position[0] and snake_Head[1]==food_Position[1]:

food_flag = 0

else:

snake_Body.pop()

3.5 重新生成食物

當(dāng)游戲界面中的食物數(shù)量為0時(shí),需要重新生成食物。利用random函數(shù)來(lái)生成隨機(jī)位置

# 生成新的食物

if food_flag == 0:

# 隨機(jī)生成x, y

x = random.randrange(1,32)

y = random.randrange(1,24)

food_Position = [int(x*20),int(y*20)]

food_flag = 1

3.6 繪制貪吃蛇、食物、分?jǐn)?shù)等信息

定義貪吃蛇的繪制函數(shù)

# 繪制貪吃蛇

def drawSnake(snake_Body):

for i in snake_Body:

pygame.draw.rect(DISPLAY, WHITE, Rect(i[0], i[1], 20, 20))

定義食物的繪制函數(shù)

# 繪制食物的位置

def drawFood(food_Position):

pygame.draw.rect(DISPLAY, RED, Rect(food_Position[0], food_Position[1], 20, 20))

定義分?jǐn)?shù)的繪制函數(shù)

# 打印出當(dāng)前得分

def drawScore(score):

# 設(shè)置分?jǐn)?shù)的顯示顏色

score_Surf = BASICFONT.render('%s' %(score), True, GREY)

# 設(shè)置分?jǐn)?shù)的位置

score_Rect = score_Surf.get_rect()

score_Rect.midtop = (320, 240)

# 綁定以上設(shè)置到句柄

DISPLAY.blit(score_Surf, score_Rect)

這些都定義好之后,我們需要在游戲主邏輯中調(diào)用它們,并刷新Pygame的顯示層,貪吃蛇與食物的每一次移動(dòng),都會(huì)進(jìn)行刷新顯示層的操作來(lái)顯示。最后我們可以設(shè)定一個(gè)速度值來(lái)合理控制游戲執(zhí)行的速度。

DISPLAY.fill(BLACK)

# 畫出貪吃蛇

drawSnake(snake_Body)

# 畫出食物的位置

drawFood(food_Position)

# 打印出玩家的分?jǐn)?shù)

drawScore(len(snake_Body) - 3)

# 刷新Pygame的顯示層,貪吃蛇與食物的每一次移動(dòng),都會(huì)進(jìn)行刷新顯示層的操作來(lái)顯示。

pygame.display.flip()

# 控制游戲速度

FPSCLOCK.tick(7)

3.7 定義游戲結(jié)束的畫面并判斷游戲是否結(jié)束

定義函數(shù),用于展示游戲結(jié)束的畫面并退出程序

# 游戲結(jié)束并退出

def GameOver():

# 設(shè)置GameOver的顯示顏色

GameOver_Surf = BASICFONT.render('Game Over!', True, GREY)

# 設(shè)置GameOver的位置

GameOver_Rect = GameOver_Surf.get_rect()

GameOver_Rect.midtop = (320, 10)

# 綁定以上設(shè)置到句柄

DISPLAY.blit(GameOver_Surf, GameOver_Rect)

pygame.display.flip()

# 等待3秒

time.sleep(3)

# 退出游戲

pygame.quit()

# 退出程序

sys.exit()

在游戲主邏輯中加入判斷,游戲是否結(jié)束

'''游戲結(jié)束的判斷'''

# 貪吃蛇觸碰到邊界

if snake_Head[0]<0 or snake_Head[0]>620:

GameOver()

if snake_Head[1]<0 or snake_Head[1]>460:

GameOver()

# 貪吃蛇觸碰到自己

for i in snake_Body[1:]:

if snake_Head[0]==i[0] and snake_Head[1]==i[1]:

GameOver()

4 后記

本文利用Pygame模塊實(shí)現(xiàn)了最簡(jiǎn)單的貪吃蛇版本。當(dāng)然還有很多需要優(yōu)化的地方,比如隨機(jī)生成食物時(shí)如何避免出現(xiàn)在貪吃蛇的自身上、通過(guò)貪吃蛇的長(zhǎng)度來(lái)自動(dòng)控制游戲速度等等。更高級(jí)一點(diǎn)的有如何通過(guò)AI自動(dòng)玩貪吃蛇、貪吃蛇的雙人對(duì)戰(zhàn)等,期待大家利用Python可以把貪吃蛇玩出一個(gè)新的高度!😎😎😎

公眾號(hào)「Python專欄」后臺(tái)回復(fù)關(guān)鍵字「貪吃蛇」獲取本文全套完整代碼!

總結(jié)

以上是生活随笔為你收集整理的如何用python写游戏_一步步教你怎么用python写贪吃蛇游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。