鱼C论坛

 找回密码
 立即注册
查看: 2091|回复: 7

问:081Pygame:提高游戏的颜值 课后习题

[复制链接]
发表于 2017-8-17 20:16:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位鱼油好 我是刚学Python的小白。今天刚刚看完第81讲的视频,因为我找不到在哪里能看到55讲后面的课后作业但是老师却在视频上说过有作业 不过说这次作业有一个是实现老师在视频最后展示的程序功能所以我就争取做了(其实之前的很多作业因为没有鱼币做不了哈哈哈(除了只靠每天抢第一签到拿一点以外)

那么废话了那么久 以下进正题了:
我根据老师给出的需求 写出了以下的代码(我的代码很多跟着老师在视频里打的一样的) 但是还有很多的BUG 还有很多的没完善的地方 还有一些功能并不知道怎么解决 想请各位大神帮我看看我的代码,哪里可以优化一下 哪里的问题可以解决 代码工整和写代码的习惯 我都希望能得到指导一下 先和大家说声谢谢啦

代码如下:
import pygame
import sys
from pygame.locals import *

#初始化Pygame
pygame.init()

modes = pygame.display.list_modes()

background = pygame.image.load("bg.jpg")

size = modes[17]
speed = [1, 0]

#创建指定大小的窗口 (返回一个Surface对象)
screen = pygame.display.set_mode(size, RESIZABLE)


#设置窗口标题
pygame.display.set_caption("81讲课后作业")

# 设置放大缩小的比率
ratio = 1.0

ophoto = pygame.image.load("QQ.jpg")
photo = ophoto
ophoto_rect = ophoto.get_rect()
position = photo_rect = ophoto_rect
clock = pygame.time.Clock()

fullscreen = False

l_head = photo
r_head = pygame.transform.flip(photo, True, False)

#播放背景音乐
pygame.mixer.music.load("music.ogg")
pygame.mixer.music.play(loops=-1, start=0.0)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.mixer.music.fadeout(1000)
            sys.exit()

        # 按鼠标进行加速
        if event.type == MOUSEBUTTONDOWN:
            pressed_button = pygame.mouse.get_pressed()
            for index in range(len(pressed_button)):
                if index == 0:
                    if speed[0] != 0 and speed[0] > 0:
                        speed[0] += 1
                    if speed[1] != 0 and speed[1] > 0:
                        speed[1] += 1
                    if speed[0] != 0 and speed[0] < 0:
                        speed[0] -= 1
                    if speed[1] != 0 and speed[1] < 0:
                        speed[1] -= 1
        
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                photo = l_head
                speed = [-1, 0]
            if event.key == K_RIGHT:
                photo = r_head
                speed = [1, 0]
            if event.key == K_UP:
                speed = [0, -1]
            if event.key == K_DOWN:
                speed = [0, 1]
                
            #全屏(F11)
            if event.key == K_F11:
                fullscreen = not fullscreen
                if fullscreen:
                    screen = pygame.display.set_mode(modes[0], FULLSCREEN | HWSURFACE)
                    width, height = modes[0]
                else:
                    screen = pygame.display.set_mode(size)

            #放大、缩小图片(=、-),空格键恢复原始尺寸

            if event.key == K_EQUALS or event.key == K_MINUS or event.key == K_SPACE:
                #最大只能放大一倍,缩小50%
                if event.key == K_EQUALS and ratio < 2:
                    ratio += 0.1
                if event.key == K_MINUS and ratio > 0.5:
                    ratio -= 0.1
                if event.key == K_SPACE:
                    ratio = 1.0

                photo = pygame.transform.smoothscale(ophoto, \
                                             (int(ophoto_rect.width * ratio), \
                                             int(ophoto_rect.height * ratio)))

                l_head = photo
                r_head = pygame.transform.flip(photo, True, False)

            #同时按住Ctrl+s缩小分辨率 和 同时按住Ctrl+b增加分辨率
            if event.key == K_b and KMOD_CTRL:
                i = modes.index(size)
                if i != 0:
                    screen = pygame.display.set_mode(modes[i-1])
                    width, height = modes[i-1]
                else:
                    pass

            if event.key == K_s and KMOD_CTRL:
                i = modes.index(size)
                modes_limit = len(modes)
                try:
                    if i != modes_limit:
                        screen = pygame.display.set_mode(modes[i+1])
                        width, height = modes[i+1]
                    else:
                        pass
                except IndexError:
                    pass
              

        #用户调整窗口尺寸
        if event.type == VIDEORESIZE:
            size = event.size
            width, height = size
            screen = pygame.display.set_mode(size, RESIZABLE)
    
    #移动图像
    position = position.move(speed)

    if position.left < 0 or position.right > width:
        #翻转图像
        photo = pygame.transform.flip(photo, True, False)
        #反方向移动
        speed[0] = -speed[0]

    if position.top <0 or position.bottom > height:
        speed[1] = -speed[1]

    #填充背景
    screen.blit(background,(0, 0))
    #更新图像
    screen.blit(photo, position)
    #更新界面
    pygame.display.flip()
    #延迟
    clock.tick(200)

以下是我自己总结出自己的代码的一些问题 (很多问题我也有上网查过 但是.....)
1:草地背景----------------------OK(并不完美 在调节大小的时候 分辨率大的时候会超出图片范围)
2:西游记背景音乐----------------OK
3:点击鼠标左键加速--------------OK(存在BUG:不管是左键右键还是中间滑轮 都是会加速的 并未找到解决方案)
4:按Ctrl+s缩小分辨率------------OK
5:按Ctrl+b增加分辨率------------OK
6:滚动滑轮可以使其透明化
7:按+放大-----------------------OK(备注问题未解决)
8:按-减小-----------------------OK(备注问题未解决)

备注:7、8点注意放大的头的方向问题 原始方向是 眼睛在左边
        还有放大后走到超过边界会卡在边界(如果缩小的话 还会整个图像不见了)的问题

(第6个要求我还没有去研究找方法)

评分

参与人数 2荣誉 0 鱼币 0 收起 理由
冬雪雪冬 + 5 + 5 给你补回来吧
向西而笑 -5 -5 毅力可嘉!给你鱼币

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-8-17 21:41:08 | 显示全部楼层
给我评分的大哥 你是不是按错了 你扣了我5个鱼币,我本来就只有十多个...现在就剩几个了.....   (当我想给你发个消息的时候 还发现我没权限... 只能留个言了....好了 刚刚发现留言也不够权限)

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
向西而笑 + 5 + 5 捂脸~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-8-17 21:50:02 | 显示全部楼层
小龙虾大侠 发表于 2017-8-17 21:41
给我评分的大哥 你是不是按错了 你扣了我5个鱼币,我本来就只有十多个...现在就剩几个了.....    ...

不好意思,搞错了,我以为是扣自己的鱼币。
话说这还能扣别人的鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-17 22:13:56 | 显示全部楼层
向西而笑 发表于 2017-8-17 21:50
不好意思,搞错了,我以为是扣自己的鱼币。
话说这还能扣别人的鱼币

哈哈没事没事 谢谢了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-18 01:24:29 | 显示全部楼层
有趣 解决了鼠标左键加速的BUG  之前进死胡同了
        # 按鼠标进行加速
        if event.type == MOUSEBUTTONDOWN:
            if event.button == 1:
                if speed[0] != 0 and speed[0] > 0:
                    speed[0] += 1
                if speed[1] != 0 and speed[1] > 0:
                    speed[1] += 1
                if speed[0] != 0 and speed[0] < 0:
                    speed[0] -= 1
                if speed[1] != 0 and speed[1] < 0:
                    speed[1] -= 1

这样就不会出现不管是左键右键还是中间滑轮 都是会加速的现象了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-18 02:15:59 | 显示全部楼层
请问楼主,到底怎样找到55讲以后的课后作业啊多谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-18 13:11:21 | 显示全部楼层
Wesleyz 发表于 2017-8-18 02:15
请问楼主,到底怎样找到55讲以后的课后作业啊多谢了

啊 我也不知道呀 貌似只是更新到55讲
我这个作业是看老师的视频的时候 听他说的作业 然后就直接做的 并没有找到文字详解版的
所以也不知道参考答案 就只能在这里问问大家我的代码能如何修改优化了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2018-5-25 00:36:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-24 14:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表