100行系列-Python貪吃蛇小遊戲

今天來嘗試下用python寫一個貪吃小遊戲,哈哈哈哈,畢竟貪吃蛇,大家小時候都玩過,但現在卻有機會自己實現一個!!!

視頻:Python100行系列-貪吃蛇小遊戲_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili

原文:https://hzeyuan.cn/

效果圖

在這裏插入圖片描述

下面是學習的過程啦!

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.結尾

這樣我們就我完成了一個簡單的貪吃蛇的遊戲啦,我們還可以調成速度,記錄分數,還有更多的功能,大家可以自行添加。

發佈了64 篇原創文章 · 獲贊 30 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章