Python小游戏:贪吃蛇——turtle的使用

  

突然想把去年写的小游戏练习整合一下,写一个简单的教学文章吧。

该篇主要讲解利用python中turtle包制作小游戏,不涉及pygame的使用,仅用pycharm就可实现

0.理清游戏思路

  要实现的效果如下图所示:

黑色是蛇,红色利用随机函数生成的苹果,蛇没吃到一个苹果,就会增一节,同时下一个苹果随机生成在框内。

蛇的运动通过刷新页面来表示,每刷新一次,画图函数会在蛇头位置多画一个小方格,并删除蛇尾位置的小方格。以此来实现蛇的运动。

蛇不可撞到边框,否则游戏失败(停止运行)。

其中,蛇和苹果利用海龟画图(turtle)实现。

1.turtle库

turtle是python自带的一个库,主要用于画图。(据说是像海龟爬图?

turtle库中自带许多画图函数:(这里只列举贪吃蛇所用到的部分函数)

up()起笔函数
goto(x,y)去到(x,y)位置的函数
forward(size)朝特定方向走,参数表示画线的长度
left(size)转向函数,参数为调转度数(蛇每次调转90度,则填90)
begin_fill()无参,开始绘图(落笔)
end_fill()无参,绘图结束
color(color_name)设置线条颜色,括号内填写颜色名称

因为该"画图"动作需要循环调用,因此可以写一个函数将该功能包裹起来,以方便多次循环使用。

该部分代码:

from turtle import *
from random import randrange

                        #注意导包,(以下需要用到随机函数,所以也要导包随机函数)

def square(x,y,size,color_name):  #函数名称可自定义,参数:需要用的什么就设置什么
    up()
    goto(x,y)                     #画笔移动到某一点
    color(color_name)             #设置画笔颜色
    begin_fill()                  #落笔开画

    forward(size)                 #画笔画直线
    left(90)                      #转向90度        以下代码段表示每次画一个小方格
    forward(size)
    left(90)
    forward(size)
    left(90)
    forward(size)
    left(90)
    end_fill()                    #绘图结束

2.定义小蛇和苹果

蛇的初始长度肯定不能是一个小方格吧

这里我的初始小蛇定义了四个小方格的长度,每个小方格为10;(可自定义,提示:最好为整数,避免蛇头与苹果”对不上“的情况出现。)

snack=[[0,0],[10,0],[20,0],[30,0]]
apple_x=randrange(-20,20)*10          #定义小苹果,和苹果的位置坐标
apple_y=randrange(-20,20)*10
aim_x=0
aim_y=10                              #蛇的起始位置坐标

定义动作函数

def change(x,y):
    global aim_x,aim_y
    aim_x=x
    aim_y=y

3.”撞墙“的判断

先贴一下我的代码段

def inside():
    if -210<=snack[-1][0]<=200 and -210<=snack[-1][1]<210 :
        return True
    else:
        return False

inside函数判断小蛇是否在画布内,即是否撞墙。

这里我把画布的大小设置为420*420(210是均分坐标,从-210到+210)。因为蛇的每一节身子长度为10,所以判断条件为小蛇头部是否小于等于200的大小,小于返回true,可以继续运行,否则false,结束运行。

4.函数循环使用

相当于是把上述函数嵌套在一个新的Loop函数内了,以方便于每刷新一次就调用一次Loop。

clear()和update()连用——刷新:擦除旧的线,画上新的线。

def gameLoop ():                         #自定义循环函数
    global apple_x,apple_y               #需要用到外面的全局变量
    clear()                              #擦除旧图的函数,清理函数
    snack.append([snack[-1][0]+aim_x,snack[-1][1]+aim_y])    #小蛇的出现位置
    if not inside():                                         #判断是否还在画布内
        return
    if snack[-1][0]!=apple_x or snack[-1][1]!=apple_y :
        snack.pop(0)                           #判断小蛇安全前行,擦除尾部,使用pop函数删除
    else:
        apple_x=randrange(-20,20)*10           #吃到苹果,则随机生成另一个新的苹果
        apple_y=randrange(-20,20)*10
    for n in range(len(snack)):
        square(snack[n][0],snack[n][1],10,"black")    #调用画图函数,定义黑色小蛇,红色苹果
    square(apple_x,apple_y,10,"red")
    ontimer(gameLoop,200)                            #调用循环函数,每隔一段时间调用一次
    update()                                         #更新

5.收尾:设置画布、隐藏海龟画图小箭头、监听函数的使用、以及键盘操控

注意:setup(420,420,0,0)意为设置一个420*420大小的平面画布,先前210是正向坐标!! 

setup(420,420,0,0)        #设置画布
hideturtle()              #隐藏海龟画图的小标签,为了美观
tracer(False)             #不显示轨迹路线
listen()                  #监听函数
onkey(lambda :change(0,10),"w")      #键盘操控,点击相应案件实现改变方向操作
onkey(lambda :change(0,-10),"s")
onkey(lambda :change(10,0),"d")
onkey(lambda :change(-10,0),"a")
gameLoop()                            #循环函数
done()                                

———————————————————————————————————————————

来一个代码整合:

from turtle import *
from random import randrange

def square(x,y,size,color_name):
    up()
    goto(x,y)
    color(color_name)
    begin_fill()

    forward(size)
    left(90)
    forward(size)
    left(90)
    forward(size)
    left(90)
    forward(size)
    left(90)
    end_fill()

snack=[[0,0],[10,0],[20,0],[30,0]]
apple_x=randrange(-20,20)*10
apple_y=randrange(-20,20)*10
aim_x=0
aim_y=10
def change(x,y):
    global aim_x,aim_y
    aim_x=x
    aim_y=y
def inside():
    if -210<=snack[-1][0]<=200 and -210<=snack[-1][1]<210 :
        return True
    else:
        return False
def gameLoop ():
    global apple_x,apple_y
    clear()
    snack.append([snack[-1][0]+aim_x,snack[-1][1]+aim_y])
    if not inside():
        return
    if snack[-1][0]!=apple_x or snack[-1][1]!=apple_y :
        snack.pop(0)
    else:
        apple_x=randrange(-20,20)*10
        apple_y=randrange(-20,20)*10
    for n in range(len(snack)):
        square(snack[n][0],snack[n][1],10,"black")
    square(apple_x,apple_y,10,"red")
    ontimer(gameLoop,200)
    update()

setup(420,420,0,0)
hideturtle()
tracer(False)
listen()
onkey(lambda :change(0,10),"w")
onkey(lambda :change(0,-10),"s")
onkey(lambda :change(10,0),"d")
onkey(lambda :change(-10,0),"a")
gameLoop()
done()

 

 

 

  • 13
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
游戏原理: 贪吃蛇是一款经典的游戏,游戏中的玩家需要操控一条蛇去吃食物,同时避免撞到游戏界面的边缘或者自己的身体。每吃到一块食物,蛇的身体就会变长一截,游戏难度也会逐渐加大。当蛇头和蛇身相撞或者撞到边缘时,游戏结束。 代码实现: 下面是一个简单的贪吃蛇游戏实现,使用 PythonPygame 库实现,具体代码如下: ```python import pygame import random # 初始化 Pygame pygame.init() # 定义常量 SCREEN_WIDTH = 480 SCREEN_HEIGHT = 480 CELL_SIZE = 20 CELL_WIDTH = SCREEN_WIDTH // CELL_SIZE CELL_HEIGHT = SCREEN_HEIGHT // CELL_SIZE UP = (0, -1) DOWN = (0, 1) LEFT = (-1, 0) RIGHT = (1, 0) FPS = 10 # 定义颜色 BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) # 创建游戏窗口 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('Snake Game') # 定义贪吃蛇类 class Snake: def __init__(self): self.body = [(CELL_WIDTH // 2, CELL_HEIGHT // 2)] self.direction = random.choice([UP, DOWN, LEFT, RIGHT]) # 移动 def move(self): head = self.body[0] x, y = self.direction new_head = (head[0] + x, head[1] + y) self.body.insert(0, new_head) self.body.pop() # 改变方向 def change_direction(self, direction): if direction[0] + self.direction[0] != 0 and direction[1] + self.direction[1] != 0: self.direction = direction # 吃食物 def eat_food(self): head = self.body[0] x, y = self.direction new_head = (head[0] + x, head[1] + y) self.body.insert(0, new_head) # 判断是否撞到自己或者墙壁 def is_dead(self): head = self.body[0] if head[0] < 0 or head[0] >= CELL_WIDTH or head[1] < 0 or head[1] >= CELL_HEIGHT: return True for i in range(1, len(self.body)): if head == self.body[i]: return True return False # 定义食物类 class Food: def __init__(self): self.position = self.generate_position() # 生成位置 def generate_position(self): x = random.randint(0, CELL_WIDTH - 1) y = random.randint(0, CELL_HEIGHT - 1) return (x, y) # 重新生成位置 def regenerate_position(self): self.position = self.generate_position() # 绘制网格 def draw_grid(): for x in range(0, SCREEN_WIDTH, CELL_SIZE): pygame.draw.line(screen, BLACK, (x, 0), (x, SCREEN_HEIGHT)) for y in range(0, SCREEN_HEIGHT, CELL_SIZE): pygame.draw.line(screen, BLACK, (0, y), (SCREEN_WIDTH, y)) # 绘制贪吃蛇 def draw_snake(snake): for cell in snake.body: x, y = cell pygame.draw.rect(screen, WHITE, (x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE)) # 绘制食物 def draw_food(food): x, y = food.position pygame.draw.rect(screen, RED, (x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE)) # 主函数 def main(): # 创建贪吃蛇和食物 snake = Snake() food = Food() # 创建时钟 clock = pygame.time.Clock() # 游戏循环 while True: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: snake.change_direction(UP) elif event.key == pygame.K_DOWN: snake.change_direction(DOWN) elif event.key == pygame.K_LEFT: snake.change_direction(LEFT) elif event.key == pygame.K_RIGHT: snake.change_direction(RIGHT) # 移动贪吃蛇 snake.move() # 判断是否吃到食物 if snake.body[0] == food.position: snake.eat_food() food.regenerate_position() # 绘制游戏界面 screen.fill(BLACK) draw_grid() draw_snake(snake) draw_food(food) pygame.display.update() # 判断游戏是否结束 if snake.is_dead(): pygame.quit() exit() # 控制游戏帧率 clock.tick(FPS) if __name__ == '__main__': main() ``` 运行代码后,即可开始游戏。通过方向键控制贪吃蛇的移动,吃到食物后贪吃蛇的身体会变长,撞到自己或者墙壁就会游戏结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值