使用Python+pygame实现贪吃蛇小游戏

本文详细介绍了使用Python的pygame库开发贪吃蛇游戏的两种实现方法,包括蛇的移动、碰撞检测、得分系统和游戏暂停功能。
摘要由CSDN通过智能技术生成

使用Python+pygame贪吃蛇小游戏

使用第三方库pygame,关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520

给出两种实现。

第一种

运行效果如下:

游戏源码如下:

import pygame
import sys
import random

# 初始化pygame
pygame.init()

# 设置屏幕大小
screen_size = (640, 480)
screen = pygame.display.set_mode(screen_size)

# 设置游戏标题
pygame.display.set_caption("贪吃蛇:按p键暂停/继续")

# 定义颜色
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)

# 蛇的初始位置
snake_pos = [[100, 100], [80, 100], [60, 100]]

# 食物的初始位置
food_pos = [300, 300]

# 蛇的初始速度
snake_speed = [20, 0]

# 初始化分数
score = 0

# 创建字体对象
font = pygame.font.Font(None, 36)

# 游戏暂停标志
paused = False

# 主循环
while True:
    # 处理游戏事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_p:  # 按 P 键暂停或继续
                paused = not paused
            if not paused:
                if event.key == pygame.K_UP and snake_speed != [0, 20]:
                    snake_speed = [0, -20]
                elif event.key == pygame.K_DOWN and snake_speed != [0, -20]:
                    snake_speed = [0, 20]
                elif event.key == pygame.K_LEFT and snake_speed != [20, 0]:
                    snake_speed = [-20, 0]
                elif event.key == pygame.K_RIGHT and snake_speed != [-20, 0]:
                    snake_speed = [20, 0]

    if not paused:
        # 更新蛇的位置
        snake_pos.insert(0, [snake_pos[0][0] + snake_speed[0], snake_pos[0][1] + snake_speed[1]])

        # 检查蛇头是否碰到墙壁,如果是则“经过墙壁”
        if snake_pos[0][0] < 0:
            snake_pos[0][0] = screen_size[0]-20
        elif snake_pos[0][0] >= screen_size[0]:
            snake_pos[0][0] = 0
        elif snake_pos[0][1] < 0:
            snake_pos[0][1] = screen_size[1]-20
        elif snake_pos[0][1] >= screen_size[1]:
            snake_pos[0][1] = 0

        # 检查蛇头是否碰到食物
        if snake_pos[0] == food_pos:
            food_pos = [random.randrange(1, screen_size[0] // 20) * 20, random.randrange(1, screen_size[1] // 20) * 20]
            score += 1  # 计分
        else:
            snake_pos.pop()

    # 绘制游戏界面
    screen.fill(WHITE)

    for pos in snake_pos:
        pygame.draw.rect(screen, GREEN, pygame.Rect(pos[0], pos[1], 20, 20))

    pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], 20, 20))

    # 显示得分
    score_text = font.render("Score: " + str(score), True, (0, 0, 0))
    screen.blit(score_text, (10, 10))

    # 如果游戏暂停,则显示暂停提示
    if paused:
        pause_text = font.render("Paused. Press P to continue.", True, (0, 0, 0))
        screen.blit(pause_text, (screen_size[0] // 2 - pause_text.get_width() // 2, screen_size[1] // 2 - pause_text.get_height() // 2))

    pygame.display.flip()  # 更新屏幕显示

    # 控制游戏速度
    pygame.time.Clock().tick(6)

第二种

就不给出运行效果图了,你可以运行看看。

下面给出另一种实现源码:

import pygame
import time
import random

# 设置蛇的速度
snake_speed = 15

# 窗口颜色
white = pygame.Color(255, 255, 255)

# 蛇的颜色
green = pygame.Color(0, 255, 0)

# 食物的颜色
red = pygame.Color(255, 0, 0)

# 初始化pygame
pygame.init()

# 初始化游戏窗口
window = pygame.display.set_mode((720, 480))

# FPS(帧率)控制器
fps = pygame.time.Clock()

# 定义蛇的默认位置
snake_position = [100, 50]

# 定义蛇身体的前四个块
snake_body = [[100, 50], [90, 50], [80, 50], [70, 50]]

# 食物位置
food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]

# 蛇吃到食物时
food_spawn = True

# 设置默认的蛇的方向为向右
direction = 'RIGHT'

# 初始分数
score = 0

def game_over():
    # 设置字体以显示分数
    #font = pygame.font.SysFont(None, 26)                
    font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 26) #显示中文文字
    score_text = font.render('得分: ' + str(score), True, green)
    window.blit(score_text, [320, 240])

    # 显示信息
    again_text = font.render('游戏结束!按任意键重新开始', True, red)  # 修改颜色变量为white
    window.blit(again_text, [160, 280])

    pygame.display.flip()  # 使用 flip() 来更新整个屏幕

    # 等待用户按键然后重新开始游戏
    waiting_for_input = True
    while waiting_for_input:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                waiting_for_input = False
            elif event.type == pygame.QUIT:
                pygame.quit()
                quit()
    # 游戏重新开始
    main()

# 游戏的主逻辑
def main():
    global direction, food_position, food_spawn, score
    # 重置游戏
    score = 0
    snake_position = [100, 50]
    snake_body = [[100, 50], [90, 50], [80, 50], [70, 50]]
    direction = 'RIGHT'
    food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]
    food_spawn = True
    while True:
        # 处理按键事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP and direction != 'DOWN':
                    direction = 'UP'
                if event.key == pygame.K_DOWN and direction != 'UP':
                    direction = 'DOWN'
                if event.key == pygame.K_LEFT and direction != 'RIGHT':
                    direction = 'LEFT'
                if event.key == pygame.K_RIGHT and direction != 'LEFT':
                    direction = 'RIGHT'

        # 移动蛇
        if direction == 'UP':
            snake_position[1] -= 10
        if direction == 'DOWN':
            snake_position[1] += 10
        if direction == 'LEFT':
            snake_position[0] -= 10
        if direction == 'RIGHT':
            snake_position[0] += 10

        # 蛇身体增长机制
        snake_body.insert(0, list(snake_position))
        if snake_position[0] == food_position[0] and snake_position[1] == food_position[1]:
            score += 1
            food_spawn = False
        else:
            snake_body.pop()

        if not food_spawn:
            food_position = [random.randrange(1, 72) * 10, random.randrange(1, 48) * 10]
        food_spawn = True

        # 图形界面
        window.fill(white)

        for pos in snake_body:
            pygame.draw.rect(window, green, pygame.Rect(pos[0], pos[1], 10, 10))

        pygame.draw.rect(window, red, pygame.Rect(food_position[0], food_position[1], 10, 10))

        # 游戏结束条件
        if snake_position[0] < 0 or snake_position[0] > 710 or snake_position[1] < 0 or snake_position[1] > 470:
            game_over()
            break  # 结束游戏后跳出循环
        for block in snake_body[1:]:
            if snake_position[0] == block[0] and snake_position[1] == block[1]:
                game_over()
                break  # 结束游戏后跳出循环

        # 更新显示
        pygame.display.update()

        # 每秒帧数/刷新率
        fps.tick(snake_speed)

# 运行主函数
if __name__ == "__main__":
    main()

OK! 

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值