2021-06-04

python贪吃蛇代码

import turtle as t
import random

WIN_WIDTH = 500  # 窗口宽度
WIN_HEIGHT = 500  # 窗口高度
SPOT_WIDTH = 10  # 贪吃蛇的宽度(方格的宽度)
isPause = False  # 是否暂停


# 定义贪吃蛇类
class HungrySnake(object):
    """docstring for HungrySnake"""
    x_add = SPOT_WIDTH  # 贪吃蛇x坐标增量,改变移动方向
    y_add = 0  # 贪吃蛇y坐标增量
    # 贪吃蛇坐标初始化,长度为六格
    snakePos = [(0, 0), (SPOT_WIDTH, 0), (SPOT_WIDTH * 2, 0), \
                (SPOT_WIDTH * 3, 0), (SPOT_WIDTH * 4, 0), (SPOT_WIDTH * 5, 0)]
    speed = 1  # 速度
    eatNum = 0  # 吃了几个苹果

    # 苹果x坐标(-25,23)*10
    x_apple = random.randint(int(-1 * WIN_WIDTH / 20), int(WIN_WIDTH / 20 - 2)) * 10
    # 苹果y坐标(-23,25)*10
    y_apple = random.randint(int(-1 * WIN_WIDTH / 20 + 2), int(WIN_WIDTH / 20)) * 10

    # turtle颜色库
    COLOR = ('black', 'grey', 'brown', 'orange', 'gold', 'olive', 'tomato', 'yellowgreen', 'lightgreen', \
             'green', 'aquamarine', 'teal', 'deepskyblue', 'blue', 'violet', 'purple', 'pink', 'fuchsia')
    # 贪吃蛇的颜色
    snakeColor = "black"

    # 构造函数,不用
    def __init__(self):
        super(HungrySnake, self).__init__()

    # 画方格,(x,y)为坐标,width为宽度,color为颜色
    def drawSpot(self, x, y, width, color):
        t.penup()
        t.goto(x, y)
        t.pendown()
        t.color(color)  # 设定填充颜色
        t.begin_fill()  # 申明开始填充
        for i in range(4):
            t.forward(SPOT_WIDTH)
            t.right(90)
        t.end_fill()  # 申明结束填充
        t.penup()

    # 画贪吃蛇
    def drawSnake(self, color="black"):
        for spot in self.snakePos:
            self.drawSpot(spot[0], spot[1], SPOT_WIDTH, color)

    # 贪吃蛇移动一步
    def moveStep(self):
        self.snakePos.pop(0)  # 去掉尾
        self.snakePos.append((self.snakePos[-1][0] + self.x_add, self.snakePos[-1][1] + self.y_add))
    def changeDirection(self, x_add, y_add):
        HungrySnake.x_add = x_add
        HungrySnake.y_add = y_add
    def isCrash(self):
        if self.snakePos[-1][0] < int(-1 * WIN_WIDTH / 20) * 10 or self.snakePos[-1][0] > int(
                WIN_WIDTH / 20 - 2) * 10 or \
                self.snakePos[-1][1] < int(-1 * WIN_WIDTH / 20 + 2) * 10 or self.snakePos[-1][1] > int(
            WIN_WIDTH / 20) * 10:
            return True
        elif self.snakePos[-1] in self.snakePos[:-1]:
            return True
        else:  # 啥也没撞到
            return False
    def generateApple(self):
        x_apple = random.randint(int(-1 * WIN_WIDTH / 20), int(WIN_WIDTH / 20 - 2)) * 10
        y_apple = random.randint(int(-1 * WIN_WIDTH / 20 + 2), int(WIN_WIDTH / 20)) * 10
        HungrySnake.x_apple = x_apple
        HungrySnake.y_apple = y_apple
        return (x_apple, y_apple)
    def eatApple(self):
        self.snakePos.append(self.snakePos[-1])
        HungrySnake.eatNum += 1  # 苹果数量加1
        HungrySnake.speed = 1 + 0.5 * (HungrySnake.eatNum // 5)  # 每吃5个提速一次
        if HungrySnake.eatNum % 1 == 0:  # 每吃5个改变一次颜色
            HungrySnake.snakeColor = random.choice(HungrySnake.COLOR)
    def showApple(self):
        if self.snakePos[-1] == (HungrySnake.x_apple, HungrySnake.y_apple):
            self.eatApple()
            self.generateApple()
        else:
            self.drawSpot(HungrySnake.x_apple, HungrySnake.y_apple, SPOT_WIDTH, "red")
        print("apple:{}".format((HungrySnake.x_apple, HungrySnake.y_apple)))
def showMsg():
    t.pencolor("gray")
    t.goto(-115, 120)
    t.write("空格键:暂停/开始", font=("Arial", 16, 'normal'))
    t.goto(-115, 90)
    t.write("回车键:再玩一次!", font=("Arial", 16, 'normal'))
    t.goto(-60, 60)
    t.write("得分:{}".format(HungrySnake.eatNum), font=("Arial", 16, 'normal'))
def game_loop():
    t.clear()  # 清除屏幕
    snake = HungrySnake()  # 实例化
    snake.showApple()  # 显示苹果
    snake.drawSnake(snake.snakeColor)  # 画贪吃蛇
    snake.moveStep()
    print("snake:{}".format(snake.snakePos))  # 打印贪吃蛇坐标
    print("direction:{}".format((snake.x_add, snake.y_add)))  # 前进方向
    print("crash:{}".format(snake.isCrash()))  # 打印是否撞到
    print("eatnum:{}".format(snake.eatNum))
    print("speed:{}".format(snake.speed))
    if not snake.isCrash() and not isPause:
        t.ontimer(game_loop, int(200 / snake.speed))
    elif snake.isCrash():
        snake.drawSpot(snake.snakePos[-2][0], snake.snakePos[-2][1], SPOT_WIDTH, "red")
        showMsg()  # 显示信息
        t.done()  # 开始事件循环 - 调用 Tkinter 的 mainloop 函数
    else:
        pass
def setPause():
    if not HungrySnake().isCrash():
        global isPause
        isPause = not isPause
        print("isPause:{}".format(isPause))
        game_loop()
def restart():
    if HungrySnake().isCrash():
        HungrySnake.x_add = SPOT_WIDTH
        HungrySnake.y_add = 0
        HungrySnake.snakePos = [(0, 0), (SPOT_WIDTH, 0), (SPOT_WIDTH * 2, 0), \
                                (SPOT_WIDTH * 3, 0), (SPOT_WIDTH * 4, 0), (SPOT_WIDTH * 5, 0)]
        HungrySnake.speed = 1
        HungrySnake.eatNum = 0
        HungrySnake.snakeColor = "black"
        HungrySnake().generateApple()
        game_loop()
def main():
    t.setup(WIN_WIDTH, WIN_HEIGHT)  # 设置窗口大小
    t.title("贪吃蛇")  # 窗口标题
    t.hideturtle()  # 隐藏海龟
    t.tracer(False)  # 启用/禁用海龟动画并设置刷新图形的延迟时间
    t.listen()
    t.onkeypress(lambda: HungrySnake().changeDirection((-1) * SPOT_WIDTH, 0), 'Left')  # 左
    t.onkeypress(lambda: HungrySnake().changeDirection(SPOT_WIDTH, 0), 'Right')  # 右
    t.onkeypress(lambda: HungrySnake().changeDirection(0, SPOT_WIDTH), 'Up')  # 上
    t.onkeypress(lambda: HungrySnake().changeDirection(0, (-1) * SPOT_WIDTH), 'Down')  # 下
    t.onkeypress(lambda: setPause(), 'space')  # 空格,暂停游戏
    t.onkeypress(lambda: restart(), 'Return')  # 回车,重新游戏
    game_loop()  # 进入游戏主循环
    t.done()  # 开始事件循环 - 调用 Tkinter 的 mainloop 函数
if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值