93
社区成员
发帖
与我相关
我的任务
分享# 学号 2022-2023-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2342
姓名: 李祎祺
学号:20234222
实验教师:王志强
实验日期:2024年5月14日
必修/选修: 公选课
## 一、实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
## 二、实验分析与设计
1.游戏的初始化与定义:设置窗口尺寸和游戏标题,初始化了一些游戏变量,如蛇的初始位置、速度、长度,食物的位置等,定义了游戏中需要使用的颜色;
2. 在游戏主循环中,实现了游戏逻辑和交互:
## 三、实验过程
1.根据我对于自身实际水平的评估,在这次作业中我选择了较为简单的贪吃蛇小游戏,由于我的电脑中并未配置pygame,首先我需要进行pygame的安装配置;
首先点击文件—设置——项目—Python解释器,搜索pygame点击确定进行安装,并在安装完成后选择pygame进行配置;


2.在基础程序配置完成后,我进行代码的编写;
(1)首先在代码第一行配置pygame以及random模块

(2)其次我对程序进行了初始化和定义

(3)紧接着进行游戏窗口的设置,我选择的是800*600

(4)然后对蛇的长度进行定义,同时规定小蛇在运动的过程中通过记录碰撞到的方块数量进行计分

(5)接下来对游戏的循环进行定义

(6)通过判断事件的类型是否为QUIT来判断用户是否点击了窗口上的关闭按钮,若是则将game_over标志设置为True,用于退出游戏循环

(7)碰撞检测以及蛇的移动更新:首先检测蛇头是否碰到了游戏窗口的边界,如果蛇头的位置超出了窗口的范围,即x1大于等于窗口宽度dis_width或者小于0,或者y1大于等于窗口高度dis_height或者小于0,那么游戏即将结束,设置game_close标志为True。

## 四、实验结果
最后运行结果如下

完整代码如下:
import pygame
import time
import random
# 初始化游戏
pygame.init()
# 定义颜色
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
# 设置游戏窗口
dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('贪吃蛇小游戏')
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 30
font_style = pygame.font.SysFont(None, 50)
# 绘制蛇的长度
def our_snake(snake_block, snake_list):
for x in snake_list:
pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
# 显示得分
def Your_score(score):
value = font_style.render("Your Score: " + str(score), True, white)
dis.blit(value, [0, 0])
# 游戏主循环
def gameLoop():
game_over = False
game_close = False
x1 = dis_width / 2
y1 = dis_height / 2
x1_change = 0
y1_change = 0
snake_List = []
Length_of_snake = 1
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
while not game_over:
while game_close == True:
dis.fill(blue)
message = font_style.render("You Lost! Q-Quit or C-Play Again", True, red)
dis.blit(message, [dis_width / 6, dis_height / 3])
Your_score(Length_of_snake - 1)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
gameLoop()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = snake_block
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = snake_block
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
dis.fill(blue)
pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
snake_Head = []
snake_Head.append(x1)
snake_Head.append(y1)
snake_List.append(snake_Head)
if len(snake_List) > Length_of_snake:
del snake_List[0]
for x in snake_List[:-1]:
if x == snake_Head:
game_close = True
our_snake(snake_block, snake_List)
Your_score(Length_of_snake - 1)
pygame.display.update()
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
Length_of_snake += 1
clock.tick(snake_speed)
pygame.quit()
quit()
gameLoop()
## 五、实验所遇到的问题
1.不知道如何安装pygame
解决措施:在咨询了老师同学之后我在网上找到了教程并成功安装了pygame
2.在cmd上安装的pygame无法打开
解决措施:在cmd上用pip代码安装上pygame后进行Python代码运行时无法打开,经检验我选择重现在Python中直接安装配置pygame
3.编写完成后程序无法运行
解决措施:经检验是由于pygame下载完成但并未与Python配置完成,将pygame与Python配置完成后即可成功运行
## 三、实验感悟
这次实验对我而言自由度很高,相应的难度也比较大。我在没有老师指导的情况下完成了pygame的配置,同时在选择实验主题时我将爬虫、俄罗斯方块、贪吃蛇等都进行了尝试,最后结合自身实际情况选择了贪吃蛇。在编写完代码并成功运行的那一刻我也获得了极大的成就感。
## 六、全课总结以及感想与体会
通过本学期的学习,我对python计算机语言、面向对象、面向过程、动态数据类型、开发环境(如Pycharm、IDLE等);python语法如注释、代码缩进、标识符、保留字、编码规范、数据类型(整数、浮点数、字符串等);序列如list列表、tuple元组、dictionary字典、set集合以及网络编程Socket进行了深入学习,掌握了一定的Python技术。王老师在课上时常教导我们:要在完成选修课的基础上进而掌握一门技术。经过一个学期的学习我对这句话也有了深入的体会。
的确,Python对于我而言确实有时候像天书一般难以看懂,但是经过深入的学习我更多把它看成了一种独特的计算机语言。虽然有时候遇到代码出错确实很恼火,而且一个错误往往会耽误整个实验的进程,但是每当我绞尽脑汁将错误修正后我总是会有一种做别的事情难以达到的成就感,从Python这门课当中,我也获取了属于自己的乐趣。
感谢王老师一直以来的辛勤付出与谆谆教诲,让我学到了很多知识和技能,感受到了成长和进步。对老师的辛勤付出和关怀表示诚挚的感谢,愿老师一切顺利,再次感谢您!