嗨,大家好,我是一條,
告訴大家一個好訊息,一條IT訪問量突破20w,達到申請博客專家的條件,感謝大家的支持,一潭訓創作更多的優質內容,

為了讓更多的人看到一條的分享,一條準備報名原力計劃,報名條件是粉絲數超過2000,
所以一條現在非常需要大家的關注,如果覺得一條寫的還可以,就點個關注再走吧!
等粉絲數達到2000時,一條給大家在微信準備一個抽獎,獎品暫定鍵盤和手環二選一,關注微信公眾號就可以參與,
今天一條整體的作業比較輕松,對公司的一些流程也比較熟悉了,所以給大家也準備個比較輕松的東西,
用pygame帶大家用半小時做一款童年游戲——貪吃蛇
先看下成品:視頻傳送門
話不多說,我們開干!沖沖沖!
一、pygame預熱
有些同學可能還不太了解pygame,所以先簡單介紹一下,會的同學可以跳過這一部分,
pygame是基于python撰寫的圖形化編程庫,可以使程式運行在各種平臺,同時學習起來也非常簡單,我們直接上案例,
1.安裝pygame
pygame庫的安裝非常簡單,基本不會出問題
pip install pygame
import pygame
#中文字符
import pygame.freetype
2.基礎案例
簡單介紹一下pygame的幾個用法,直接跟著代碼和注釋操作一下,簡單了解就可以,
- 初始化一個視窗,并設定其屬性
import pygame
# 初始化pygame
pygame.init()
# 創建pygame顯示層
screen=pygame.display.set_mode((1000,600))
pygame.display.set_caption("貪吃蛇")
- 將視窗定格住
import pygame
# 初始化pygame
pygame.init()
# 創建pygame顯示層
screen=pygame.display.set_mode((1000,600))
# 設定視窗的標題
pygame.display.set_caption("貪吃蛇")
while True:
# 繪制綠色
screen.fill((0,255,0))
# 更新畫面
pygame.display.update()
- 增加退出按鈕
import pygame
import sys
# 初始化pygame
pygame.init()
# 創建pygame顯示層
screen=pygame.display.set_mode((1000,600))
# 設定視窗的標題
pygame.display.set_caption("貪吃蛇")
while True:
# 繪制綠色
screen.fill((0,255,0))
# 監聽事件:鍵盤 滑鼠 視窗退出事件
for event in pygame.event.get():
# 退出
if event.type ==256:
pygame.QUIT
sys.exit()
# 更新畫面
pygame.display.update()
- 繪制一個圖形
import pygame
import sys
# 初始化pygame
pygame.init()
# 創建pygame顯示層
screen=pygame.display.set_mode((1000,600))
# 設定視窗的標題
pygame.display.set_caption("貪吃蛇")
while True:
# 繪制綠色
screen.fill((0,255,0))
#繪制矩形
b = pygame.draw.rect(screen, (255, 255, 255), [20, 20, 20, 20], 0)
# 監聽事件:鍵盤 滑鼠 視窗退出事件
for event in pygame.event.get():
# 退出
if event.type ==256:
pygame.QUIT
sys.exit()
# 更新畫面
pygame.display.update()
- 讓圖形動起來,其實就相當于影片片,每一幀變換一下方塊繪制的位置,連起來看就是影片
import pygame
import sys
# 初始化pygame
pygame.init()
# 創建pygame顯示層
screen=pygame.display.set_mode((1000,600))
# 設定視窗的標題
pygame.display.set_caption("貪吃蛇")
# 獲取幀率控制器
clock=pygame.time.Clock()
x, y = 0, 0 # 方塊的起點
width, height = 20, 20 # 方塊的寬,高
while True:
# 繪制綠色
screen.fill((0,255,0))
# 畫方塊
a = pygame.draw.rect(screen, (255, 0, 0), (x, y, width, height))
# 改變位置
x+=2
y+=3
# 監聽事件:鍵盤 滑鼠 視窗退出事件
for event in pygame.event.get():
# 退出
if event.type ==256:
pygame.QUIT
sys.exit()
# 更新畫面
pygame.display.update()
# 設定速度
clock.tick(15)
這樣,一個簡單的影片就做好了,如果要做成貪吃蛇,還需要加上邏輯判斷和事件處理,
那我們就正式開始做游戲,
二、正式開干
基于以上的了解,我們思考一下實作這個游戲的思路
- 首先需要一個視窗,將蛇和食物畫在這個視窗上,即正方形塊
- 通過變換位置讓蛇動起來
- 讓蛇可以上下左右轉彎
- 在蛇和食物的位置重合時,讓蛇吃點食物,同時蛇增長,分數增加(核心部分)
- 重繪食物的位置
- 死亡判定
- 擴展:增加暫停,增加重新開始,增加背景音樂,打包成exe檔案
萬事俱備,只欠東風,開始吧
1.畫蛇和食物
- 初始化蛇頭,蛇身,得分的位置坐標,蛇的前進方向,食物是否被吃,游戲是否結束
#位置資訊
head=[100,0]
snake=[
[100,0],[80,0],[60,0]
]
food=[500,300]
socer=0
iseat=False
isover=False
goahead="R"
- 繪制以上資訊
import pygame
import sys
from pygame.locals import *
import pygame.freetype
import random
import time
pygame.init()
screen=pygame.display.set_mode((1000,600))
pygame.display.set_caption("snake")
clock = pygame.time.Clock()
while True:
screen.fill((0, 0, 0))
f1 = pygame.freetype.SysFont("fangsong", 24)
f1rect = f1.render_to(screen, (860,20), "得分:"+str(socer), fgcolor=(225,225,225))
for i in snake:
pygame.draw.rect(screen, (255, 0, 0), (i[0],i[1], 20, 20))
pygame.draw.rect(screen, (164, 167, 220), (food[0],food[1] , 20, 20))
pygame.display.update()
clock.tick(15)
2.讓蛇動起來
動起來的核心就是把整條蛇看作一個串列,因為蛇的長度是不變的,只是位置的坐標的變化,所以增加一個頭元素,洗掉一個尾元素,蛇就前進了一步,

