探索Python世界的趣味之旅:自制贪吃蛇游戏

通过本次贪吃蛇游戏的开发实践,不仅可以掌握Python编程语言的基础知识,还深入了解了游戏开发的基本流程和技术要点。这只是一个开始,Python的世界远不止于此。未来,你可以尝试开发更复杂、更有趣的游戏项目,甚至探索人工智能、数据分析等领域的应用。

贪吃蛇游戏虽小,却蕴含了编程的无限可能。希望这个项目能够激发你对编程的热情,让你在Python的世界里自由翱翔,创造属于自己的精彩故事。


  • 博客主页:长风清留扬-CSDN博客
  • 系列专栏:Python趣味小游戏
  • 每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法
  • 感谢大家点赞👍收藏⭐评论

Python 贪吃蛇游戏项目


在编程的世界里,小游戏开发不仅是学习编程语言的绝佳途径,更是激发创造力和逻辑思维能力的有效方式。而且在学习和使用Python的过程中,一定要多加练习,一边学习知识点,一边动手练习才可以提高代码水平,今天,我们将一起踏上一段特别的旅程,使用Python语言亲手打造一款经典的游戏——贪吃蛇。通过这个项目,你不仅能加深对Python语言的理解,还能体验到从设计到实现的完整软件开发过程。

一、项目介绍:贪吃蛇游戏

贪吃蛇,这个简单却充满挑战的游戏,自诞生以来就深受玩家喜爱,还记得自己第一次玩的时候还是在老款的诺基亚上玩的,差不多算是自己第一次玩电子游戏。玩家需要控制一条不断增长的蛇在封闭的空间内移动,通过吃下随机出现的食物来增长身体,同时避免碰到墙壁或自己的尾巴。这个看似简单的规则背后,隐藏着无尽的策略与乐趣。

二、项目准备:搭建开发环境

在开始编写代码之前,确保你的计算机上安装了Python环境以及pygame库。可以通过Python的官方网站下载安装包,并通过pip命令安装pygame库。

pip install pygame

此外,准备一款文本编辑器或IDE(如PyCharm、VS Code等),用于编写和调试代码。

三、设计思路:规划游戏逻辑

1. 游戏界面设计

首先,规划游戏的基本界面布局,包括游戏窗口的大小、颜色主题、以及蛇和食物的显示方式。贪吃蛇游戏通常采用简洁的界面风格,以突出游戏的核心玩法。

2. 蛇的移动与控制

蛇的移动是贪吃蛇游戏的核心机制。通过监听键盘事件来控制蛇的上下左右移动,同时记录蛇的当前位置和历史位置,以便进行碰撞检测和绘制。

3. 食物的生成与碰撞检测

食物需要随机出现在游戏界面的空白位置,避免与蛇身重叠。当蛇头与食物重合时,增加蛇的长度并生成新的食物。同时,检测蛇头是否触碰到边界或自身身体,以判断是否游戏结束。

4. 分数统计与显示

随着蛇吃掉越来越多的食物,其长度增加,分数也应相应提升。在游戏界面上实时显示当前分数,增加游戏的互动性和挑战性。

四、实现细节:编码实践

在明确了设计思路后,就可以开始编码实践了。利用pygame库提供的图形绘制、事件监听等功能,逐步实现上述设计思路。在编码过程中,注意代码的可读性和可维护性,合理使用变量名、注释和函数封装来组织代码。

