真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python編寫(xiě)貪吃蛇小游戲

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

創(chuàng)新互聯(lián)建站-云計(jì)算及IDC服務(wù)提供商,涵蓋公有云、IDC機(jī)房租用、資陽(yáng)服務(wù)器托管、等保安全、私有云建設(shè)等企業(yè)級(jí)互聯(lián)網(wǎng)基礎(chǔ)服務(wù),歡迎咨詢(xún):18980820575

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

Python編寫(xiě)貪吃蛇小游戲

廢話不多說(shuō),我們直接來(lái)講解如何利用Python進(jìn)行貪吃蛇的編寫(xiě)吧

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

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

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

這就是編寫(xiě)貪吃蛇時(shí)我們需要調(diào)用的庫(kù)。

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

1.2 初始設(shè)置

我們通過(guò)這幾行代碼來(lái)初始化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是不自帶的。所以我們需要定義幾個(gè)顏色。

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ù)就是跳出這個(gè)循環(huán)的條件。這里給出當(dāng)蛇吃到自己身體或者碰到邊界時(shí)顯示的界面(判斷死亡的代碼會(huì)在之后展示)

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秒后自動(dòng)關(guān)閉
17    time.sleep(5)
18    pygame.quit()
19    sys.exit()

3.貪吃蛇與樹(shù)莓

接下來(lái)介紹游戲的主題部分,即貪吃蛇與蛇莓的顯示以及運(yùn)動(dòng)。

3.1 定義初始位置

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

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

3.2 鍵盤(pán)輸入判斷蛇的運(yùn)動(dòng)

我們需要通過(guò)鍵盤(pán)輸入的上下左右鍵或WASD來(lái)控制蛇類(lèi)運(yùn)動(dòng),同時(shí)加入按下Esc就退出游戲的功能。

1 # 檢測(cè)例如按鍵等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                # 判斷鍵盤(pán)事件
 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))

貪吃蛇運(yùn)動(dòng)有一個(gè)特點(diǎn):不能反方向運(yùn)動(dòng)。所以我們需要加入限制條件。

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

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

 1        # 根據(jù)方向移動(dòng)蛇頭的坐標(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 判斷是否吃到樹(shù)莓

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

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

3.4 重新生成樹(shù)莓

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

1        # 如果吃掉樹(shù)莓,則重新生成樹(shù)莓
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 刷新顯示層

每次蛇與樹(shù)莓的運(yùn)動(dòng),都會(huì)進(jìn)行刷新顯示層的操作來(lái)顯示。有點(diǎn)類(lèi)似于動(dòng)畫(huà)的“幀”。

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))  # 樹(shù)莓為紅色
7        # 刷新pygame顯示層
8        pygame.display.flip()

3.6 判斷是否死亡

當(dāng)蛇頭超出邊界或者蛇頭與自己的蛇身重合時(shí),蛇類(lèi)死亡,調(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 控制游戲速度

為了增加難度,我們?cè)O(shè)置蛇身越長(zhǎng)速度越快,直到達(dá)到一個(gè)上限。

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

上述內(nèi)容就是Python編寫(xiě)貪吃蛇小游戲,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


文章標(biāo)題:Python編寫(xiě)貪吃蛇小游戲
瀏覽路徑:http://weahome.cn/article/iiseej.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部