20232418 郭俊廷 2023-2024-2 《Python程序设计》实验四报告
20232418 郭俊廷 2023-2024-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2324班
姓名: 郭俊廷
学号: 20232418
实验教师:王志强
实验日期:2024年5月15日
必修/选修: 公选课
1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
通过python编写贪吃蛇小游戏
2. 实验过程及结果
实验分析
贪吃蛇控制:让玩家能够简单易懂地控制贪吃蛇的移动。
食物生成:分析食物生成的位置是否合理,能否给玩家带来足够的挑战。
碰撞检测:评估碰撞检测算法的实现效果,确保贪吃蛇在撞到墙壁或自身时能够准确判断并作出相应处理。
得分:分析得分计算方式,确保玩家能够及时了解自己的游戏成绩和速度。
1.导入所需的库和模块,如random、sys、time、pygame等。
import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque
2.定义常量(屏幕宽度、高度、小方格大小、网格线宽度等)和定义蛇、食物、背景等的颜色
SCREEN_WIDTH = 600 # 屏幕宽度
SCREEN_HEIGHT = 480 # 屏幕高度
SIZE = 20 # 小方格大小
LINE_WIDTH = 1 # 网格线宽度
SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)
SCOPE_Y = (2, SCREEN_HEIGHT // SIZE - 1)
LIGHT = (100, 100, 100)
SNAKE = (200, 200, 200) # 蛇
BLACK = (0, 0, 0) # 网格线
RED = (200, 30, 30) # 红色,GAME OVER 的字体
BGCOLOR = (40, 40, 60) # 背景
3.定义文本函数print_text,用于显示得分和速度。
def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):
imgText = font.render(text, True, fcolor)
screen.blit(imgText, (x, y))
4.定义初始化蛇的函数init_snake,用于创建初始蛇身。
def init_snake():
snake = deque()
snake.append((2, SCOPE_Y[0]))
snake.append((1, SCOPE_Y[0]))
snake.append((0, SCOPE_Y[0]))
return snake
5.定义食物函数create_food,用于随机生成一个食物。
def create_food(snake):
food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
while (food_x, food_y) in snake: # 如果食物本身在蛇身上,则刷新
food_x = random.randint(SCOPE_X[0], SCOPE_X[1])
food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])
return food_x, food_y
6.定义生成食物的函数get_food_style,用于随机生成食物的样式和颜色.
FOOD_STYLE_LIST = [(10, (255, 100, 100)), (20, (100, 255, 100)), (30, (100, 100, 255))]
def get_food_style(): #随机选择食物样式
return FOOD_STYLE_LIST[random.randint(0, 2)]
7.主函数部分
1.初始化Pygame环境、设置窗口标题以及加载两种字体
def main():
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('贪吃蛇')
font1 = pygame.font.SysFont('SimHei', 24) # 得分的字体
font2 = pygame.font.Font(None, 72) # GAME OVER 的字体
fwidth, fheight = font2.size('GAME OVER')
2.初始化数据
b = True
snake = init_snake()
food = create_food(snake)
food_style = get_food_style()
pos = (1, 0)
game_over = True
start = False # 是否开始,当start = True,game_over = True 时,才显示 GAME OVER
score = 0 # 得分
orispeed = 0.5 # 初始速度
speed = orispeed #目前速度
last_move_time = None
pause = False
3.处理按键操作、绘制游戏界面、更新游戏状态。
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_RETURN:
if game_over:
start = True
game_over = False
snake = init_snake()
food = create_food(snake)
food_style = get_food_style()
pos = (1, 0)
# 得分
score = 0
last_move_time = time.time()
elif event.key == K_SPACE:
if not game_over:
pause = not pause
elif event.key in (K_w, K_UP):
# 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVER
if b and not pos[1]:
pos = (0, -1)
b = False
elif event.key in (K_s, K_DOWN):
if b and not pos[1]:
pos = (0, 1)
b = False
elif event.key in (K_a, K_LEFT):
if b and not pos[0]:
pos = (-1, 0)
b = False
elif event.key in (K_d, K_RIGHT):
if b and not pos[0]:
pos = (1, 0)
b = False
4.绘制游戏界面、更新游戏状态。
screen.fill(BGCOLOR)
for x in range(SIZE, SCREEN_WIDTH, SIZE):
pygame.draw.line(screen, BLACK, (x, SCOPE_Y[0] * SIZE), (x, SCREEN_HEIGHT), LINE_WIDTH)
for y in range(SCOPE_Y[0] * SIZE, SCREEN_HEIGHT, SIZE):
pygame.draw.line(screen, BLACK, (0, y), (SCREEN_WIDTH, y), LINE_WIDTH)
if not game_over:
curTime = time.time()
if curTime - last_move_time > speed:
if not pause:
b = True
last_move_time = curTime
next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])
if next_s == food:
snake.appendleft(next_s)
score += food_style[0]
speed = orispeed - 0.03 * (score // 50)
food = create_food(snake)
food_style = get_food_style()
else:
if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] \
and next_s not in snake:
snake.appendleft(next_s)
snake.pop()
else:
game_over = True
# 画食物
if not game_over:
pygame.draw.rect(screen, food_style[1], (food[0] * SIZE, food[1] * SIZE, SIZE, SIZE), 0)
# 画蛇
for s in snake:
pygame.draw.rect(screen, SNAKE, (s[0] * SIZE + LINE_WIDTH, s[1] * SIZE + LINE_WIDTH,
SIZE - LINE_WIDTH * 2, SIZE - LINE_WIDTH * 2), 0)
print_text(screen, font1, 30, 7, f'速度: {score//50}')
print_text(screen, font1, 450, 7, f'得分: {score}')
if game_over:
if start:
print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2, (SCREEN_HEIGHT - fheight) // 2, 'GAME OVER', RED)
pygame.display.update()
if __name__ == '__main__':
main()
演示视频(以方向键控制方向,以空格键停止游戏)
3. 实验过程中遇到的问题和解决过程
- 问题1:蛇在快速向下又向左移动时会出现bug
- 问题1解决方案:将这种情况单独用if处理
- 问题2:不清楚怎么呈现多种颜色的区块
- 问题2解决方案:在网络上查询到对应的像素数据
- 问题3:如何监控键盘行为来进行操作
- 问题3解决方案:在网络上查询到相应的资料
##实验的感想体会
在本次实践中,我在自己摸索、网络查询中终于完成了这个贪吃蛇小游戏。本来是想要在添加上一个管理员作弊的模式的,但是限于技术力不足,在中止程序同时修改速度与长度的时候遇到了瓶颈,无奈放弃。这个程序还是比较简陋,有着许多不足,但是通过这次实验我应用到了以往学会的许多知识,真正将以往的许多知识糅合在一起,做到了学以致用。
##课程感想体会
在这次Python实践中,我对于“实践出真知”有了更加深刻的了解。在自己做游戏的过程中,发现自己对于Python的许多知识还是不甚了解,Python还是有许多的知识等着我们去探索,去汲取,我们只是在这半年里推开了一扇新世界的大门,学到的只是皮毛。感谢王老师带领着我们去接触到了Python这一种编程语言。“人生苦短,我学Python"是我在结课后领悟到的最深刻的一课。即使课程已经到达了尾声,我依然要秉承着对知识孜孜以求的精神,继续钻研更高深的Python技术,让“苦短”的人生也能因为Python而变得多姿多彩。最后,感谢王老师一学期的陪伴,感谢老师让我对Python有了浓厚的兴趣,希望未来老师能够带领更多的同学学到Python,体会到“人生苦短,我学Python"的真谛。
##课程建议
希望课程时间延长,能够了解到更多深层次的python知识
参考资料
相关推荐
高校技术转移办公室人员如何利用平台提升技术成果的市场转化率?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
人工智能基于Spring AI的流程编排技术:Java开发者实现RAG、工具调用与多Agent协作的系统化方法论
「AI大模型」Spring-AI-流程编排主流做法-保姆级教程 内容概要:本文是一份关于 Spring AI 1.0 GA 版本中流程编排的系统性教程,重点讲解如何利用 Spring AI 的核心机制实现 AI 应用中的标准化、可复用的流程控制。文章从环境搭建入手,深入介绍 ChatClient 作为编排入口的使用方式,并详细阐述 Advisors 拦截链在实现安全过滤、记忆管理、检索增强生成(RAG)、工具调用等功能中的核心作用。进一步覆盖结构化输出、跨进程通信协议 MCP 及基于状态图的复杂工作流引擎 Spring AI Alibaba Graph 等高级编排能力,最后通过一个集成 RAG、工具调用与对话记忆的生产级 Agent 实战案例,展示了全流程自动化的能力。整套体系借鉴了 Servlet Filter 和 LangGraph 思想,强调“约定优于配置”的工程化设计。; 适合人群:具备 Spring Boot 基础,希望系统掌握 AI 应用流程编排的 Java 开发者,尤其是从事企业级 AI 功能开发、Agent 构建及相关平台建设的技术人员。; 使用场景及目标:① 构建具备记忆、RAG、工具调用等复合能力的智能助手;② 实现可插拔、高复用、易测试的 AI 流程组件;③ 设计支持循环、分支和并行的复杂 Agent 工作流;④ 推动跨服务、跨语言的 AI 工具标准化集成(通过 MCP)。; 阅读建议:此资源以 Spring 官方及 Alibaba 生态权威资料为基础,内容紧跟 1.0 GA 最新演进,建议结合官方文档同步实践代码,特别注意版本迁移要点(如 artifactId 更名、Advisor 替换等),并在实际项目中遵循最佳实践规避常见陷阱。
产业园区如何精准识别并引进符合本地产业特色的优质科技成果转化项目?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
阿里云云原生架构白皮书文档
阿里云云原生架构白皮书,由阿里云内部技术团队合著,对整个阿里云云原生产品和架构理念进行了全面深入介绍
NexIoT AI物联网平台 是一款基于Java 25 AI+创新的"真·零代码侵入"企业级物联网平台
基于Java 25 AI+创新的"真·零代码侵入"企业级物联网平台 | 开箱即用 | 设备驱动完全外置,一键导出即用 | 支持TCP、MQTT、Modbus、天翼物联等多协议多平台接入 | 基于浏览器的调试IDE、插件化和热部署 | 驱动生态共享,你对接的设备我可直接导入


