python实现简陋的贪吃蛇小游戏

简陋的贪吃蛇小游戏

# -*- coding:utf-8 -*-
# 导入库
import sys
import time
import random
import pygame
from pygame.locals import *

# 参数设置
WIDTH = 640
HEIGHT = 480
BLOCK = 20
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)


# 退出程序
def terminal():
    pygame.quit()
    sys.exit()


# 绘制食物
def draw_food(window, point):
    rect = pygame.Rect(point[0], point[1], BLOCK, BLOCK)
    pygame.draw.rect(window, RED, rect)


# 绘制贪吃蛇
def draw_snake(window, snake_body):
    for point in snake_body:
        rect = pygame.Rect(point[0], point[1], BLOCK, BLOCK)
        pygame.draw.rect(window, GREEN, rect)


# 贪吃蛇移动
def move_snake(snake_body, direction, food_position):
    if direction == 'up':
        snake_body.insert(0, [snake_body[0][0], snake_body[0][1] - BLOCK])
    if direction == 'down':
        snake_body.insert(0, [snake_body[0][0], snake_body[0][1] + BLOCK])
    if direction == 'left':
        snake_body.insert(0, [snake_body[0][0] - BLOCK, snake_body[0][1]])
    if direction == 'right':
        snake_body.insert(0, [snake_body[0][0] + BLOCK, snake_body[0][1]])
    # 吃到食物
    if snake_body[0] == food_position:
        food_position = [random.randrange(0, WIDTH, BLOCK), random.randrange(0, HEIGHT, BLOCK)]
    else:
        snake_body.pop()
    # 是否撞墙、撞身体
    alive = True
    if snake_body[0][0] < 0 or snake_body[0][0] + BLOCK > WIDTH:
        alive = False
    elif snake_body[0][1] < 0 or snake_body[0][1] + BLOCK > HEIGHT:
        alive = False
    elif snake_body[0] in snake_body[1:]:
        alive = False
    return snake_body, food_position, alive


# 游戏结束并退出程序
def game_over(window):
    msg = pygame.font.SysFont('arial', 20)
    msg = msg.render('Game over', 1, RED)
    window.blit(msg, (10, 10))
    pygame.display.flip()
    time.sleep(2)  # 等待2秒后退出
    terminal()


# 监控鼠标、键盘
def monitor_action(direction):
    for event in pygame.event.get():
        if event.type == QUIT:  # 右上角关闭按钮
            terminal()
        if event.type == KEYDOWN:
            if event.key == K_UP and direction != 'down':
                direction = 'up'
            elif event.key == K_DOWN and direction != 'up':
                direction = 'down'
            elif event.key == K_LEFT and direction != 'right':
                direction = 'left'
            elif event.key == K_RIGHT and direction != 'left':
                direction = 'right'
            elif event.key == K_ESCAPE:  # ‘ESC’键退出程序
                terminal()
    return direction


# 运行游戏
def run_game():
    pygame.init()  # 模块初始化
    window = pygame.display.set_mode((WIDTH, HEIGHT))   # 新建窗口
    pygame.display.set_caption('贪吃蛇游戏')  # 窗口标题
    clock = pygame.time.Clock()  # 计时器

    # 贪吃蛇、食物初始状态
    food_position = [300, 300]
    snake_body = [[100, 100], [80, 100]]
    direction = 'right'

    while True:
        window.fill(WHITE)  # 绘制背景
        draw_food(window, food_position)
        draw_snake(window, snake_body)
        pygame.display.flip()  # 刷新屏幕
        direction = monitor_action(direction)  # 控制方向
        snake_body, food_position, alive = move_snake(snake_body, direction, food_position)  # 计算下一次绘制物体
        if not alive:
            game_over(window)
        clock.tick(10)  # 刷新频率,1秒刷新5次
    terminal()
    return 0

# 调用函数
run_game()

运行效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45728434/article/details/108904188