snake游戏


```python
# -*- coding:utf-8 -*-
# author:00张三
# datetime:2022/5/7 9:52
# software: PyCharm
# python3.9

'''
 所完成的任务:
 任务1
 任务2
 任务3
'''

# 导入相关的库
# PySimpleGUI需要自己安装
import PySimpleGUI as sg
from time import time
from random import randint

# 将像素点,放大到一个cell大小
def convert_pos_to_pixel(cell):
    tl = cell[0] * CELL_SIZE, cell[1] * CELL_SIZE
    br = tl[0] + CELL_SIZE, tl[1] + CELL_SIZE
    return tl, br

# 在界面中随机生成苹果的位置,返回一个元组类型对象
def place_apple():
    apple_pos = randint(0, CELL_NUM - 1), randint(0, CELL_NUM - 1)
    while apple_pos in snake_body:
        apple_pos = randint(0, CELL_NUM - 1), randint(0, CELL_NUM - 1)
    return apple_pos


# 界面的大小
# cell的个数
# 每个cell占用多少个像素点
FIELD_SIZE = 400
CELL_NUM = 10
CELL_SIZE = FIELD_SIZE / CELL_NUM

# 贪吃蛇的初始位置
# 定义上下左右四个方向
snake_body = [(4, 4), (3, 4), (2, 4)]
DIRECTIONS = {'left': (-1, 0), 'right': (1, 0), 'up': (0, 1), 'down': (0, -1)}

# 贪吃蛇初始的默认方向
direction = DIRECTIONS['up']

# 调用生成一个苹果位置的方法
apple_pos = place_apple()

# 初始时,苹果没有被吃
apple_eaten = False

# 设置界面相关的参数
sg.theme('Green')
field = sg.Graph(
    canvas_size=(FIELD_SIZE, FIELD_SIZE),
    graph_bottom_left=(0, 0),
    graph_top_right=(FIELD_SIZE, FIELD_SIZE),
    background_color='black')
layout = [[field]]

window = sg.Window('00张三', layout, return_keyboard_events=True)

# 定义一个开始时间为启动游戏的时间
start_time = time()


while True:
    # 检测键盘鼠标事件
    event, values = window.read(timeout=10)
    # 点击窗口的x号关闭游戏
    if event == sg.WIN_CLOSED: break
    # 如果按下键盘的方向左键,将贪吃蛇移动的方向改为左
    if event == 'Left:37': direction = DIRECTIONS['left']
    if event == 'Up:38': direction = DIRECTIONS['up']
    if event == 'Right:39': direction = DIRECTIONS['right']
    if event == 'Down:40': direction = DIRECTIONS['down']

    # 定义一个时间间隔,即程序刚开始运行到运行到此处的时间
    time_since_start = time() - start_time

    # 等待,如果上述的时间间隔大于0.5,则执行下面的程序,否则停下等待
    if time_since_start >= 0.5:
        start_time = time()

        # 判断贪吃蛇的头是否于苹果重合,如果重合即为吃到苹果
        if snake_body[0] == apple_pos:
            apple_pos = place_apple()
            apple_eaten = True

        # 贪吃蛇的移动,新的蛇头为 当前蛇头向direction方位移动一格的位置,这时原来的蛇头会变成 蛇头的后一格.
        new_head = (
        snake_body[0][0] + direction[0], snake_body[0][1] + direction[1])
        snake_body.insert(0, new_head)

        # 如果苹果没有被吃,蛇不会边长,但上面插入了新的蛇头,为了保持长度,蛇尾巴要弹出,
        # 如果被吃了,则让贪吃蛇变成一格,不弹出它的尾巴
        if not apple_eaten:
            snake_body.pop()
        apple_eaten = False

        # check death
        if not 0 <= snake_body[0][0] <= CELL_NUM - 1 or \
                not 0 <= snake_body[0][1] <= CELL_NUM - 1 or \
                snake_body[0] in snake_body[1:]:
            break

        field.DrawRectangle((0, 0), (FIELD_SIZE, FIELD_SIZE), 'black')

        tl, br = convert_pos_to_pixel(apple_pos)
        field.DrawRectangle(tl, br, 'red')
        # draw snake
        for index, part in enumerate(snake_body):
            tl, br = convert_pos_to_pixel(part)
            color = 'yellow' if index == 0 else 'green'
            field.DrawRectangle(tl, br, color)

window.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值