溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python編寫貪吃蛇小游戲

發(fā)布時間:2020-09-24 11:19:42 來源:億速云 閱讀:159 作者:Leah 欄目:編程語言

本篇文章為大家展示了Python編寫貪吃蛇小游戲,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

首先看一下編寫貪吃蛇小游戲的主要思路

Python編寫貪吃蛇小游戲

廢話不多說,我們直接來講解如何利用Python進行貪吃蛇的編寫吧

1.調(diào)用庫以及初始設(shè)置

1.1 調(diào)用第三方庫

Python與其他語言很不一樣的一點在于他有很多的第三方庫可以調(diào)用。在Python編寫游戲時,pygame是一個很簡單上手的第三方庫,可以通過pip直接安裝。安裝方法在之前的文章中已經(jīng)講過,就不再贅述。想要了解更多pygame功能的朋友也可以查閱官方的文檔。

這就是編寫貪吃蛇時我們需要調(diào)用的庫。

1import pygame
2import sys
3import time
4import random
5from pygame.locals import *

1.2 初始設(shè)置

我們通過這幾行代碼來初始化pygame,定義窗口(邊界)的大小,窗口的標(biāo)題和圖標(biāo)。

1    # 初始化pygame
 2    pygame.init()
 3    fpsClock = pygame.time.Clock()
 4
 5    # 創(chuàng)建pygame顯示層
 6    playSurface = pygame.display.set_mode((640, 480))
 7    # 定義標(biāo)題
 8    pygame.display.set_caption('Snake Go!')
 9    # 加載資源圖片,game.ico包含在最后的文件中
10    image = pygame.image.load('game.ico')
11    # 設(shè)置圖標(biāo)
12    pygame.display.set_icon(image)

1.3 定義顏色變量

由于我們需要用到一些顏色,而Python是不自帶的。所以我們需要定義幾個顏色。

1redColour = pygame.Color(255,0,0)
2blackColour = pygame.Color(0,0,0)
3whiteColour = pygame.Color(255,255,255)
4greyColour = pygame.Color(150,150,150)
5LightGrey = pygame.Color(220,220,220)

2.GameOver

之前提到,所有游戲最重要的部分是循環(huán)。而GameOver函數(shù)就是跳出這個循環(huán)的條件。這里給出當(dāng)蛇吃到自己身體或者碰到邊界時顯示的界面(判斷死亡的代碼會在之后展示)

1# 定義gameOver函數(shù)
 2def gameOver(playSurface, score):
 3    # 顯示GAME OVER并定義字體以及大小
 4    gameOverFont = pygame.font.Font('arial.ttf', 72)
 5    gameOverSurf = gameOverFont.render('Game Over', True, greyColour)
 6    gameOverRect = gameOverSurf.get_rect()
 7    gameOverRect.midtop = (320, 125)
 8    playSurface.blit(gameOverSurf, gameOverRect)
 9    # 顯示分?jǐn)?shù)并定義字體和大小
10    scoreFont = pygame.font.Font('arial.ttf', 48)
11    scoreSurf = scoreFont.render('SCORE: ' + str(score), True, greyColour)
12    scoreRect = scoreSurf.get_rect()
13    scoreRect.midtop = (320, 225)
14    playSurface.blit(scoreSurf, scoreRect)
15    pygame.display.flip()  # 刷新顯示界面
16    # 休眠5秒后自動關(guān)閉
17    time.sleep(5)
18    pygame.quit()
19    sys.exit()

3.貪吃蛇與樹莓

接下來介紹游戲的主題部分,即貪吃蛇與蛇莓的顯示以及運動。

3.1 定義初始位置

我們將整個界面看成許多20*20的小方塊,每個方塊代表一個單位,蛇的長度就可以用幾個單位表示啦。這里蛇的身體用列表的形式存儲,方便之后的刪減。

1    # 初始化變量
2    snakePosition = [100, 100]  # 蛇頭位置
3    snakeSegments = [[100, 100], [80, 100], [60, 100]]  # 初始長度為3個單位
4    raspberryPosition = [300, 300]  # 樹莓位置
5    raspberrySpawned = 1  # 樹莓個數(shù)
6    direction = 'right'  # 初始方向
7    changeDirection = direction
8    score = 0  # 初始分?jǐn)?shù)

3.2 鍵盤輸入判斷蛇的運動

我們需要通過鍵盤輸入的上下左右鍵或WASD來控制蛇類運動,同時加入按下Esc就退出游戲的功能。

