20213422实验四 python综合实验
课程:《Python程序设计》
班级: 2134
姓名: 刘伟洁
学号:20213422
实验教师:王志强
实验日期:2022年5月29日
必修/选修: 公选课
一、实验要求
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
二、实验内容
编写黄金矿工游戏
1.代码
from PIL import Image import math import pygame import sys import mod from mod import Hook from mod import Mine, Time_countdown from mod import screen # 窗口设置 pygame.init()#初始化程序 pygame.display.set_caption("黄金矿工")#设置当前窗口标题 screen_size = (800, 600)#屏幕大小 screen = pygame.display.set_mode(screen_size)#显示屏幕大小,初始化显示窗口或屏幕 backcolour = (255, 255, 255)#背景颜色 screen.fill(backcolour)#填颜色 FPS = 60 fclock = pygame.time.Clock()#时钟 # 图标初始化 hook = Hook() man = mod.Matchman(hook.rect.top - 80, hook.rect.left + hook.rect.width / 2 - 50) # 创建精灵组,在显示开始游戏界面的时候用来让用户点击按钮 news_group = pygame.sprite.Group() # 创建3个按钮(开始画面时要显示的按钮) for i in range(3): news_group.add(mod.Button(i)) screens = 0 goals = [100, 150, 300]#坐标 time_limited = [20, 30, 20]#时限 # 积分 scores = mod.Scores(0)#积分初始化 # 播放背景音乐 pygame.mixer.init() bgm = pygame.mixer.Sound("music/bgm.wav") bgm.play()#播放 clock = pygame.time.Clock()#时钟 # 程序开始循环执行 while True:#循环 # 填充背景色 screen.fill(backcolour) # 开始界面 if screens == 0:#为假 mod.show_back(0) for spr in news_group:#遍历在组里的精灵 spr.show()#显示精灵 for event in pygame.event.get():#遍历事件 if event.type == pygame.QUIT:#退出 sys.exit()#退出系统 if event.type == pygame.MOUSEMOTION:#鼠标移动的坐标 for spr in news_group:#组里的精灵循环 if spr.rect.collidepoint(event.pos):#将坐标传递,该点在矩形的边界外 spr.check = 0#为假 else: spr.check = 1#否则为真 if event.type == pygame.MOUSEBUTTONDOWN:#鼠标 for spr in news_group: if spr.rect.collidepoint(event.pos): if spr.index == 0: # 点击开始按钮 level = 0#初始化 first_draw = 1 timee = Time_countdown(time_limited[level])#时间计时 event_count_time = pygame.USEREVENT + 1#时间每变化1 matchmen_change = pygame.USEREVENT + 2#人物变换2 pygame.time.set_timer(event_count_time, 1000)#每一秒变换 pygame.time.set_timer(matchmen_change, 200)#每200ms变换 rotate = 1#初始化 run = 0 wait = 0 miner_back = 0 special_change_speed = 0 change_man = True#始终为真 hook.reset()#钩子 screens = 1 finish = 0 scores.score = 0#积分 elif spr.index == 1:#若过关 screens = 2 elif spr.index == 2:#若没过关 sys.exit() pygame.QUIT#退出 # 游戏运行界面 elif screens == 1: mod.show_back(1) # 显示不同的背景 if first_draw: timee.reset(time_limited[level]) # 重新计时 first_draw = 0 miner_group = mod.set(level) # 事件检测(键盘的处理) for event in pygame.event.get(): if event.type == pygame.QUIT:#退出系统 sys.exit() if event.type == pygame.KEYDOWN:#方向键 if event.key == pygame.K_DOWN: # 如果按了方向键下 run = 1 rotate = 0 if event.type == event_count_time: timee.miner()#最小时间 if event.type == matchmen_change: if run: man.change()#人物形象变换 # 碰撞后物体与钩子衔接,参考:Pygame精灵和碰撞检测 (biancheng.net) if pygame.sprite.spritecollide(hook, miner_group, False, pygame.sprite.collide_mask):
#精灵和精灵组之间的矩形碰撞检测,一个组内的所有精灵会逐一地对另外一个单个精灵进行碰撞检测,返回值是一个列表,包含了发生碰撞的所有精灵。
#关于钩子的旋转,编写三角函数限制钩子的旋转范围,并在词范围内重复 miner = pygame.sprite.spritecollide(hook, miner_group, False, pygame.sprite.collide_mask)[0] if miner.first: miner.first = False ayis = (hook.rect.top + hook.rect.height / 2) + (miner.rect.height / 2) * math.sin( math.radians(hook.angle))#y轴变化 axis = (hook.rect.left + hook.rect.width / 2) - (miner.rect.height / 2) * math.cos( math.radians(hook.angle))#x轴变化 miner.rect.top = ayis - miner.rect.height / 2 miner.rect.left = axis - miner.rect.width / 2 hook.direction = [-hook.direction[0], -hook.direction[1]]#钩子角度 miner.direction = hook.direction if miner.speed >= 1: FPS *= miner.speed else: special_change_speed = 1 hook.speed = miner.speed miner_back = 1 if rotate:#旋转 if hook.angle == 170: hook.turn_direct = -1 elif hook.angle == 10: hook.turn_direct = 1 hook.rotate(hook.turn_direct) if run: if hook.rect.left <= 0 or hook.rect.left + hook.rect.width >= screen_size[ 0] or hook.rect.top + hook.rect.height >= screen_size[1]: hook.direction = [-hook.direction[0], -hook.direction[1]]#范围 elif hook.rect.top < hook.ini_top: run = 0 rotate = 1 hook.reset()#转一圈重新设置 if miner_back: miner_back = 0 scores.score += int(miner.value)#屏幕上的得分 miner_group.remove(miner) FPS = 60 special_change_speed = 0 continue elif miner_back and special_change_speed: if (-hook.rect.left + hook.ini_left) != 0: r = math.atan((hook.rect.top - hook.ini_top) / (-hook.rect.left + hook.ini_left)) hook.direction = [10 * math.cos(r), -10 * math.sin(r)] if (r < 0): hook.direction = [-hook.direction[0], -hook.direction[1]] hook.move() pygame.draw.line(screen, (0, 0, 0), (hook.rect.left + hook.rect.width / 2, hook.rect.top + hook.rect.height / 2), (hook.ini_left + hook.rect.width / 2, hook.ini_top + hook.rect.height / 2), 4)
if miner_back: miner.direction = hook.direction miner.move(hook.speed) miner.rect = screen.blit(miner.img, miner.rect)#将miner图片画上去 for i in miner_group: if i.index != 4: break else: finish = 1 if len(miner_group) == 0 or timee.now == 0 or finish: if scores.score >= goals[level] and level <= 2:#若得分超过线,则游戏等级加一 level += 1 screens = 4 if level == 3:#游戏最多三级 continue else: screens = 3 timee.reset(time_limited[0])#时间重新设置 finish = 0 for spr in miner_group: spr.rect = screen.blit(spr.img, spr.rect)#将spr背景画上去 mod.show_txt(str(goals[level]), screen_size[0] / 19 * 14, screen_size[1] / 15) timee.show()#全显示 scores.show() man.show() hook.rect = screen.blit(hook.load, hook.rect) # 规则界面 elif screens == 2:#rule图标 mod.show_back(2)#显示背景2 for event in pygame.event.get():#取走外部输入信息队列 if event.type == pygame.MOUSEBUTTONDOWN:#鼠标键按下事件 screens = 0 if event.type == pygame.QUIT:#使pygame库停止工作 sys.exit()#终止程序 # 失败界面 elif screens == 3: mod.show_back(3)#显示背景3 for event in pygame.event.get(): if event.type == (pygame.MOUSEBUTTONDOWN or pygame.KEYDOWN):#或者按下键盘按钮 screens = 0 if event.type == pygame.QUIT: sys.exit()#在终止程序之前必须先要使pygmae库停止工作 # 成功界面 if screens == 4: mod.show_back(4)#显示背景4 for event in pygame.event.get(): if event.type == (pygame.MOUSEBUTTONDOWN or pygame.KEYDOWN): if level >= 3: screens = 0 else: screens = 1 first_draw = 1 hook.reset() scores.score = 0 if event.type == pygame.QUIT: sys.exit() pygame.display.update()#更新部分内容显示到屏幕上 fclock.tick(FPS)#控制帧速度,即窗口刷新的速度,其中FPS=60;
2.在pycharm上运行:
就是有一些神奇精灵和神奇配色还有一些中二癌晚期:D,抠图好辛苦qaq
3.在云服务器上运行
不好运行。。安装了python3.5.2版本,用pip安装了pillow和pygame,但是似乎报错了,上网查资料也没能解决问题。。
最后查询的python版本还是2.7(┳Д┳)
pillow也没有安装上去
我是废物五五五五
还有一些小的问题以及解决方法:
问题一:"no module named PIL"
解决:一开始用cmd使用指令:pip install PIL
结果无法运行,上网搜才知道PIL改名了,改成了Pillow,于是pipinstall Pillow就能成功安装;pygame同理。
问题二:无法再xshell上运行就是坠大的问题。
三、课程及实验总结
本学期的主要学习的内容有
(1)变量赋值及其命名规则
(2)运算符及其优先级
(3)基本数据类型
(4)循环语句
(5)列表、元组、字典、集合及其常用功能
(6)字符串与正则表达式
(7)面向对象程序设计
(8)文件操作及异常处理
(9)Python操作数据库
(10)Python爬虫爬取想要的内容
我确实没有想到最后的实验这么难,以至于搞了好几天都没能在云服务器上完美运行,不过在此期间我学习了很多东西,比如初学了一些做游戏常用的语句,也学习了一些命令常用句,这让我对电脑的理解更加深入。
在自己不了解的领域做一些复杂的东西确实很令人痛苦,但学到的东西往往比从头开始学的更加深奥、深刻,也能让人快速上手一门技能。
最后一次实验,令人感慨万千,回想起一路走来的磕磕绊绊,觉得自己成长了许多,从第一次翻开python书,从第一次在键盘上敲出'helllo world',都让我感受到小小代码的神奇。有时候,学的越多,越明白自己还是有很多的不足之处,对于python和我自己来说,我只觉得我在初入门的阶段。
诚然,学什么东西都不容易,但这恰恰体现的学习的魅力,成长的路上很充实也很快乐。
在学习python的这条路上我还有很长一段要走,正如庄子所说:“吾生也有涯,而知也无涯。”
此次python学习告一段落,但后面还有更多需要我们踏上旅途,愿,此行山高路远。