在实现贪吃蛇游戏时,首先需要使用python内置的turtle模块来实现创建游戏窗体与键盘按键的监听工作,然后使用freegames模块进行贪吃蛇的绘制工作。
1、turtle模块
turtle模块是python的内置模块,所以在使用前需要使用import导入该模块。代码如下:
1
|
import turtle
|
(1) 创建游戏窗体可以使用turtle模块中的setup()方法来实现。语法格式如下:
1
|
turtle.setup(width = _CFG[ "width" ],height = _CFG[ "height" ],startx = _CFG[ "leftright" ],starty = _CFG[ "topbottom" ])
|
参数说明如下:
- width:表示窗体的宽度,如果是整数,大小以像素为单位,如果是浮动,则为屏幕的一小部分;默认值为屏幕的50%。
- height:表示窗体的高度,如果是整数,高度以像素为单位,如果是浮动,则为屏幕的一小部分;默认值为屏幕的75%。
- startx:表示窗体显示在屏幕的横向位置,如果为正,则以像素为单位从屏幕左边缘开始,如果为负,则从右边缘开始,如果没有,则水平居中窗口。
- starty:表示窗体显示在屏幕的纵向位置,如果为正,则以像素为单位从屏幕上边缘开始,如果为负,则从下边缘开始,如果没有,则垂直居中窗口。
创建游戏窗体的关键代码如下:
1
2
3
|
import turtle # 导入绘图海龟模块
turtle.setup( 420 , 420 ) # 创建窗体大小
turtle.done() # 停止画笔绘制,但绘图窗体不关闭
|
(2)通过turtle模块中的onkey()方法可以实现对应键盘中按键的监听工作。语法格式如下:
1
|
turtle.onkey(fun,key)
|
参数说明如下:
- fun:表示需要执行的方法。
- key:该参数为字符串,表示键盘中对应的按键,例如“a”或“space”。
注意:在使用onkey()方法实现键盘的监听时,还需要调用turtle.listen()方法即可实现键盘按键的监听。
实现键盘中上、下、左、右按键监听工作的关键代码如下:
1
2
3
4
5
|
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模块是第三方模块,所以在使用前需要先通过以下命令进行模块的安装:
1
|
pip install freegames
|
模块安装完成以后,首先需要导入freegames模块中的vector与square函数。代码如下:
1
|
from freegames import vector,square # 导入向量类与绘图函数
|
(1)通过freegames模块中的vector()类可以根据指定的x、y坐标创建一个二维向量对象。vector()类的语法格式如下:
1
|
class freegames.vector(x,y)
|
参数说明如下:
- x:表示横向坐标。
- y:表示纵向坐标。
实现定义游戏中的食物位置、蛇位置以及蛇移动的位置与距离。关键代码如下:
1
2
3
|
food = vector( 0 , 0 ) # 食物
snake = [vector( 10 , 0 )] # 蛇
position = vector( 0 , - 10 ) # 移动位置,一步的距离为10
|
(2)通过freegames模块中square函数可以实现在(x,y)处绘制指定边长大小的正方形,并填充指定颜色。square()函数的语法格式如下:
1
|
freegames.square(x,y,size,name)
|
参数说明如下:
- x:表示横向坐标。
- y:表示纵向坐标。
- size:表示绘制正方形的边长。
- name:表示填充颜色的名称。
实现绘制游戏中食物、蛇。关键代码如下:
1
2
|
square(body.x, body.y, 9 , 'black' ) # 绘制黑色蛇
square(food.x, food.y, 9 , 'green' ) # 绘制绿色食物
|
实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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() # 停止画笔绘制,但绘图窗体不关闭
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/Yuyu920716/article/details/111713668