<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這幾年人工智慧技術大發展,Python因此幾乎成了第一位的語言。實際上,多年來,它不僅在軟體工程師中得到廣泛使用,也是各行業通用的專家語言,就是說,不管孩子以後做什麼,都可能用得著。準備針對我自己上小學的孩子,每週抽出些時間,通過學習他們感興趣的小遊戲,逐步把python知識點帶進遊戲的製作過程中,用到哪些知識簡單的解紹一下哪些,以學,以用為主。
本次我們將編寫一個貪吃蛇的遊戲。通過鍵盤上、下、左、右控制小蛇上、下、左、右移動,吃到食物後長度加1;蛇頭碰到自身或視窗邊緣,遊戲失敗。我們首先構造小蛇,實現小蛇向4個方向移動;然後實現遊戲失敗的判斷、吃食物增加長度、得分功能;每段遊戲,增加一個功能,另存一下,容易讓孩子理解學習,同時也可以讓其在每個階段增加他想增加的功能,一舉多得。最後學習函數的定義與使用,並通過進行時間控制變更遊戲難度。
1、蛇的表示
遊戲開發本身就會用到很多物件導向的概念,而蛇的身體又是一個天然的“連結串列”結構,太適合用來練習資料結構了。
蛇怎麼表示?我們可以將整個遊戲區域劃分成一個個的小格子,由一組連在一起的小格子組成“蛇”,蛇頭用個蛇頭(圓帶兩個眼睛)表示,蛇身用個圓表示。我們可以用座標來表示每一個小方格,X 軸和 Y 軸的範圍都是可以設定好的。用一個列表來存放“蛇身”的座標,那麼一條“蛇”就出來了。
2、蛇怎麼移動?
第一反應就是像蚯蚓爬行一樣,每一個小方塊向前移動一格,但這樣實現起來很麻煩。想象一下我們玩過的貪吃蛇,每次“蛇”的移動感覺上是整體往前移動了一格,排除掉腦子中“蛇”的“動作”,細想移動前和移動後“蛇”的位置變化,其實除了頭尾,其他部分根本就沒有變。那就簡單了,將下一格的座標新增到列表開頭,並移除列表的最後一個元素,就相當於蛇向前移動了一格。(由於蛇頭與蛇身是不同的圖片,還需要把第二張也即原先的蛇並沒有照片換成蛇身照片,要不跑幾步就成一串蛇頭了,你可以試試,把蛇身換蛇頭的那行程式碼註釋掉就可看到了。)
3、玩家控制小蛇移動功能的實現
玩家控制小蛇移動,在update()函數中實現使用者按上、下、左、右方向鍵,設定direction變數取不同的值,即可實現玩家鍵盤控制小蛇向4個方向移動。即通過一個公共變數direction來實現,當鍵盤按不同的上下左右鍵時修改公共變數direction就達到了玩家控制小蛇方向的問題。
4、如何判定遊戲結束?
“蛇”移動超出了遊戲區的範圍或者碰到了自己就算輸了,軸座標的範圍是事先定好的,超出範圍很容易判斷。那麼如何判斷碰到自己呢?如果腦子裡想的是“蛇”動的畫面,那真的比較難了,但是放到程式碼中,我們的“蛇”是一個列表,那麼只要判斷下一格的座標是否已經包含在“蛇”的列表中豈不就可以了?
理清了這些問題,我們就可以開始編碼了。
1.1 列表
遊戲開發本身就會用到很多物件導向的概念,而蛇的身體又是一個天然的“連結串列”結構,太適合用來練習資料結構了。
列表,資料型別list,list是python內建的一種高階資料型別。list是一種有序的集合,基於連結串列實現 在python中應用很廣泛,可以隨時新增和刪除其中的元素。在此遊戲中用於表是蛇身,由蛇頭,蛇身組成,吃個食物,蛇身增加一段,即應用列表新增一個蛇身圖片。蛇身的移動,用到了列表的新增與刪除功能。len()可以獲得列表長度。用索引來存取list中每一個位置的元素,記得索引是從0開始的,也可以用負數,表示從-1表示列表最後一個。
append()在列表未尾增加一個元素
如:Snake.append(snakebody) # 把蛇身加入列表中
del 刪除最後一個元素
del Snake[len(Snake)-1] # 刪除舊蛇尾
也可用 del Snake[-1]
在指定位置增加元素用insert()
如:Snake.insert(0, newSnakeHead) # 把新蛇頭加到列表的最前面
1.2 time 時間模組
屬於Python的時間模組。基本上,這會增加執行延遲,並且只會暫停當前執行緒,而不會暫停整個程式。
Python的time模組中提供了Python time.sleep()函數。在使用此Python函數之前,您需要使用以下命令匯入此模組:import time
匯入此模組後,即可使用time.sleep()函數。語法如下:
句法:睡眠(秒),如您所見,它需要一個引數,即秒。在執行過程中,這基本上會引起這麼多秒的延遲,此遊戲中應用到sleep(0.2),讓遊戲更新時暫緩0.2秒,通過此引數可以偵錯蛇的移動速度。
1.3 random模組
random() 方法返回隨機生成的一個實數,它在[0,1)範圍內
import random random.random() #randint函數,返回指定範圍的一個隨機整數,包含上下限 random.randint(0,99)#返回0~99之間的整數
Pygame Zero這個神器,它對PyGame做了很多封裝,避免寫很多枯燥的框架程式碼,讓初學者可以更專注於遊戲核心邏輯,容易上手。
2.1 遊戲角色Acto
遊戲角色Actor pgzero中所有以圖片顯示的元素都是Actor類來定義,如snakebody = Actor(‘snake2’) # 匯入蛇身方塊圖片。也可以理解為Actor是用來代表一個你繪製到螢幕的圖形。
通過把字串 ‘snake2’ 作為引數傳遞給 Actor 類,Pygame Zero自動載入了外星人精靈,並且圖片具有位置和大小屬性。snake2是指images資料夾下snake2.png圖片。也可以apple = Actor(‘apple’,(200,300)) # 設定圖片apple的位置。連圖片帶位置一起指定。
一個免費的png圖片下載網站:https://kenney.nl/assets/page:3?q=2d
2.2 輸出中文字型
顯示中文 準備:在.py同級目錄下新建fonts資料夾,並放入支援中文的字型檔案simhei.ttf
if isclose: # 顯示遊戲失敗資訊 screen.draw.text(「遊戲失敗!」, (120, HEIGHT/2-100), fontsize=100, fontname=‘simhei', color=‘yellow')
2.3鍵盤控制
from pgzero.keyboard import keys, Keyboard
可以查詢下原碼,通過keys.w,keyboard.left等進行控制
import pgzrun # 匯入遊戲庫 TILE_SIZE = 30 # 小蛇方塊的大小,20×20 WIDTH = 20*TILE_SIZE # 設定視窗的寬度為800 HEIGHT = 20*TILE_SIZE # 設定視窗的高度為600 snkaeHead = Actor('snake1') # 匯入蛇頭方塊圖片 snkaeHead.x = WIDTH/2 # 蛇頭方塊圖片的x座標 snkaeHead.y = HEIGHT/2 # 蛇頭方塊圖片的y座標 Snake = [] # 儲存蛇的列表 Snake.append(snkaeHead) # 把蛇頭加入列表中 for i in range(4): # 再為蛇新增4段蛇身 print(i) snakebody = Actor('snake2') # 匯入蛇身方塊圖片 snakebody.x = Snake[i].x - TILE_SIZE # 蛇身方塊圖片的x座標 snakebody.y = Snake[i].y # 蛇身方塊圖片的y座標 Snake.append(snakebody) # 把蛇身加入列表中 def draw(): # 繪製模組,每幀重複執行 screen.clear() # 每幀清除螢幕,便於重新繪製 for snkaebody in Snake: # 繪製蛇 snkaebody.draw() pgzrun.go() # 開始執行遊戲
蛇一直向右移動,直至完全走出螢幕
direction = 'right' def update(): # 更新模組,每幀重複操作 newSnakeHead = Actor('snake1') # 建立新蛇頭的圖片 # 根據direction變數設定新蛇頭的座標 # 如小蛇向下移動,就在舊蛇頭的下邊 if direction == 'right': # 小蛇向右移動 newSnakeHead.x = Snake[0].x + TILE_SIZE newSnakeHead.y = Snake[0].y if direction == 'left': # 小蛇向左移動 newSnakeHead.x = Snake[0].x - TILE_SIZE newSnakeHead.y = Snake[0].y if direction == 'up': # 小蛇向上移動 newSnakeHead.x = Snake[0].x newSnakeHead.y = Snake[0].y - TILE_SIZE if direction == 'down': # 小蛇向下移動 newSnakeHead.x = Snake[0].x newSnakeHead.y = Snake[0].y + TILE_SIZE Snake.insert(0, newSnakeHead) # 把新蛇頭加到列表的最前面 Snake[1].image='snake2' del Snake[len(Snake)-1] # 刪除舊蛇尾
def update(): # 更新模組,每幀重複操作 global direction,isclose if keyboard.left: # 如果按下鍵盤向左方向鍵 direction = 'left' # 小蛇要向左移 if keyboard.right: # 如果按下鍵盤向右方向鍵 direction = 'right' # 小蛇要向右移 if keyboard.up: # 如果按下鍵盤向上方向鍵 direction = 'up' # 小蛇要向上移 if keyboard.down: # 如果按下鍵盤向下方向鍵 direction = 'down' # 小蛇要向下移
# 當小蛇(新蛇頭)超出邊框時,遊戲失敗 if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH: isclose = True def draw(): # 繪製模組,每幀重複執行 screen.clear() # 每幀清除螢幕,便於重新繪製 for snkaebody in Snake: # 繪製蛇 snkaebody.draw() # 顯示中文 準備:在.py同級目錄下新建fonts資料夾,並放入支援中文的字型檔案simhei.ttf if isclose: # 顯示遊戲失敗資訊 screen.draw.text("遊戲失敗!", (120, HEIGHT/2-100), fontsize=100, fontname='simhei', color='yellow')
當小蛇頭碰到食物時,不處理,也就是長度+1;青蛙重新在隨機位置出現;
if newSnakeHead.x == food.x and newSnakeHead.y == food.y: food.x = random.randint(5, 20) * TILE_SIZE food.y = random.randint(5, 20) * TILE_SIZE score = score + 1 # 得分加1
設定公共變數score,當小蛇吃到食物時,score值加1,更新時螢幕顯示出得分,用如下語句。
screen.draw.text("得分:"+str(score), (100, 20), fontsize=50, fontname='simhei', color='white')
由於網友建意,把原始碼增加在此,為方便大家查詢,特修改添之
# _*_ coding: UTF-8 _*_ # 開發團隊: 資訊化未來 # 開發人員: Administrator # 開發時間:2022/9/4 18:02 # 檔名稱: 貪吃蛇.py # 開發工具: PyCharm import pgzrun # 匯入遊戲庫 from pgzero.actor import Actor from pgzero.keyboard import Keyboard from pgzero.screen import Screen keyboard: Keyboard # 型別標註 screen: Screen # 型別標註 import time import random # 匯入隨機庫 TILE_SIZE = 30 # 小蛇方塊的大小,20×20 WIDTH = 20*TILE_SIZE # 設定視窗的寬度為800 HEIGHT = 20*TILE_SIZE # 設定視窗的高度為600 snkaeHead = Actor('snake1') # 匯入蛇頭方塊圖片 snkaeHead.x = WIDTH/2 # 蛇頭方塊圖片的x座標 snkaeHead.y = HEIGHT/2 # 蛇頭方塊圖片的y座標 food = Actor('food') # 匯入食物方塊圖片 food.x = random.randint(10, 20)*TILE_SIZE # 食物方塊圖片的x座標 food.y = random.randint(10, 20)*TILE_SIZE # 食物方塊圖片的y座標 score = 0 # 遊戲得分 direction = 'right' isclose = False Snake = [] # 儲存蛇的列表 Snake.append(snkaeHead) # 把蛇頭加入列表中 for i in range(4): # 再為蛇新增4段蛇身 print(i) snakebody = Actor('snake2') # 匯入蛇身方塊圖片 snakebody.x = Snake[i].x - TILE_SIZE # 蛇身方塊圖片的x座標 snakebody.y = Snake[i].y # 蛇身方塊圖片的y座標 Snake.append(snakebody) # 把蛇身加入列表中 def draw(): # 繪製模組,每幀重複執行 screen.clear() # 每幀清除螢幕,便於重新繪製 for snkaebody in Snake: # 繪製蛇 snkaebody.draw() food.draw() # 顯示中文 準備:在.py同級目錄下新建fonts資料夾,並放入支援中文的字型檔案.ttf if isclose: # 顯示遊戲失敗資訊 screen.draw.text("遊戲失敗!", (120, HEIGHT/2-100), fontsize=100, fontname='simhei', color='yellow') # fontname='宋體', screen.draw.text("得分:"+str(score), (100, 20), fontsize=50, fontname='simhei', color='white') def update(): # 更新模組,每幀重複操作 global direction,isclose,food,score if keyboard.left: # 如果按下鍵盤向左方向鍵 direction = 'left' # 小蛇要向左移 if keyboard.right: # 如果按下鍵盤向右方向鍵 direction = 'right' # 小蛇要向右移 if keyboard.up: # 如果按下鍵盤向上方向鍵 direction = 'up' # 小蛇要向上移 if keyboard.down: # 如果按下鍵盤向下方向鍵 direction = 'down' # 小蛇要向下移 newSnakeHead = Actor('snake1') # 建立新蛇頭的圖片 # 根據direction變數設定新蛇頭的座標 # 如小蛇向下移動,就在舊蛇頭的下邊 if direction == 'right': # 小蛇向右移動 newSnakeHead.x = Snake[0].x + TILE_SIZE newSnakeHead.y = Snake[0].y if direction == 'left': # 小蛇向左移動 newSnakeHead.x = Snake[0].x - TILE_SIZE newSnakeHead.y = Snake[0].y if direction == 'up': # 小蛇向上移動 newSnakeHead.x = Snake[0].x newSnakeHead.y = Snake[0].y - TILE_SIZE if direction == 'down': # 小蛇向下移動 newSnakeHead.x = Snake[0].x newSnakeHead.y = Snake[0].y + TILE_SIZE # 當小蛇(新蛇頭)超出邊框時,遊戲失敗 if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH: isclose = True # 當小蛇蛇頭碰到自身時,遊戲失敗 for snakebody in Snake: # 對所有蛇身迴圈,判斷是否和蛇頭座標一致 if newSnakeHead.x == snakebody.x and newSnakeHead.y == snakebody.y: isLoose = True break # 當小蛇頭碰到食物時,不處理,也就是長度+1;青蛙重新在隨機位置出現; if newSnakeHead.x == food.x and newSnakeHead.y == food.y: food.x = random.randint(5, 20) * TILE_SIZE food.y = random.randint(5, 20) * TILE_SIZE score = score + 1 # 得分加1 else: # 否則,刪除掉舊蛇尾,也就是蛇的長度保持不變 del Snake[len(Snake) - 1] Snake.insert(0, newSnakeHead) # 把新蛇頭加到列表的最前面 Snake[1].image='snake2' # del Snake[len(Snake)-1] # 刪除舊蛇尾 time.sleep(0.2) # 暫停0.2s pgzrun.go() # 開始執行遊戲
這次我們主要製作了貪吃蛇遊戲,瞭解了time模組的sleep函數、clock模組的schedule等功能,學習了列表的插入函數、break與continue語句、函數的定義與呼叫等知識點。讀者可以嘗試在本章程式碼的基礎上繼續改進:1.實現得分越來越高,遊戲速度越來越快的效果;2.實現蛇頭、蛇身不同顏色的顯示效果;
以上就是基於Python實現貪吃蛇小遊戲(附原始碼)的詳細內容,更多關於Python貪吃蛇遊戲的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45