【玩转Python】DIY贪吃蛇游戏复盘

本篇推文共计2000个字,阅读时间约3分钟。

01

项目描述

项目描述:

贪吃蛇是一款比较经典的游戏,相信很多朋友们在自己手机上都玩过。

 

贪吃蛇通过“上”,“下”,“左”,“右”四个方向来控制蛇的移动,贪吃蛇每吃到一个食物,身体长度就会增长一次,当蛇撞到墙壁或者自己身体的时候,游戏就会结束。

 

本文基于Python,进行贪吃蛇游戏demo复盘。

02

项目配置

  • Python3.x

  • turtle库

  • freegames库

  • random库

turtle库:创建游戏窗体与键盘按键的监听工作。

freegames库:贪吃蛇的绘制工作

random库:导入随机函数进行随机坐标的生成工作

03

项目流程

在该贪吃蛇项目中,设计需要由整体到细节,

1.首先定义游戏窗体。

2.定义完游戏窗体后需要定义游戏的几个关键元素:

  • 食物

  • 移动距离

 

3.然后定义元素之间的关联关系:

  • 不断移动的蛇

  • 随机出现的食物

  • 蛇吃了食物后就会增长

  • 蛇碰到墙或者自己的身体,游戏就会结束

 

基于以上分析开始建立游戏demo

导入游戏需要使用的模块,函数与类。

from random import randrange
from freegames import vector,square
import turtle

定义游戏中蛇,食物,移动距离等元素的位置坐标。

food=vector(0,0)
snake=[vector(10,0)]
position=vector(0,-10)

定义change()函数,用于改变蛇的移动方向。

def change(x,y):
    position.x=x
    position.y=y

定义is_inside()函数,判断蛇头是否在窗体内。

def is_inside(head):
    return -200 < head.x <190 and -200 < head.y < 190

定义move()函数,用于实现蛇的移动以及判断蛇是否吃到食物。

实现蛇的移动,判断蛇是否吃到食物
def move():
    #确定蛇头的位置
    head = snake[-1].copy()
    
    #移动一步
    head.move(position)
    
    #判断蛇的头部是否在边缘或者蛇的身体中
    if not is_inside(head) or head in snake:
        
        #如果在,判断成立,绘制蛇头颜色,说明游戏结束
        square(head.x,head.y,9,'red')
        turtle.update()
        return
    
    #更新蛇的位置
    snake.append(head)
    
    #如果蛇吃到食物
    if head==food:
        
        #每吃到一次记录下的蛇的长度,同时也相当于游戏的得分

        print('Snake:',len(snake))
        
        #随机生成下一个食物元素x,y的坐标
        food.x == randrange(-15, 15) * 10
        food.y == randrange(-15, 15) * 10

    else:
        #清除蛇走过的坐标
        snake.pop(0)
    
    #清空蛇走过的位置
    turtle.clear()
    
    #循环遍历蛇的坐标
    for body in snake:
        
        #绘制黑色的蛇
        square(body.x,body.y,9,'black')
        
    #绘制绿色食物
    square(food.x,food.y,9,'green')

    turtle.update()
    
    #定时不断执行move函数,直到蛇碰到窗体边缘或者自己身体,函数中断,游戏中断
    turtle.ontimer(move,100)

创建程序入口,如设置程序的窗口大小。

使用move()函数实现蛇的移动效果,用按键监听实现控制蛇的移动方向。

if __name__ == '__main__':

    #定义窗体
    turtle.setup(420,420,370,0)
    turtle.hideturtle()
    turtle.tracer(False)

    #调用定义的函数
    move()

    #事件监听器
    turtle.listen()

    #监听键盘的“上”,“下”,“左”,“右”事件
    turtle.onkey(lambda: change(10,0),'Right')
    turtle.onkey(lambda: change(-10, 0), 'Left')
    turtle.onkey(lambda: change(0, 10), 'Up')
    turtle.onkey(lambda: change(0, -10), 'Down')
    turtle.done()

04

项目演示

往期回顾

【年终总结】你好2021,再见2020。


【快速写好毕业论文】你不得不知晓的七个常用文献搜索平台

【秋招纪实录】一篇特别正经的【腾讯】求职经验分享

【一天一道Leetcode】回文字符串-最少分割次数

【一天一道Leetcode】合并两个有序链表

【一天一道Leetcode】套信封问题

☆ END ☆

你与世界

只差一个

公众号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值