20244219陈艺豪 实验四 综合实践

课程:《Python程序设计》
班级: 2442
姓名: 陈艺豪
学号:202444219
实验教师:王志强
实验日期:2025年5月28日
必修/选修: 公选课

1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

2.实验内容及结果
由于我个人对于贪吃蛇小游戏比较感兴趣,因此选取了贪吃蛇小游戏作为此次的实验对象。
首先是对实验的分析:
贪吃蛇游戏是一个经典的电子游戏,主要目的是控制一条蛇在屏幕上移动,使其吃到随机出现的食物。当蛇吃到食物时,它会变长,同时得分增加。如果蛇撞到屏幕边缘或自己的身体,游戏结束。
    在编写这个游戏时,需要考虑以下几个方面:
   (1)初始化设置:包括屏幕大小、蛇的初始位置、食物的位置、得分等。
   (2)游戏循环:不断检测用户的输入,更新蛇的位置。
   (3)碰撞检测:判断蛇是否撞到屏幕边缘或自己的身体。
   (4)绘制界面及结束处理:在屏幕上绘制蛇、食物以及得分。当蛇碰到障碍物时,结束游戏循环。
其次是游戏设计部分:
(1)游戏逻辑设计:
蛇的移动由键盘的上下左右方向键控制。
蛇吃到食物时,身体增长,食物重新随机出现。
蛇撞到屏幕边缘或自己的身体时,游戏结束。
(2)数据结构:
使用列表存储蛇的身体各部分的坐标。
使用变量记录蛇的移动方向、食物的位置和得分。
(3)用户界面:
绘制一个窗口来显示游戏界面。
使用矩形来表示蛇和食物。
显示得分。
以下是我的具体实验过程:
(1)首先,我对pygame进行了初始化:
初始化Pygame库和设置屏幕大小。
初始化蛇的位置、移动方向、食物位置以及得分、字体等。

(2)其次,我对游戏循环进行了定义:
在主循环中处理事件,如键盘输入。
更新蛇的位置。
检测蛇是否吃到食物。
检测蛇是否碰到障碍物。

(3)然后,我对游戏中的贪吃蛇进行了碰撞检测:
检查蛇头是否超出屏幕范围。
检查蛇头是否碰到蛇身体的其它部分。

(4)最后是绘制界面和对游戏结束后的处理。
当蛇碰到障碍物时,结束游戏循环。

游戏运行图片如下:



完整的源代码如下:
import pygame
import random
import sys

初始化pygame

pygame.init()

设置屏幕大小

screen_width = 600
screen_height = 400

创建屏幕

screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('贪吃蛇游戏')

设置游戏的fps

fps_clock = pygame.time.Clock()

设置蛇的初始位置

snake_position = [100, 100]
snake_body = [[100, 100], [80, 100], [60, 100]]

蛇的移动方向

direction = 'right'
change_to = direction # 新增:存储方向变化

食物的位置

food_position = [300, 300]
food_spawn = True

方块大小

block_size = 20

得分

score = 0

字体

font = pygame.font.SysFont('arial', 20)

游戏循环标志

game_over = False

游戏循环

while not game_over:
# 设置背景颜色
screen.fill((0, 0, 0)) # 改为黑色背景

# 事件处理
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()
        sys.exit()

    # 键盘按键处理(只记录方向变化,不立即改变方向)
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT and direction != 'right':
            change_to = 'left'
        elif event.key == pygame.K_RIGHT and direction != 'left':
            change_to = 'right'
        elif event.key == pygame.K_UP and direction != 'down':
            change_to = 'up'
        elif event.key == pygame.K_DOWN and direction != 'up':
            change_to = 'down'

# 更新方向(在游戏循环中统一更新)
direction = change_to

# 蛇移动逻辑
if direction == 'right':
    snake_position[0] += block_size
elif direction == 'left':
    snake_position[0] -= block_size
elif direction == 'up':
    snake_position[1] -= block_size
elif direction == 'down':
    snake_position[1] += block_size

# 蛇身更新逻辑(关键修复)
snake_body.insert(0, list(snake_position))
if snake_position[0] == food_position[0] and snake_position[1] == food_position[1]:
    food_spawn = True
    score += 1
else:
    snake_body.pop()  # 如果没有吃到食物,移除尾部

# 生成新的食物
if food_spawn:
    food_spawn = False
    food_position = [random.randrange(1, (screen_width - block_size) // block_size) * block_size,
                     random.randrange(1, (screen_height - block_size) // block_size) * block_size]

# 绘制蛇(改为绿色)
for position in snake_body:
    pygame.draw.rect(screen, (0, 255, 0), pygame.Rect(position[0], position[1], block_size, block_size))

# 绘制食物(红色)
pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(food_position[0], food_position[1], block_size, block_size))

# 更新分数(改为白色文字)
score_text = font.render("Score: " + str(score), True, (255, 255, 255))
screen.blit(score_text, [10, 10])

# 判断蛇是否撞墙或吃到自己
if (snake_position[0] >= screen_width or snake_position[0] < 0 or
        snake_position[1] >= screen_height or snake_position[1] < 0):
    game_over = True

for block in snake_body[1:]:
    if snake_position == block:
        game_over = True

# 刷新屏幕
pygame.display.flip()

# 控制游戏帧率
fps_clock.tick(10)

游戏结束后的处理

if game_over:
screen.fill((0, 0, 0))
game_over_text = font.render("Game Over", True, (255, 0, 0))
score_text = font.render("Final Score: " + str(score), True, (255, 255, 255))
restart_text = font.render("Press R to Restart", True, (255, 255, 255))

screen.blit(game_over_text, [screen_width // 2 - 70, screen_height // 2 - 30])
screen.blit(score_text, [screen_width // 2 - 80, screen_height // 2])
screen.blit(restart_text, [screen_width // 2 - 100, screen_height // 2 + 30])

pygame.display.flip()

# 等待玩家选择重新开始或退出
waiting = True
while waiting:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r:
                # 重新开始游戏
                exec(open(__file__).read())
                sys.exit()
            elif event.key == pygame.K_q:
                pygame.quit()
                sys.exit()

pygame.quit()

3.实验中存在的问题及解决方案:
(1)问题:在最初设计版本中蛇身和背景同色。
         解决:背景改为黑色,蛇身改为绿色。
(2)问题:食物可能生成在边界外。
         解决:调整随机数范围。

4.全课的总结及感想体会
通过这次实验四,我从当时课上仅仅学习到的简单的贪吃蛇游戏代码到现在能通过结合所有课程和网上资料能编写大部分完整的贪吃蛇游戏代码,收获不言而喻。
 这学期我学到的知识思考下来有以下几个方面:
(1)python简介:python计算机语言、面向对象、面向过程、动态数据类型、开发环境(如Pycharm、IDLE等)等。
(2)python语法:注释、代码缩进、标识符、保留字、编码规范、数据类型(整数、浮点数、字符串等)等。
(3)序列:list列表、tuple元组、dictionary字典、set集合。
(4)网络编程Socket:Sever\Client端对话、打电话(拨号、建立连接、通话、断开等)。
学习Python这门课程的经历有很多挫折,我经常出现做每次实验时都毫无思绪、一头雾水。但是值得庆幸的是每到这种时候我都可以请教同学解决python程序编写和运行时遇到的问题。到了现在,我才发现我原来已经能掌握那么多python知识,非常感谢王老师一学期以来的教导和关心!

posted @ 2025-05-28 21:29  陈艺豪  阅读(45)  评论(0)    收藏  举报