关键点:

  • 使用pygame的init()函数初始化游戏环境。
    # 初始化pygame
    pygame.init()
  • 设置游戏窗口大小,并使用set_mode()函数创建游戏屏幕。
    # 设置屏幕宽度和高度
    screen_width = 600
    screen_height = 400
    screen = pygame.display.set_mode((screen_width, screen_height))
  • 通过draw.rect()函数绘制蛇和食物。
    # 蛇的初始位置和方向
    snake_block = 20
    snake_list = [(screen_width // 2, screen_height // 2)]
    snake_direction = 'RIGHT'
    
    # 食物位置
    food_position = [random.randint(0, (screen_width // snake_block) - 1) * snake_block,
                     random.randint(0, (screen_height // snake_block) - 1) * snake_block]
  • 使用事件监听(如KEYDOWN)来控制蛇的移动方向。
    # 游戏主循环
    game_over = False
    while not game_over:
        # 检测键盘事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and snake_direction != 'RIGHT':
                    snake_direction = 'LEFT'
                elif event.key == pygame.K_RIGHT and snake_direction != 'LEFT':
                    snake_direction = 'RIGHT'
                elif event.key == pygame.K_UP and snake_direction != 'DOWN':
                    snake_direction = 'UP'
                elif event.key == pygame.K_DOWN and snake_direction != 'UP':
                    snake_direction = 'DOWN'
    
  • 实现碰撞检测逻辑,判断蛇是否吃到食物或撞到墙壁/自身。
    # 如果蛇头与身体相撞,则游戏结束
        if snake_head in snake_list[:-1]:
            game_over = True
    
        # 如果蛇头碰到边界,则游戏结束
        if snake_head[0] < 0 or snake_head[0] >= screen_width or snake_head[1] < 0 or snake_head[1] >= screen_height:
            game_over = True
  • 更新分数并显示在屏幕上。
    # 显示分数
        font = pygame.font.Font(None, 36)
        score_text = font.render(f"Score: {score}", True, white)
        screen.blit(score_text, [0, 0])
    
        pygame.display.update()

五、完整代码

import pygame
import random

# 初始化pygame
pygame.init()

# 设置屏幕宽度和高度
screen_width = 600
screen_height = 400
screen = pygame.display.set_mode((screen_width, screen_height))

# 设置颜色
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = (0, 255, 0)

# 设置游戏时钟
clock = pygame.time.Clock()

# 蛇的初始位置和方向
snake_block = 20
snake_list = [(screen_width // 2, screen_height // 2)]
snake_direction = 'RIGHT'

# 食物位置
food_position = [random.randint(0, (screen_width // snake_block) - 1) * snake_block,
                 random.randint(0, (screen_height // snake_block) - 1) * snake_block]
food_spawn = True

# 分数
score = 0

# 游戏主循环
game_over = False
while not game_over:
    # 检测键盘事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT and snake_direction != 'RIGHT':
                snake_direction = 'LEFT'
            elif event.key == pygame.K_RIGHT and snake_direction != 'LEFT':
                snake_direction = 'RIGHT'
            elif event.key == pygame.K_UP and snake_direction != 'DOWN':
                snake_direction = 'UP'
            elif event.key == pygame.K_DOWN and snake_direction != 'UP':
                snake_direction = 'DOWN'

    # 更新蛇的位置
    lead_x = snake_list[-1][0]
    lead_y = snake_list[-1][1]

    if snake_direction == 'RIGHT':
        lead_x += snake_block
    elif snake_direction == 'LEFT':
        lead_x -= snake_block
    elif snake_direction == 'UP':
        lead_y -= snake_block
    elif snake_direction == 'DOWN':
        lead_y += snake_block

    snake_head = [lead_x, lead_y]
    snake_list.append(snake_head)

    # 如果蛇头与身体相撞,则游戏结束
    if snake_head in snake_list[:-1]:
        game_over = True

    # 如果蛇头碰到边界,则游戏结束
    if snake_head[0] < 0 or snake_head[0] >= screen_width or snake_head[1] < 0 or snake_head[1] >= screen_height:
        game_over = True

    # 蛇吃食物
    if snake_head == food_position:
        score += 10
        food_spawn = False
        while not food_spawn:
            food_position = [random.randint(0, (screen_width // snake_block) - 1) * snake_block,
                             random.randint(0, (screen_height // snake_block) - 1) * snake_block]
            # 确保新生成的食物不与蛇身重叠
            food_spawn = True
            for block in snake_list:
                if block == food_position:
                    food_spawn = False
                    break

    # 绘制屏幕
    screen.fill(black)
    pygame.draw.rect(screen, green, [food_position[0], food_position[1], snake_block, snake_block])

    for block in snake_list[:-1]:
        pygame.draw.rect(screen, white, [block[0], block[1], snake_block, snake_block])

    pygame.draw.rect(screen, red, [snake_list[-1][0], snake_list[-1][1], snake_block, snake_block])

    # 显示分数
    font = pygame.font.Font(None, 36)
    score_text = font.render(f"Score: {score}", True, white)
    screen.blit(score_text, [0, 0])

    pygame.display.update()

    # 控制游戏速度,也就是蛇游动的速度,值越大,蛇的速度越快
    clock.tick(5)

# 游戏结束
pygame.quit()
quit()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

长风清留扬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值