今天來嘗試下用python寫一個貪吃小遊戲,哈哈哈哈,畢竟貪吃蛇,大家小時候都玩過,但現在卻有機會自己實現一個!!!
效果圖
下面是學習的過程啦!
1.如何畫turtle畫一個正方形?
其實就是一個點,往右,往下,往左,往上,回到原點…
# 座標,長度,顏色名稱
def square(x, y, size, name):
import turtle
turtle.up()
turtle.goto(x, y)
turtle.down()
turtle.color(name)
turtle.begin_fill()
for count in range(4):
turtle.forward(size)
turtle.left(90)
turtle.end_fill()
然後我們就可以畫出一個正方啦。
2.畫出多個連續的正方形,來模擬蛇的身子。
蛇的身子其實就是一個一個方塊列表,所以我們來嘗試畫多個方塊。
snake = [[0,0],[0,10]]
for body in snake:
square(body[0], body[1], 10, 'black')
3.那我們如何模擬蛇的移動呢?
3.1蛇需要可以朝四個方向移動。
x,y代表座標
(10,0):代表向右移動
(-10,0):代表想左移動
(0,10):代表向上移動
(0,-10):代表向下移動
aim = [0, 10]
# 設置方向
def change_direction(x, y):
aim[0] = x
aim[1] = y
3.2有了移動方向,我們就可以開始寫移動的邏輯啦
思路是這樣的:我們把列表看成一條蛇,這條蛇的右邊在右邊,尾部在左邊!
- 移動時,我們消除尾部的一個方塊。
- 根據方向,在頭部添加一個方塊。
- 然後在刷新動畫。
- 就可以完成蛇移動的效果啦。
下面是代碼
import copy
def snake_move():
head = copy.deepcopy(snake[-1]) # 深度拷貝一份頭部的方塊
head = [head[0] + aim[0], head[1] + aim[1]] # 頭部的方塊,朝一方向移動
snake.append(head) # 蛇的頭部添加這個新的方塊
snake.pop(0) # 蛇的尾部,去除一個方塊
turtle.clear()# 清除方塊
# 重新畫一遍蛇的整個身子
for body in snake:
square(body[0], body[1], 10, 'black')
turtle.update()# 更新動畫
turtle.ontimer(snake_move, 300)
turtle.hideturtle()
turtle.tracer(False)
3.3現在蛇就可以移動啦,但是我們還不能控制它的方向!
我們來監聽鍵盤的按鍵,用上下左右來控制蛇的移動!
turtle.listen()
turtle.onkey(lambda: change_direction(10, 0), "Right") # 右
turtle.onkey(lambda: change_direction(-10, 0), "Left") # 左
turtle.onkey(lambda: change_direction(0, 10), "Up") # 上
turtle.onkey(lambda: change_direction(0, -10), "Down") # 下
4.設置隨機產生食物
首先一個食物被吃掉時,我們就在一個指定的區間裏,隨機產生食物。
if head == food: # 如果蛇頭吃到了食物,我們就不刪除蛇的尾巴最後一個方塊
print("snake的長度", len(snake))
food[0] = randrange(-15, 15)*10 # 設置食物的區間,必須是10的倍數
food[1] = randrange(-15, 15)*10
else:
snake.pop(0) # 蛇的尾部,去除一個方塊
5.設置邊界條件
當蛇碰到自己或者當蛇碰到邊界的時候,我們就算輸啦!!
# 先給屏幕設定一個初始值500*500
turtle.setup(500, 500)
# 設置邊界條件判斷
def inside(head):
return -250 < head[0] < 250 and -250 < head[1] < 250
# 在蛇移動的過程中進行判斷,如果發生碰撞我們就把頭部標記爲紅色,結束遊戲。
if head in snake or not inside(head):
print(head)
square(head[0], head[1], 10, 'red')
turtle.update()
6.結尾
這樣我們就我完成了一個簡單的貪吃蛇的遊戲啦,我們還可以調成速度,記錄分數,還有更多的功能,大家可以自行添加。