编程语言
首页 > 编程语言> > 20213422实验四 python综合实验

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()

        # 碰撞后物体与钩子衔接
        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))
                axis = (hook.rect.left + hook.rect.width / 2) - (miner.rect.height / 2) * math.cos(
                    math.radians(hook.angle))
                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)
        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)
        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:
        mod.show_back(2)
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                screens = 0
            if event.type == pygame.QUIT:
                sys.exit()

    # 失败界面
    elif screens == 3:
        mod.show_back(3)
        for event in pygame.event.get():
            if event.type == (pygame.MOUSEBUTTONDOWN or pygame.KEYDOWN):
                screens = 0
            if event.type == pygame.QUIT:
                sys.exit()

    # 成功界面
    if screens == 4:
        mod.show_back(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)

2.在云服务器上运行

不好运行。。安装了python3.5.2版本,用pip安装了pillow和pygame,但是似乎报错了,上网查资料也没能解决问题。。

最后查询的python版本还是2.7(┳Д┳)

pillow也没有安装上去

我是废物五五五五

三、课程及实验总结

本学期的主要学习的内容有

 

(1)变量赋值及其命名规则

(2)运算符及其优先级

(3)基本数据类型

(4)循环语句

(5)列表、元组、字典、集合及其常用功能

(6)字符串与正则表达式

(7)面向对象程序设计

(8)文件操作及异常处理

(9)Python操作数据库

(10)Python爬虫爬取想要的内容


       我确实没有想到最后的实验这么难,以至于搞了好几天都没能在云服务器上完美运行,不过在此期间我学习了很多东西,比如初学了一些做游戏常用的语句,也学习了一些命令常用句,这让我对电脑的理解更加深入。

       在自己不了解的领域做一些复杂的东西确实很令人痛苦,但学到的东西往往比从头开始学的更加深奥、深刻,也能让人快速上手一门技能。

       最后一次实验,令人感慨万千,回想起一路走来的磕磕绊绊,觉得自己成长了许多,从第一次翻开python书,从第一次在键盘上敲出'helllo world',都让我感受到小小代码的神奇。有时候,学的越多,越明白自己还是有很多的不足之处,对于python和我自己来说,我只觉得我在初入门的阶段。

       诚然,学什么东西都不容易,但这恰恰体现的学习的魅力,成长的路上很充实也很快乐。

       在学习python的这条路上我还有很长一段要走,正如庄子所说:“吾生也有涯,而知也无涯。”

       此次python学习告一段落,但后面还有更多需要我们踏上旅途,愿,此行山高路远。

 

标签:direction,python,miner,20213422,hook,实验,pygame,event,rect
来源: https://www.cnblogs.com/l-wj/p/16323535.html