记一次,自己使用Pygame写的贪吃蛇游戏
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
from sys import exit
from random import randint
size = width, height = 640, 480 # 窗口大小
snake_size = 20 # 蛇身大小
snake_head_color = 255, 0, 255 # 蛇头的颜色
snake_color = 0, 0, 255 # 蛇身的颜色
food_color = 255, 0, 0 # 食物的颜色
background_color = 255, 255, 255 # 背景颜色
line_color = 200, 200, 200 # 边框线颜色
direction = {K_UP: (0, -1), K_DOWN: (0, 1),
K_LEFT:(-1, 0), K_RIGHT:(1, 0)} # 上下左右的方向
snake_direction = K_UP # 蛇移动的方向,默认向上移动
quit = False # 是否退出
pause = False # 是否暂停
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption('贪吃蛇')
food = (0, 0) # 食物坐标
snake = [((width // snake_size) // 2, ((height // snake_size) // 2) - 1)] # 蛇
snake.append((snake[0][0], snake[0][1] + 1))
snake.append((snake[1][0], snake[1][1] + 1))
clock = pygame.time.Clock()
time = 0
FPS = 30
def get_food():
food = snake[0]
while food in snake:
food = randint(0, (width // snake_size) - 1), randint(0, (height // snake_size) - 1)
return food
def draw_rect(color, point):
pygame.draw.rect(screen, color, ((point[0] * snake_size + 1, point[1] * snake_size + 1),
(snake_size - 1, snake_size - 1)))
def snake_move():
'''撞墙或撞到蛇身死亡则返回False, 否则返回true'''
global food
next_head = (snake[0][0] + direction[snake_direction][0],
snake[0][1] + direction[snake_direction][1])
if next_head in snake:
return False
if next_head[0] < 0 or next_head[0] >= width // snake_size or \
next_head[1] < 0 or next_head[1] >= height // snake_size:
return False
# 蛇向前移动
snake.insert(0, next_head)
# 重画旧蛇头为蛇身
draw_rect(snake_color, snake[1])
# 画新的蛇头
draw_rect(snake_head_color, snake[0])
# 判断是否吃到食物
if next_head[0] == food[0] and next_head[1] == food[1]:
# 蛇已经满屏了
if len(snake) == (width // snake_size) * (height // snake_size):
return Flase
# 产生新食物
food = get_food()
# 画新的食物
draw_rect(food_color, food)
else:
# 抹去蛇尾
draw_rect(background_color, snake[-1])
snake.pop()
return True
food = get_food()
# 先画以下背景 白色
screen.fill(background_color)
# 画边框
for x in range(width // snake_size):
pygame.draw.line(screen, line_color, (x * snake_size, 0), (x * snake_size, height), 1)
for y in range(height // snake_size):
pygame.draw.line(screen, line_color, (0, y * snake_size), (width, y * snake_size), 1)
# 画食物
draw_rect(food_color, food)
# 画蛇头
draw_rect(snake_head_color, snake[0])
for point in snake[1:]:
# 画蛇身
draw_rect(snake_color, point)
while True:
# 锁定帧率
clock.tick(FPS)
for event in pygame.event.get():
if event.type == QUIT:
quit = True
break
elif event.type == KEYDOWN:
if event.key == K_UP or event.key == K_DOWN or\
event.key == K_LEFT or event.key == K_RIGHT:
# 避免反向自杀
if direction[snake_direction][0] + direction[event.key][0] != 0 and \
direction[snake_direction][1] + direction[event.key][1] != 0:
snake_direction = event.key
elif event.key == K_p:
pause = not pause
elif event.key == K_ESCAPE:
quit = True
if pause: continue
if quit: break
# 5 / FPS s 移动一次
if time > 5:
# 移动
if not snake_move(): break
# 刷新画面
pygame.display.update()
time = 0
else:
time += 1
# 显示游戏结束
font = pygame.font.SysFont('方正粗黑宋简体', 48)
text_surface = font.render(u'游戏结束!', True, (255, 0, 0))
x, y = (width - text_surface.get_width()) // 2, (height - text_surface.get_height()) // 2
screen.blit(text_surface, (x, y))
pygame.display.update()
# 暂停 1500 ms
pygame.time.wait(2000)
pygame.display.quit()