实践4 Python综合实践 20224203贾琳

crush 2023-05-24 00:13:10

课程:《Python程序设计》
班级: 2242
姓名: jl
学号:20224203
实验教师:wzq
实验日期:2023年5月21日
必修/选修: 公选课

1.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。

例如:利用公开数据集,开展图像分类、恶意软件检测等

例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。

例如:爬取天气数据,实现自动化微信提醒

例如:利用爬虫,实现自动化下载网站视频、文件等。

例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等

注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

2. 实验过程及结果

制作贪吃蛇游戏并进行运行,如图

img


img


img


img


img


img


img

下图是运行结果:

img


img


img

3. 源代码

import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque
#基础设置
Screen_Height=480
Screen_Width=600
Size=20#小方格大小
Line_Width=1
#游戏区域的坐标范围
Area_x=(0,Screen_Width//Size-1) #0是左边界,1是右边界 #注:python中//为整数除法;/为浮点数除法
Area_y=(2,Screen_Height//Size-1)
#食物的初步设置
#食物的分值+颜色
Food_Style_List=[(10,(255,100,100)),(20,(100,255,100)),(30,(100,100,255))]
#整体颜色设置
Light=(100,100,100)
Dark=(200,200,200)
Black=(0,0,0)
Red=(200,30,30)
Back_Ground=(40,40,60)
#文本输出格式设置
def Print_Txt(screen,font,x,y,text,fcolor=(255,255,255)):
#font.render参数意义:.render(内容,是否抗锯齿,字体颜色,字体背景颜色)
Text=font.render(text,True,fcolor)
screen.blit(Text,(x,y))
#初始化蛇
def init_snake():
snake=deque()
snake.append((2,Area_y[0]))
snake.append((1,Area_y[0]))
snake.append((0,Area_y[0]))
return snake
#食物设置
#注意需要对食物出现在蛇身上的情况进行判断
def Creat_Food(snake):
'''
注:randint 产生的随机数区间是包含左右极限的,
也就是说左右都是闭区间的[1, n],能取到1和n。
而 randrange 产生的随机数区间只包含左极限,
也就是左闭右开的[1, n),1能取到,而n取不到。randint
产生的随机数是在指定的某个区间内的一个值,
而 randrange 产生的随机数可以设定一个步长,也就是一个间隔。
'''
food_x=random.randint(Area_x[0],Area_x[1]) #此处有疑问
food_y=random.randint(Area_y[0],Area_y[1])
#如果食物出现在蛇上,重来;
while(food_x,food_y)in snake:
food_x = random.randint(Area_x[0], Area_x[1])
food_y = random.randint(Area_y[[0], Area_y[1]])
return food_x,food_y
#食物风格
def Food_Style():
return Food_Style_List[random.randint(0,2)] #返回随机的分值和颜色
def main():
pygame.init()
screen=pygame.display.set_mode((Screen_Width,Screen_Height)) #初始化一个准备显示的窗口或屏幕
pygame.display.set_caption('贪吃蛇') #Set the current window caption
#得分字体设置
font1=pygame.font.SysFont('SimHei',24)
#GO字体设置
font2 = pygame.font.SysFont(None, 72)
fwidth, fheight = font2.size('GAME OVER') ###
#程序bug修复:如果蛇在向右移动,快速点击分别施加向下、向左的命令,向下的命令会被覆盖,只有向左的命令被接受,直接GameOver
# b变量为了防止这个情况发生
b=True
#蛇
snake=init_snake()
#食物
food=Creat_Food(snake)
food_style=Food_Style()
#方向控制
pos=(1,0) ###
#启动游戏相关变量初始化
game_over=True #结束标志 # 是否开始,当start = True,game_over = True 时,才显示 GAME OVER
game_start=False #开始标志
score=0 #得分
orispeed=0.3 #蛇初始速度
speed=orispeed #蛇速度
last_move_time=None
pause=False #暂停
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:
game_start=True
game_over=False
b=True
snake=init_snake()
food=Creat_Food(snake)
food_style=Food_Style()
pos=(1,0)
#得分
score=0
last_move_time=time.time()
elif event.key==K_SPACE:
if not game_over:
pause=not pause
#以下为防止蛇在向右移动时按向左键,导致GameOver
elif event.key in (K_UP,K_w):
if b and not pos[1]: ###
pos=(0,-1)
b=False
elif event.key in (K_DOWN,K_s):
if b and not pos[1]:
pos = (0, 1)
b = False
elif event.key in (K_LEFT,K_a):
if b and not pos[0]:
pos = (-1, 0)
b = False
elif event.key in (K_RIGHT,K_d):
if b and not pos[0]:
pos = (1, 0)
b = False
#填充背景色
screen.fill(Back_Ground)
###
#画网格线、竖线
for x in range(Size, Screen_Width, Size):
pygame.draw.line(screen, Black, (x, Area_y[0] * Size), (x, Screen_Height), Line_Width)
#画网格线、横线
for y in range(Area_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 // 100)
food = Creat_Food(snake)
food_style = Food_Style()
else:
#在区域内
if Area_x[0]<=next_s[0]<=Area_x[1] and Area_y[0]<=next_s[1]<=Area_y[1] and next_s not in snake:
snake.appendleft(next_s)
snake.pop()
else :
game_over=True
#画食物
if not game_over:
'''
rect(Surface,color,Rect,width=0)
第一个参数指定矩形绘制到哪个Surface对象上

第二个参数指定颜色

第三个参数指定矩形的范围(left,top,width,height)

第四个参数指定矩形边框的大小(0表示填充矩形)

例如绘制三个矩形:

pygame.draw.rect(screen, BLACK, (50, 50, 150, 50), 0)
pygame.draw.rect(screen, BLACK, (250, 50, 150, 50), 1)
pygame.draw.rect(screen, BLACK, (450, 50, 150, 50), 10)
     '''
    # 避免 GAME OVER 的时候把 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, Dark, (s[0] * Size + Line_Width, s[1] * Size + Line_Width,
                                        Size - Line_Width * 2, Size - Line_Width * 2), 0)
    Print_Txt(screen, font1, 30, 7, f'速度: {score // 100}')
    Print_Txt(screen, font1, 450, 7, f'得分: {score}')
    #画GameOver
    if game_over:

        if game_start:
            #print('GameOver')
            Print_Txt(screen, font2, (Screen_Width - fwidth) // 2, (Screen_Height - fheight) // 2, 'GAME OVER',Red)
    pygame.display.update()

if name=='main':
main()

4.补充说明:

1)
游戏玩法:回车开始游戏;空格暂停游戏/继续游戏;方向键/wsad控制小蛇走向
思路:用列表存储蛇的身体;用浅色表示身体,深色背景将身体凸显出来;
蛇的移动:仔细观察,是:身体除头和尾不动、尾部消失,头部增加,所以,新添加的元素放在列表头部、删除尾部元素;
游戏结束判定策略:超出边界;触碰到自己的身体:蛇前进的下一格子为身体的一部分(即在列表中)。
2)
蛇的移动,首先根据方向来判断,这里使用pos变量来记录方向
pos(1, 0) //表示当前蛇向右的方向
pos(-1, 0) //表示当前蛇向左的方向
pos(0, 1) //表示当前蛇向下的方向
pos(0, -1) //表示当前蛇向上的方向
3)
控制蛇的速度
其实是控制时间来刷新,我们知道所有的动作都在一个循环里面完成的,也就是代码都一直在运行着。
比如我设置速度为1,表示一秒刷新一次,那么蛇的移动也就是一秒一次,我们看到的也是一秒移动一格。
当我们设置速度为0.5,表示0.5秒刷新一次,那我们就看到0.5秒移动一格,速度就相对地看起来快了。