#最初的前進方向
goahead="R"
# 各個移動方向的坐標的改變
if(goahead == "R"):
head[0]+=20
elif(goahead=="L"):
head[0]-=20
elif(goahead=="U"):
head[1]-=20
elif(goahead=="D"):
head[1]+=20
snake.insert(0, list(head))
snake.pop()
3.蛇轉彎
轉彎其實是對鍵盤按鍵的就監聽和行進方向的改變,如果目前是向右,那么按上鍵,行進方向改為上,下鍵改為下,以此類推,
# 監聽事件:鍵盤 滑鼠 視窗退出事件
for event in pygame.event.get():
# 退出
if event.type == QUIT:
pygame.QUIT
sys.exit()
# 鍵盤按下
if event.type==pygame.KEYDOWN:
# 轉向
if event.key == pygame.K_LEFT:
if (goahead=="D" or goahead=="U"):
goahead="L"
elif event.key == pygame.K_RIGHT:
if (goahead=="D" or goahead=="U"):
goahead="R"
elif event.key == pygame.K_UP:
if (goahead=="L" or goahead=="R"):
goahead="U"
elif event.key == pygame.K_DOWN:
if (goahead=="L" or goahead=="R"):
goahead="D"
4.蛇吃食物
這里只需判斷食物的坐標和蛇頭的坐標是否重合,因為一定是蛇頭先吃到食物,如果存在,蛇吃到了食物長大一個長度,即尾元素不需要洗掉,同時得分增加,食物的坐標清空,
snake.insert(0, list(head))
# 驗證食物是否被吃
if(food==head):
iseat=True
socer+=5
# 拋出上一個位置
elif(goahead!="T"):
snake.pop()
5.重繪食物
如果食物被吃掉,那要隨機生成食物的坐標,同時要保證一下兩點:
- 新的坐標和舊的不重合
- 新的坐標不能生成在蛇身內
# 食物隨機出現
# 隨機在重復位置
if(iseat==True):
while True:
insnake=True
food[0]=random.randint(1,42)*20
food[1]=random.randint(1,28)*20
for i in snake:
if(food==i):
insnake=False
if(insnake):
break
iseat=False
6.死亡判定
- 第一種死亡情況:自殺式 即蛇頭的坐標出現在蛇身內
# 自殺
for i in snake[1:]:
if(head==i):
isover=True
- 第一種死亡情況:撞墻式,也可以設定成無邊界,則此死亡方式不存在,
# 無邊界
# if(head[0]>1000):
# head[0]=0
# if (head[0] <0):
# head[0] = 1000
# if (head[1] > 600):
# head[1] = 0
# if (head[1] < 0):
# head[1] = 600
# 撞墻
if(head[0]>1000 or head[0]<0 or head[1]>600 or head[1]<0):
isover=True
游戲結束的展示
if(isover):
f2=pygame.freetype.SysFont("arial",72)
f2.render_to(screen,(350,150),"Game Over",fgcolor=(150,150,150))
# 更新當前畫面
pygame.display.update()
time.sleep(5)
pygame.quit()
sys.exit()
三、打完收工
最后在教大家如何打包成exe
1.安裝pyinstaller
pip install pyinstaller
2.打包
#pyinstaller -F -w filepath+filename
pyinstaller -F -w ./main.py
到此,我們簡單的貪吃蛇游戲就做完了,上面提到的擴展功能一條已全部完成,即視頻展示的樣子,
此處就不再講解,需要的同學【點贊,關注,收藏】后私信一條領取原始碼,
我是一條,一個在互聯網摸爬滾打的程式員,
微信搜【一條IT】關注我,第一時間獲取文章推送,
道阻且長,行則將至,大家的 【點贊,收藏,關注】 就是一條創作的最大動力,我們下期見!
注:關于本篇博客有任何問題和建議,歡迎大家留言!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/281327.html
標籤:區塊鏈
下一篇:谷粒商城專案環境搭建
