Pygame贪吃蛇

记一次,自己使用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()



 

主要内容:本文详细介绍了一种QRBiLSTM(分位数回归双向长短期记忆网络)的时间序列区间预测方法。首先介绍了项目背景以及模型的优势,比如能够有效利用双向的信息,并对未来的趋势上限和下限做出估计。接着从数据生成出发讲述了具体的代码操作过程:数据预处理,搭建模型,进行训练,并最终可视化预测结果与计算分位数回归的边界线。提供的示例代码可以完全运行并且包含了数据生成环节,便于新手快速上手,深入学习。此外还指出了模型未来发展的方向,例如加入额外的输入特性和改善超参数配置等途径提高模型的表现。文中强调了时间序列的标准化和平稳检验,在样本划分阶段需要按时间序列顺序进行划分,并在训练阶段采取合适的手段预防过度拟合发生。 适合人群:对于希望学习和应用双向长短时记忆网络解决时序数据预测的初学者和具有一定基础的研究人员。尤其适用于有金融数据分析需求、需要做多一步或多步预测任务的从业者。 使用场景及目标:应用于金融市场波动预报、天气状况变化预测或是物流管理等多个领域内的决策支持。主要目的在于不仅能够提供精确的数值预计还能描绘出相应的区间概率图以增强结论置信程度。 补充说明:本教程通过一个由正弦信号加白噪构造而成的简单实例来指导大家理解和执行QRBiLSTM流程的所有关键步骤,这既方便于初学者跟踪学习,又有利于专业人士作为现有系统的补充参考工具。
Pygame制作贪吃蛇的基本教程一般分为以下几个步骤: 1. **安装pygame**:首先需要安装pygame库,如果你还没有安装,可以在命令行中使用pip进行安装:`pip install pygame`. 2. **初始化游戏环境**:导入pygame库,设置窗口大小和标题,以及初始化游戏时钟。 ```python import pygame pygame.init() screen_width, screen_height = 800, 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("贪吃蛇") clock = pygame.time.Clock() ``` 3. **创建蛇和食物**:定义蛇和食物的初始位置,可以用列表表示蛇的身体。 ```python snake = [[100, 100], [90, 100], [80, 100]] # 起始位置 food_pos = [400, 400] # 食物位置 ``` 4. **蛇的移动和生长**:创建move()函数,根据用户的按键改变蛇的方向,并更新蛇的身体。如果蛇头碰到了食物,蛇长大一格。 ```python def move_snake(snake, food_pos): head = snake[0] dx, dy = 0, 0 if head == food_pos: # 吃到食物,生成新食物和增长蛇身 generate_food(food_pos) snake.insert(0, list(head)) if len(snake) > 1 and snake[0] in snake[1:]: return False # 碰撞 if pygame.key.get_pressed()[pygame.K_UP]: dy = -10 if pygame.key.get_pressed()[pygame.K_DOWN]: dy = 10 if pygame.key.get_pressed()[pygame.K_LEFT]: dx = -10 if pygame.key.get_pressed()[pygame.K_RIGHT]: dx = 10 head[0] += dx head[1] += dy snake[0] = head return True ``` 5. **绘制蛇和食物**:使用pygame的blit方法将每个像素点画到屏幕上。 6. **游戏循环**:在主循环中不断处理事件,移动蛇,判断是否达到胜利条件(吃遍所有食物),检查碰撞,并更新屏幕。 7. **结束条件**:当蛇撞墙或者自身头部相撞时,游戏结束,显示得分并退出。 由于内容较多,这里只是提供了一个概述,详细的代码实现过程需要结合具体的例子逐步学习。网上有很多完整的pygame贪吃蛇教程,例如GitHub上的一些项目或在线课程都有详细的说明。你可以根据这些资源进一步学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值