Python使用海龟绘图实现贪吃蛇游戏


Posted in Python onJune 18, 2021

在实现贪吃蛇游戏时,首先需要使用python内置的turtle模块来实现创建游戏窗体与键盘按键的监听工作,然后使用freegames模块进行贪吃蛇的绘制工作。

1、turtle模块

turtle模块是python的内置模块,所以在使用前需要使用import导入该模块。代码如下:

import turtle

(1) 创建游戏窗体可以使用turtle模块中的setup()方法来实现。语法格式如下:

turtle.setup(width=_CFG["width"],height=_CFG["height"],startx=_CFG["leftright"],starty=_CFG["topbottom"])

参数说明如下:

  • width:表示窗体的宽度,如果是整数,大小以像素为单位,如果是浮动,则为屏幕的一小部分;默认值为屏幕的50%。
  • height:表示窗体的高度,如果是整数,高度以像素为单位,如果是浮动,则为屏幕的一小部分;默认值为屏幕的75%。
  • startx:表示窗体显示在屏幕的横向位置,如果为正,则以像素为单位从屏幕左边缘开始,如果为负,则从右边缘开始,如果没有,则水平居中窗口。
  • starty:表示窗体显示在屏幕的纵向位置,如果为正,则以像素为单位从屏幕上边缘开始,如果为负,则从下边缘开始,如果没有,则垂直居中窗口。

创建游戏窗体的关键代码如下:

import turtle      # 导入绘图海龟模块
turtle.setup(420, 420)      # 创建窗体大小
turtle.done()       # 停止画笔绘制,但绘图窗体不关闭

(2)通过turtle模块中的onkey()方法可以实现对应键盘中按键的监听工作。语法格式如下:

turtle.onkey(fun,key)

参数说明如下:

  • fun:表示需要执行的方法。
  • key:该参数为字符串,表示键盘中对应的按键,例如“a”或“space”。

注意:在使用onkey()方法实现键盘的监听时,还需要调用turtle.listen()方法即可实现键盘按键的监听。

实现键盘中上、下、左、右按键监听工作的关键代码如下:

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')    # 按键盘下键,蛇向下走

2、freegames模块

freegames模块是第三方模块,所以在使用前需要先通过以下命令进行模块的安装:

pip install freegames

模块安装完成以后,首先需要导入freegames模块中的vector与square函数。代码如下:

from freegames import vector,square  # 导入向量类与绘图函数

(1)通过freegames模块中的vector()类可以根据指定的x、y坐标创建一个二维向量对象。vector()类的语法格式如下:

class freegames.vector(x,y)

参数说明如下:

  • x:表示横向坐标。
  • y:表示纵向坐标。

实现定义游戏中的食物位置、蛇位置以及蛇移动的位置与距离。关键代码如下:

food = vector(0,0)        # 食物
snake = [vector(10, 0)]   # 蛇
position = vector(0, -10) # 移动位置,一步的距离为10

(2)通过freegames模块中square函数可以实现在(x,y)处绘制指定边长大小的正方形,并填充指定颜色。square()函数的语法格式如下:

freegames.square(x,y,size,name)

参数说明如下:

  • x:表示横向坐标。
  • y:表示纵向坐标。
  • size:表示绘制正方形的边长。
  • name:表示填充颜色的名称。

实现绘制游戏中食物、蛇。关键代码如下:

square(body.x, body.y, 9, 'black') # 绘制黑色蛇
square(food.x, food.y, 9, 'green')     # 绘制绿色食物

实例

from random import randrange          # 导入随机函数
from freegames import vector,square  # 导入向量函数与绘图函数
import turtle                         # 导入绘图海龟模块

food = vector(0,0)        # 食物
snake = [vector(10, 0)]   # 蛇
position = vector(0, -10) # 移动位置,一步的距离为10

def change(x, y):        # 改变蛇的移动方向
    position.x = x
    position.y = y

def is_inside(head):        # 判断蛇头是否在窗体内
    return -200 < head.x < 190 and -200 < head.y < 190

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))       # 根据蛇的长度进行加分
        food.x = randrange(-15, 15) * 10  # 随机生成食物x坐标
        food.y = randrange(-15, 15) * 10  # 随机生成食物y坐标
    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()
    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()   # 停止画笔绘制,但绘图窗体不关闭

更多关于python游戏的精彩文章请点击查看以下专题:

python俄罗斯方块游戏集合

python经典小游戏汇总

python微信跳一跳游戏集合

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python调用SQLPlus来操作和解析Oracle数据库的方法
Apr 09 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
python daemon守护进程实现
Aug 27 Python
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
Python实现的科学计算器功能示例
Aug 04 Python
Python容器使用的5个技巧和2个误区总结
Sep 26 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
Dec 03 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
pytorch 求网络模型参数实例
Dec 30 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
Python turtle实现贪吃蛇游戏
python中%格式表达式实例用法
Jun 18 #Python
如何用python清洗文件中的数据
Jun 18 #Python
Python中glob库实现文件名的匹配
python中的装饰器该如何使用
Jun 18 #Python
Python预测分词的实现
学会Python数据可视化必须尝试这7个库
You might like
php基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
微信小程序npm引入vant-weapp的踩坑记录
2019/08/01 Javascript
在Python web中实现验证码图片代码分享
2017/11/09 Python
简单了解python中对象的取反运算符
2019/07/01 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
使用python求解二次规划的问题
2020/02/29 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
美国成衣女装品牌:CHICO’S
2016/09/19 全球购物
家具促销活动方案
2014/02/16 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
工作批评与自我批评范文
2014/10/16 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
电影圆明园观后感
2015/06/03 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python