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实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
python 读写中文json的实例详解
Oct 29 Python
django实现登录时候输入密码错误5次锁定用户十分钟
Nov 05 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
简单实现python数独游戏
Mar 30 Python
PyCharm代码回滚,恢复历史版本的解决方法
Oct 22 Python
Python实现八皇后问题示例代码
Dec 09 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 Python
python实现图片中文字分割效果
Jul 22 Python
python os模块常用的29种方法使用详解
Jun 02 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 Python
Python turtle实现贪吃蛇游戏
python中%格式表达式实例用法
Jun 18 #Python
如何用python清洗文件中的数据
Jun 18 #Python
Python中glob库实现文件名的匹配
python中的装饰器该如何使用
Jun 18 #Python
Python预测分词的实现
学会Python数据可视化必须尝试这7个库
You might like
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
Javascript学习笔记1 数据类型
2010/01/11 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
js面向对象的写法
2016/02/19 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
2021/02/25 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
python通过floor函数舍弃小数位的方法
2015/03/17 Python
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
连接Python程序与MySQL的教程
2015/04/29 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
快速了解Python相对导入
2018/01/12 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
有兼职工作经历的简历自我评价
2014/03/07 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
教师节晚会主持词
2015/06/30 职场文书
用Python实现Newton插值法
2021/04/17 Python
Redis基本数据类型Set常用操作命令
2022/06/01 Redis
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL