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

教你一步步利用python實現(xiàn)貪吃蛇游戲

 更新時間:2019年06月27日 08:41:22   作者:上海小胖  
這篇文章主要給大家介紹了關(guān)于如何利用python實現(xiàn)貪吃蛇游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

0 引言

前幾天,星球有人提到貪吃蛇,一下子就勾起了我的興趣,畢竟在那個Nokia稱霸的年代,這款游戲可是經(jīng)典中的經(jīng)典?。《肞ython(蛇)玩Snake(貪吃蛇),那再合適不過了🤣🤣🤣

先通過下面這個效果圖來感受下吧!

1 環(huán)境

操作系統(tǒng):Windows

Python版本:3.7.3

2 需求分析

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

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

游戲規(guī)則就是這么簡單,接下來我們借助一個第三方庫pygame來實現(xiàn)它。

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

SDL(Simple DirectMedia Layer)是一個跨平臺庫,支持訪問計算機多媒體硬件(聲音、視頻、輸入等),SDL非常強大,但美中不足的是它是基于 C 語言的。

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

它的安裝方法很簡單,如下:

pip install pygame

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

3 代碼實現(xiàn)

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

import pygame, sys, random, time
# 從pygame模塊導(dǎo)入常用的函數(shù)和常量
from pygame.locals import *  

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

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

# 初始化Pygame庫
pygame.init()
# 初始化一個游戲界面窗口
DISPLAY = pygame.display.set_mode((640, 480))
# 設(shè)置游戲窗口的標(biāo)題
pygame.display.set_caption('人人都是Pythonista - Snake')
# 定義一個變量來控制游戲速度
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 初始化貪吃蛇及食物

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

# 貪吃蛇的的初始位置
snake_Head = [100,100]
# 初始化貪吃蛇的長度 (注:這里以20*20為一個標(biāo)準(zhǔn)小格子)
snake_Body = [[80,100],[60,100],[40,100]]
# 指定蛇初始前進的方向,向右
direction = "right"

# 給定第一枚食物的位置
food_Position = [300,300]
# 食物標(biāo)記:0代表食物已被吃掉;1代表未被吃掉。
food_flag = 1

3.3 實現(xiàn)貪吃蛇的上下左右移動

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

# 檢測按鍵等Pygame事件
for event in pygame.event.get():
  if event.type == QUIT:
    # 接收到退出事件后,退出程序
    pygame.quit()
    sys.exit()
    
  # 判斷鍵盤事件,用 方向鍵 或 wsad 來表示上下左右
  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

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

# 根據(jù)鍵盤的輸入,改變蛇的頭部,進行轉(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ù)量清零;而沒吃到食物的話,蛇身就會跟著蛇頭運動,蛇身的最后一節(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時,需要重新生成食物。利用random函數(shù)來生成隨機位置

# 生成新的食物
if food_flag == 0:
  # 隨機生成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 繪制貪吃蛇、食物、分數(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))

定義分數(shù)的繪制函數(shù)
# 打印出當(dāng)前得分
def drawScore(score):
  # 設(shè)置分數(shù)的顯示顏色
  score_Surf = BASICFONT.render('%s' %(score), True, GREY)
  # 設(shè)置分數(shù)的位置
  score_Rect = score_Surf.get_rect()
  score_Rect.midtop = (320, 240)
  # 綁定以上設(shè)置到句柄
  DISPLAY.blit(score_Surf, score_Rect)

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

DISPLAY.fill(BLACK)
# 畫出貪吃蛇
drawSnake(snake_Body)
# 畫出食物的位置
drawFood(food_Position)
# 打印出玩家的分數(shù)
drawScore(len(snake_Body) - 3)
# 刷新Pygame的顯示層,貪吃蛇與食物的每一次移動,都會進行刷新顯示層的操作來顯示。
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模塊實現(xiàn)了最簡單的貪吃蛇版本。當(dāng)然還有很多需要優(yōu)化的地方,比如隨機生成食物時如何避免出現(xiàn)在貪吃蛇的自身上、通過貪吃蛇的長度來自動控制游戲速度等等。更高級一點的有如何通過AI自動玩貪吃蛇、貪吃蛇的雙人對戰(zhàn)等,期待大家利用Python可以把貪吃蛇玩出一個新的高度!😎😎😎

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 利用Python程序讀取Excel創(chuàng)建折線圖

    利用Python程序讀取Excel創(chuàng)建折線圖

    這篇文章主要介紹了利用Python程序讀取Excel創(chuàng)建折線圖,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • python自動化之re模塊詳解

    python自動化之re模塊詳解

    這篇文章主要為大家介紹了python自動化之re模塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python MySQL數(shù)據(jù)庫連接池組件pymysqlpool詳解

    Python MySQL數(shù)據(jù)庫連接池組件pymysqlpool詳解

    這篇文章主要跟大家介紹了關(guān)于Python MySQL數(shù)據(jù)庫連接池組件pymysqlpool的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • 如何通過Python實現(xiàn)RabbitMQ延遲隊列

    如何通過Python實現(xiàn)RabbitMQ延遲隊列

    這篇文章主要介紹了如何通過Python實現(xiàn)RabbitMQ延遲隊列,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • python在windows和linux下獲得本機本地ip地址方法小結(jié)

    python在windows和linux下獲得本機本地ip地址方法小結(jié)

    這篇文章主要介紹了python在windows和linux下獲得本機本地ip地址方法,實例分析了Python獲得IP地址的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • python 畫函數(shù)曲線示例

    python 畫函數(shù)曲線示例

    今天小編就為大家分享一篇python 畫函數(shù)曲線示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python多進程重復(fù)加載的解決方式

    python多進程重復(fù)加載的解決方式

    今天小編就為大家分享一篇python多進程重復(fù)加載的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python實現(xiàn)自動上京東搶手機

    Python實現(xiàn)自動上京東搶手機

    這篇文章主要為大家詳細介紹了Python實現(xiàn)自動上京東搶手機的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • pytorch構(gòu)建多模型實例

    pytorch構(gòu)建多模型實例

    今天小編就為大家分享一篇pytorch構(gòu)建多模型實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 在python中解決死鎖的問題

    在python中解決死鎖的問題

    這篇文章主要介紹了在python中解決死鎖的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論

台南县| 富宁县| 惠东县| 巨野县| 乌苏市| 兖州市| 金门县| 松潘县| 宽甸| 兰西县| 阳信县| 安平县| 罗甸县| 新津县| 大方县| 韶关市| 辰溪县| 孟津县| 黑河市| 绍兴县| 大洼县| 江华| 中西区| 讷河市| 靖远县| 安康市| 雅安市| 五河县| 澄城县| 舟曲县| 西昌市| 漳平市| 正宁县| 邵阳市| 两当县| 集贤县| 金阳县| 山西省| 双牌县| 高雄市| 会昌县|