1 # 檢測例如按鍵等pygame事件
 2        for event in pygame.event.get():
 3            if event.type == QUIT:
 4                pygame.quit()
 5                sys.exit()
 6            elif event.type == KEYDOWN:
 7                # 判斷鍵盤事件
 8                if event.key == K_RIGHT or event.key == ord('d'):
 9                    changeDirection = 'right'
10                if event.key == K_LEFT or event.key == ord('a'):
11                    changeDirection = 'left'
12                if event.key == K_UP or event.key == ord('w'):
13                    changeDirection = 'up'
14                if event.key == K_DOWN or event.key == ord('s'):
15                    changeDirection = 'down'
16                if event.key == K_ESCAPE:  # 按esc退出游戲
17                    pygame.event.post(pygame.event.Event(QUIT))

貪吃蛇運動有一個特點:不能反方向運動。所以我們需要加入限制條件。

1        # 判斷是否輸入了反方向
2        if changeDirection == 'right' and not direction == 'left':
3            direction = changeDirection
4        if changeDirection == 'left' and not direction == 'right':
5            direction = changeDirection
6        if changeDirection == 'up' and not direction == 'down':
7            direction = changeDirection
8        if changeDirection == 'down' and not direction == 'up':
9            direction = changeDirection

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

 1        # 根據(jù)方向移動蛇頭的坐標(biāo)
 2        if direction == 'right':
 3            snakePosition[0] += 20
 4        if direction == 'left':
 5            snakePosition[0] -= 20
 6        if direction == 'up':
 7            snakePosition[1] -= 20
 8        if direction == 'down':
 9            snakePosition[1] += 20
10
11        # 將蛇頭的位置加入列表之中
12        snakeSegments.insert(0, list(snakePosition))

3.3 判斷是否吃到樹莓

如果蛇頭與樹莓的方塊重合,則判定吃到樹莓,將樹莓?dāng)?shù)量清零;而沒吃到樹莓的話,蛇身就會跟著蛇頭運動,蛇身的最后一節(jié)將被踢出列表。

1        # 判斷是否吃掉了樹莓
2        if snakePosition[0] == raspberryPosition[0] and snakePosition[1] == raspberryPosition[1]:
3            raspberrySpawned = 0
4        else:
5            snakeSegments.pop()  # 每次將最后一單位蛇身踢出列表

3.4 重新生成樹莓

當(dāng)樹莓?dāng)?shù)量為0時,重新生成樹莓,同時分?jǐn)?shù)增加。

1        # 如果吃掉樹莓,則重新生成樹莓
2        if raspberrySpawned == 0:
3            x = random.randrange(1, 32)
4            y = random.randrange(1, 24)
5            raspberryPosition = [int(x*20), int(y*20)]
6            raspberrySpawned = 1
7            score += 1

3.5 刷新顯示層

每次蛇與樹莓的運動,都會進行刷新顯示層的操作來顯示。有點類似于動畫的“幀”。

1        # 繪制pygame顯示層
2        playSurface.fill(blackColour)
3        for position in snakeSegments[1:]:  # 蛇身為白色
4            pygame.draw.rect(playSurface, whiteColour, Rect(position[0], position[1], 20, 20))
5        pygame.draw.rect(playSurface, LightGrey, Rect(snakePosition[0], snakePosition[1], 20, 20))  # 蛇頭為灰色
6        pygame.draw.rect(playSurface, redColour, Rect(raspberryPosition[0], raspberryPosition[1], 20, 20))  # 樹莓為紅色
7        # 刷新pygame顯示層
8        pygame.display.flip()

3.6 判斷是否死亡

當(dāng)蛇頭超出邊界或者蛇頭與自己的蛇身重合時,蛇類死亡,調(diào)用GameOver。

1        # 判斷是否死亡
2        if snakePosition[0] > 620 or snakePosition[0] < 0:  # 超出左右邊界
3            gameOver(playSurface, score)
4        if snakePosition[1] > 460 or snakePosition[1] < 0:  # 超出上下邊界
5            gameOver(playSurface, score)
6        for snakeBody in snakeSegments[1:]:  # 蛇碰到自己身體
7            if snakePosition[0] == snakeBody[0] and snakePosition[1] == snakeBody[1]:
8                gameOver(playSurface, score)

3.7 控制游戲速度

為了增加難度,我們設(shè)置蛇身越長速度越快,直到達到一個上限。

1        # 控制游戲速度,長度越長速度越快
2        if len(snakeSegments) < 40:
3            speed = 6 + len(snakeSegments)//4
4        else:
5            speed = 16
6        fpsClock.tick(speed)

上述內(nèi)容就是Python編寫貪吃蛇小游戲,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI