```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()