l-wj

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学习告一段落,但后面还有更多需要我们踏上旅途,愿,此行山高路远。


 

posted on 2022-05-30 23:20  刘伟洁  阅读(136)  评论(0编辑  收藏  举报