学生学python编程---实现贪吃蛇小游戏+源码
學生學python編程---實現貪吃蛇小游戲+源碼
- 前言
- 主要設計
- 1、蛇的表示
- 2、蛇怎么移動?
- 3、玩家控制小蛇移動功能的實現
- 4、如何判定游戲結束?
- 應用知識點
- 1、python知識點
- 1.1 列表
- append()在列表未尾增加一個元素
- del 刪除最后一個元素
- 在指定位置增加元素用insert()
- 1.2 time 時間模塊
- 1.3 random模塊
- 2、pygamezero知識點
- 2.1 游戲角色Acto
- 2.2 輸出中文字體
- 2.3鍵盤控制
- 功能截圖
- 代碼實現
- 1、蛇的表示
- 2、蛇的前進移動
- 3、控制移動方向
- 4、游戲失敗
- 5、食物的隨機出現
- 6、游戲得分
- 總結
- 源碼獲取
前言
這幾年人工智能技術大發展,Python因此幾乎成了第一位的語言。實際上,多年來,它不僅在軟件工程師中得到廣泛使用,也是各行業通用的專家語言,就是說,不管孩子以后做什么,都可能用得著。準備針對我自己上小學的孩子,每周抽出些時間,通過學習他們感興趣的小游戲,逐步把python知識點帶進游戲的制作過程中,用到哪些知識簡單的解紹一下哪些,以學,以用為主。
本次我們將編寫一個貪吃蛇的游戲。通過鍵盤上、下、左、右控制小蛇上、下、左、右移動,吃到食物后長度加1;蛇頭碰到自身或窗口邊緣,游戲失敗。我們首先構造小蛇,實現小蛇向4個方向移動;然后實現游戲失敗的判斷、吃食物增加長度、得分功能;每段游戲,增加一個功能,另存一下,容易讓孩子理解學習,同時也可以讓其在每個階段增加他想增加的功能,一舉多得。最后學習函數的定義與使用,并通過進行時間控制變更游戲難度。
主要設計
1、蛇的表示
游戲開發本身就會用到很多面向對象的概念,而蛇的身體又是一個天然的“鏈表”結構,太適合用來練習數據結構了。
蛇怎么表示?我們可以將整個游戲區域劃分成一個個的小格子,由一組連在一起的小格子組成“蛇”,蛇頭用個蛇頭(圓帶兩個眼睛)表示,蛇身用個圓表示。我們可以用坐標來表示每一個小方格,X 軸和 Y 軸的范圍都是可以設定好的。用一個列表來存放“蛇身”的坐標,那么一條“蛇”就出來了。
2、蛇怎么移動?
第一反應就是像蚯蚓蠕動一樣,每一個小方塊向前移動一格,但這樣實現起來很麻煩。想象一下我們玩過的貪吃蛇,每次“蛇”的移動感覺上是整體往前移動了一格,排除掉腦子中“蛇”的“動作”,細想移動前和移動后“蛇”的位置變化,其實除了頭尾,其他部分根本就沒有變。那就簡單了,將下一格的坐標添加到列表開頭,并移除列表的最后一個元素,就相當于蛇向前移動了一格。(由于蛇頭與蛇身是不同的圖片,還需要把第二張也即原先的蛇并沒有照片換成蛇身照片,要不跑幾步就成一串蛇頭了,你可以試試,把蛇身換蛇頭的那行代碼注釋掉就可看到了。)
3、玩家控制小蛇移動功能的實現
玩家控制小蛇移動功能的實現
玩家控制小蛇移動,在update()函數中實現用戶按上、下、左、右方向鍵,設定direction變量取不同的值,即可實現玩家鍵盤控制小蛇向4個方向移動。即通過一個公共變量direction來實現,當鍵盤按不同的上下左右鍵時修改公共變量direction就達到了玩家控制小蛇方向的問題。
4、如何判定游戲結束?
“蛇”移動超出了游戲區的范圍或者碰到了自己就算輸了,軸坐標的范圍是事先定好的,超出范圍很容易判斷。那么如何判斷碰到自己呢?
如果腦子里想的是“蛇”動的畫面,那真的比較難了,但是放到代碼中,我們的“蛇”是一個列表,那么只要判斷下一格的坐標是否已經包含在“蛇”的列表中豈不就可以了?
理清了這些問題,我們就可以開始編碼了。
應用知識點
1、python知識點
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之間的整數
2、pygamezero知識點
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等進行控制
功能截圖
代碼實現
1、蛇的表示
import pgzrun # 導入游戲庫 TILE_SIZE = 30 # 小蛇方塊的大小,20×20 WIDTH = 20*TILE_SIZE # 設置窗口的寬度為800 HEIGHT = 20*TILE_SIZE # 設置窗口的高度為600snkaeHead = 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() # 開始執行游戲2、蛇的前進移動
蛇一直向右移動,直至完全走出屏幕
direction = 'right' def update(): # 更新模塊,每幀重復操作newSnakeHead = Actor('snake1') # 創建新蛇頭的圖片 # 根據direction變量設定新蛇頭的坐標 # 如小蛇向下移動,就在舊蛇頭的下邊if direction == 'right': # 小蛇向右移動newSnakeHead.x = Snake[0].x + TILE_SIZEnewSnakeHead.y = Snake[0].yif direction == 'left': # 小蛇向左移動newSnakeHead.x = Snake[0].x - TILE_SIZEnewSnakeHead.y = Snake[0].yif direction == 'up': # 小蛇向上移動newSnakeHead.x = Snake[0].xnewSnakeHead.y = Snake[0].y - TILE_SIZEif direction == 'down': # 小蛇向下移動newSnakeHead.x = Snake[0].xnewSnakeHead.y = Snake[0].y + TILE_SIZESnake.insert(0, newSnakeHead) # 把新蛇頭加到列表的最前面Snake[1].image='snake2'del Snake[len(Snake)-1] # 刪除舊蛇尾3、控制移動方向
def update(): # 更新模塊,每幀重復操作global direction,iscloseif keyboard.left: # 如果按下鍵盤向左方向鍵direction = 'left' # 小蛇要向左移if keyboard.right: # 如果按下鍵盤向右方向鍵direction = 'right' # 小蛇要向右移if keyboard.up: # 如果按下鍵盤向上方向鍵direction = 'up' # 小蛇要向上移if keyboard.down: # 如果按下鍵盤向下方向鍵direction = 'down' # 小蛇要向下移4、游戲失敗
# 當小蛇(新蛇頭)超出邊框時,游戲失敗if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:isclose = Truedef draw(): # 繪制模塊,每幀重復執行screen.clear() # 每幀清除屏幕,便于重新繪制for snkaebody in Snake: # 繪制蛇snkaebody.draw()# 顯示中文 準備:在.py同級目錄下新建fonts文件夾,并放入支持中文的字體文件simhei.ttfif isclose: # 顯示游戲失敗信息screen.draw.text("游戲失敗!", (120, HEIGHT/2-100),fontsize=100, fontname='simhei', color='yellow')5、食物的隨機出現
當小蛇頭碰到食物時,不處理,也就是長度+1;青蛙重新在隨機位置出現;
if newSnakeHead.x == food.x and newSnakeHead.y == food.y:food.x = random.randint(5, 20) * TILE_SIZEfood.y = random.randint(5, 20) * TILE_SIZEscore = score + 1 # 得分加16、游戲得分
設置公共變量score,當小蛇吃到食物時,score值加1,更新時屏幕顯示出得分,用如下語句。
screen.draw.text("得分:"+str(score), (100, 20), fontsize=50,fontname='simhei', color='white')總結
這次我們主要制作了貪吃蛇游戲,了解了time模塊的sleep函數、clock模塊的schedule等功能,學習了列表的插入函數、break與continue語句、函數的定義與調用等知識點。讀者可以嘗試在本章代碼的基礎上繼續改進:1.實現得分越來越高,游戲速度越來越快的效果;2.實現蛇頭、蛇身不同顏色的顯示效果;
源碼獲取
可關注博主后,私聊博主免費獲取
需要技術指導,育娃新思考,企業軟件合作等更多服務請聯系博主
今天是以此模板持續更新此育兒專欄的第 29 /50個。
可以關注我,點贊我、評論我、收藏我啦。
總結
以上是生活随笔為你收集整理的学生学python编程---实现贪吃蛇小游戏+源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php环信发送消息,环信即时通讯 ——
- 下一篇: websocket python爬虫_p