5. 实验过程中遇到的问题和感悟体会

对pycharm了解不够充分,在一开始屡次碰壁,源代码无法在pycharm中运行。后根据报错提示,找到了问题所在——没有下载pygame安装包,之后下载pygame的安装包后,再试,就能够成功运行了。
通过这次的python的综合实践,我对pycharm有了更深一层的认识,并且深入体会到了python在日常生活中的巨大作用,起到娱乐,信息查询,统计分类等作用。

6. 课程总结

感想:老师真的太好了!!!上课很温柔,尽管身为文科生对代码之类的很不熟悉,老师也没有生气烦躁,上课回答不上问题,老师也没有惩罚。第一次接触python,从第一节课的大概能听懂,到后面越来越听不懂,真的感受到了python浓浓的“恶意”,但是实验课上老师近乎“手把手”的教授代码,实验报告算是有惊无险地完成了。尽管对python还是一知半解,但是也确实体会到了python的奇妙之处,以后要将python运用到日常生活中,可以帮助我节约很多时间。
意见和建议:
老师在讲课过程中可以有适当的语气加重,提示同学们重点和关键;可以再严格一点哈哈哈哈;在讲课过程中可以在教室适当走动,方便监督同学们不要走神。

...全文
184 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文系统研究了移相控制全桥LLC谐振变换器的工作特性,深入分析其在不同工况下的运行机理与性能表现,并基于Simulink平台构建了完整的仿真模型进行验证。文章详细阐述了LLC谐振变换器的电路拓扑结构、工作原理、关键参数设计方法以及移相控制策略的实现机制,重点对电压增益特性、转换效率、软开关实现条件等核心性能指标进行了仿真分析,全面评估了系统在宽输入电压范围内的稳定性、动态响应能力及高效运行区间。; 适合人群:适用于电力电子、电气工程及其自动化等相关专业的高校研究生、科研机构研究人员以及从事高频开关电源、DC-DC变换器设计的工程技术人员;要求读者具备扎实的电路理论基础和一定的Simulink仿真应用经验。; 使用场景及目标:①深入掌握LLC谐振变换器的基本原理与数学建模方法;②理解并应用移相控制策略以提升高效率DC-DC变换器的性能;③通过仿真实践优化谐振腔参数(如谐振电感、励磁电感、谐振电容)与开关频率配置,提高电源系统的整体能效、功率密度和可靠性,服务于实际工程中的电源产品开发与性能验证。; 阅读建议:建议读者结合提供的Simulink仿真模型同步操作,重点探究谐振元件参数变化对系统增益曲线和ZVS软开关实现条件的影响,尝试调节移相角与开关频率以观察动态响应过程,从而深化对LLC变换器高频软开关特性和控制策略的理解。
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 标题中所指的"RS485转USB驱动"是一种硬件接口转换技术,其功能在于将传统的RS485通信协议转换为USB接口形式,从而使得现代计算机或设备能够便捷地与采用RS485协议的设备展开通信。RS485作为一种在工业控制、远程通信及多点系统中得到普遍应用的串行通信标准,具备传输距离长、抗干扰性能优异等显著优势。文中提及的型号(CH340、CH341、FT232RL、PL2303、Y-105)是几种常见的USB至UART(通用异步接收发送器)桥接芯片,它们在USB接口与RS485网络之间充当转换媒介的角色。这些芯片赋予USB通信能力,使得计算机可以通过USB接口与RS485网络中的设备执行数据交换。 1. CH340/CH341:这些由韦东山科技研制的USB转串口芯片,常被用于构建低成本的USB转串口适配器。它们提供从USB到UART的转换功能,支持多种波特率的设定,并且在Windows操作系统环境下通常需要安装相应的驱动程序方可正常运作。 2. FT232RL:FTDI公司推出的一款高性能且低功耗的USB到UART桥接器。FT232RL配备全速USB 1.1接口,支持多种串行接口模式,在数据通信、工业控制等领域能够得到广泛应用。同样地,采用FT232RL的设备在连接至电脑时也需要安装对应的驱动程序。 3. PL2303:硅光电子(Prolific)公司所生产的产品,亦是一种常用的USB到UART桥接芯片。它展现出良好的兼容性以及广泛的驱动程序支持,适用于各类USB至串口的应用场景。 4. Y-105:这可能是一款特定的RS485转USB转换模块,或许集成了上述其中一种或多种转换...
内容概要:本文基于Simulink仿真平台,系统研究了双机并联虚拟同步发电机(VSG)在微电网中的功率分配、黑启动能力、虚拟阻抗控制及预同步并网控制策略。通过构建包含虚拟阻抗的VSG控制模型,有效提升了多机并联系统的功率均分精度与动态稳定性,解决了传统下垂控制存在的环流问题。研究完整覆盖孤岛模式下的黑启动过程与并网模式切换前的预同步控制,确保微电网在失电后能够自主恢复供电,并实现无冲击并网。仿真模型集成了VSG惯量阻尼特性模拟、虚拟阻抗设计、频率电压协同控制、相角频率匹配等关键环节,全面验证了系统在模式切换、负载突变等多工况下的控制有效性与鲁棒性,具有较强的工程应用价值。; 适合人群:具备电力系统、电力电子与微电网控制等相关专业知识,熟悉Matlab/Simulink仿真环境,从事微电网、新能源并网、VSG控制等领域科研工作的研究生、高校教师及工程技术人员。; 使用场景及目标:①深入理解双机或多机VSG并联运行的有功无功功率分配机制;②掌握微电网黑启动流程与预同步控制关键技术;③应用于微电网控制系统设计、课程项目开发、科研课题复现或高水平论文撰写支撑; 阅读建议:建议结合文中控制策略逐步搭建Simulink仿真模型,重点关注VSG控制环路参数整定、虚拟阻抗的作用机理、黑启动时序逻辑以及预同步相位频率调节过程,通过对比不同工况下的仿真波形,深入分析系统动态响应特性与控制性能。

42

社区成员

发帖
与我相关
我的任务
社区描述
技术交流
教育电商 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