前言
最近在學習Python3,看了一下語法和基本資料型別,有多年PHP經驗的我感覺難度不是很大,Python作為高級語言,一些資料型別和函式的呼叫和PHP都有幾分類似,大家有興趣可以看看之前記錄的Python基礎的文章,
看了基礎語法,感覺需要通過敲碼來快速熟悉下Python的開發,于是準備從小游戲的方向來,在網上學習了下guliang貪吃蛇的開發和玩法,和一些知識點,準備也來擼一下【貪吃蛇】游戲,
先展示下跑出來的效果:
文末可以獲取原始碼


下面記錄下開發學習程序,
正文
環境
首先要準備開發環境:
系統:windows
Python版本:3.8,從官網下載安裝直接安裝就好,
IDE:pycharm,官網下載
安裝需要的Python庫
pip install pygame
測驗是否安裝成功:
D:\WWW\pythonsty\learn>python
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AM
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> import pygame
pygame 2.0.1 (SDL 2.0.14, Python 3.8.0)
Hello from the pygame community. https://www.pygame.org/contribute.html
>>>
出現上面的輸出,表示已經安裝成功,可以開始擼了,
具體玩法
回車鍵enter:開始比賽
空格:暫停
鍵盤上的方向鍵控制蛇的前進方向
↑ / w : 上
↓ / s : 下
← / a : 左
→ / d : 右
知識點了解
random
隨機函式,random.randint(整數A,整數B),可以生成一個在A B之間的整數
while
回圈,條件滿足時會一直回圈,可以通過break跳出回圈
pygame
pygame.init() — 初始化所有匯入的 pygame 模塊
pygame.display.set_mode() -- 設定界面渲染的視窗大小
pygame.event.get() -- 獲取設備的輸入,這里監控鍵盤的輸入
pygame.draw -- 視窗繪制形狀、線和點
這里用到:pygame.draw.line() -- 畫出網格線
pygame.draw.rect() -- 畫出矩形方塊,用于表示食物和蛇的物體
開發思路
運行流程

具體實作
定義蛇函式,用于生成初始化的蛇
# 初始化蛇
def init_snake():
snake = deque()
snake.append((2, SCOPE_Y[0]))
snake.append((1, SCOPE_Y[0]))
snake.append((0, SCOPE_Y[0]))
print("snake的結構坐標:%s" % snake)
return snake
定義食物,用于食物生成,這里要考慮一個問題,生成食物的時候,只能是在蛇允許活動的范圍內,而且不能是在蛇的身上生成,所以這里要特殊處理下:
def create_food(snake):
#在允許的范圍內隨機生成食物坐標
food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
while (food_x, food_y) in snake:
# 回圈判斷食物是否在蛇的身上,否則需要重新生成
food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
print("food的結構坐標:%s : %s" % (food_x, food_y))
return food_x, food_y
開啟主回圈,監控鍵盤的輸入,并且渲染蛇的移動的影片
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_RETURN:
if game_over:
start = True
game_over = False
b = True
snake = init_snake()
food = create_food(snake)
food_style = get_food_style()
pos = (1, 0)
# 得分
score = 0
last_move_time = time.time()
elif event.key == K_SPACE:
if not game_over:
pause = not pause
elif event.key in (K_w, K_UP):
# 這個判斷是為了防止蛇向上移時按了向下鍵,導致直接 GAME OVER
if b and not pos[1]:
pos = (0, -1)
b = False
elif event.key in (K_s, K_DOWN):
if b and not pos[1]:
pos = (0, 1)
b = False
elif event.key in (K_a, K_LEFT):
if b and not pos[0]:
pos = (-1, 0)
b = False
elif event.key in (K_d, K_RIGHT):
if b and not pos[0]:
pos = (1, 0)
b = False
蛇的移動,首先根據方向來判斷,這里使用pos變數來記錄方向
pos(1, 0) //表示當前蛇向右的方向
pos(-1, 0) //表示當前蛇向左的方向
pos(0, 1) //表示當前蛇向下的方向
pos(0, -1) //表示當前蛇向上的方向
上面的監控鍵盤的按鍵,也是通過改變pos里面的值來改變方向
根據方向,來計算出下一個格子的坐標,此時要判斷坐標是否在食物上,在的話表示吃到食物,需要重置食物坐標,
不在就判斷是否有邊界觸碰而超出邊界,超出游戲就結束
next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])
print("snake 下一步的坐標 %s:%s" % next_s, "snake當前走的方向坐標:%s %s" % (snake[0][0], snake[0][1]))
if next_s == food:
# 吃到了食物
snake.appendleft(next_s)
score += food_style[0]
speed = orispeed - 0.03 * (score // 100)
food = create_food(snake)
food_style = get_food_style()
print("吃到食物,蛇增加一個單位,同時重置食物的坐標為:%s:%s" % food)
else:
if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] \
and next_s not in snake:
snake.appendleft(next_s)
snake.pop()
else:
print("游戲結束:snake 下一步的坐標 %s:%s" % next_s, "走的方向:%s %s" % pos)
game_over = True
使用pygame渲染出網格線,食物和蛇的身體
# 畫食物
if not game_over:
# 避免 GAME OVER 的時候把 GAME OVER 的字給遮住了
pygame.draw.rect(screen, food_style[1], (food[0] * SIZE, food[1] * SIZE, SIZE, SIZE), 0)
# 畫蛇
for s in snake:
pygame.draw.rect(screen, DARK, (s[0] * SIZE + LINE_WIDTH, s[1] * SIZE + LINE_WIDTH,
SIZE - LINE_WIDTH * 2, SIZE - LINE_WIDTH * 2), 0)
最后結果跑起來的效果就如上圖所示,
怎么能控制蛇的速度呢?
其實是控制時間來重繪,我們知道所有的動作都在一個回圈里面完成的,也就是代碼都一直在運行著,
比如我設定速度為1,表示一秒重繪一次,那么蛇的移動也就是一秒一次,我們看到的也是一秒移動一格,
當我們設定速度為0.5,表示0.5秒重繪一次,那我們就看到0.5秒移動一格,速度就相對地看起來快了,
總結
總的來說Python的基礎入門不難,學下資料型別和基礎的語法就可以上手做簡單的專案了,
雖然我有PHP的經驗,但是要學習一門新語言,還是要靠多敲碼,多做專案,才能慢慢地掌握一門語言,在做專案的程序中,慢慢地接觸不同的場景,需要使用不同的函式,慢慢地熟悉和掌握,
當然要想深入了解Python,還是要下功夫,
右上角掃碼關注,回復【貪吃蛇】獲取原始碼,一起學習,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/250039.html
標籤:Python
