V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zhaoxiaofeng
V2EX  ›  Python

新手学习《 Python 编程:从入门到实践》遇到了个问题

  •  
  •   zhaoxiaofeng · 316 天前 · 1510 次点击
    这是一个创建于 316 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在跟练《外星人入侵》这个项目时遇到了个问题,希望大佬可以帮忙看下

    飞船不能用键盘控制,即使是执行随时附赠的代码也是一样

    下面是代码

    alien_invasion.py

    import sys  # 导入 sys 模块,用于退出程序
    import pygame  # 导入 pygame 模块,用于创建游戏窗口和处理事件
    from settings import Settings
    from ship import Ship
    
    
    class AlienInvasion:  # 定义一个类,表示外星人入侵的游戏
        """一个管理游戏资源和行为的类"""
    
        def __init__(self) -> None:  # 定义初始化方法,设置游戏的属性
            """初始化游戏并创建游戏资源"""
            pygame.init()  # 初始化 pygame ,准备显示模式和其他设置
            self.settings = Settings()
            self.clock = pygame.time.Clock()  # 创建一个时钟对象,用于控制游戏的帧率
            self.screen = pygame.display.set_mode(
                (self.settings.screen_height, self.settings.screen_width)
            )  # 创建一个屏幕对象,设置分辨率为 3842x2160
            pygame.display.set_caption("Alien Invasion")  # 设置屏幕的标题为“Alien Invasion”
            # 设置背景色
            # self.bg_color = (230, 230, 230)
            self.ship = Ship(self)
    
        def run_game(self):
            """开始游戏的主循环"""
            while True:
                self._check_events()
                self._update_screen()
                # 每秒钟最多更新 60 次画面
                self.clock.tick(60)
    
        def _check_events(self):
            for event in pygame.event.get():
                # 如果用户单击了关闭按钮,退出程序
                if event.type == pygame.QUIT:
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_RIGHT:
                        self.ship.moving_right = True
                    elif event.key == pygame.K_LEFT:
                        self.ship.moving_left = True
                        # self.ship.rect.x += 1
                elif event.type == pygame.KEYUP:
                    if event.key == pygame.K_RIGHT:
                        self.ship.moving_right = False
                    elif event.key == pygame.K_LEFT:
                        self.ship.moving_left = False
    
        def _update_screen(self):
            # 每次循环都重绘屏幕
            self.screen.fill(self.settings.bg_color)
            self.ship.blitme()
            # 更新屏幕上的图像,并切换到新屏幕
            pygame.display.flip()
    
    
    if __name__ == "__main__":
        # 创建游戏实例并运行游戏
        ai = AlienInvasion()
        ai.run_game()
    
    
    if __name__ == "__main__":
        # 创建游戏实例并运行游戏
        ai = AlienInvasion()
        ai.run_game()
    

    ship.py

    import pygame  # 导入 pygame 模块,用于创建游戏窗口和处理图形
    
    
    class Ship:
        """一个表示飞船的类"""
    
        def __init__(self, ai_game) -> None:
            """初始化飞船并设置其初始位置"""
            self.screen = ai_game.screen  # 获取游戏窗口对象
            self.screen_rect = ai_game.screen.get_rect()  # 获取游戏窗口的矩形属性
    
            self.image = pygame.image.load(
                "E:/alien_invasion/images/ship.bmp"
            )  # 加载飞船的图像文件
            self.rect = self.image.get_rect()  # 获取飞船图像的矩形属性
    
            self.rect.midbottom = self.screen_rect.midbottom  # 将飞船的中下方对齐到游戏窗口的中下方
            # 移动标志(飞船一开始不移动)
            self.moving_right = False
            self.moving_left = False
    
        def update(self):
            if self.moving_right:
                self.rect.x += 1
            if self.moving_left:
                self.rect.x -= 1
    
        def blitme(self):
            """在指定位置绘制飞船"""
            self.screen.blit(self.image, self.rect)  # 使用 pygame 的 blit 方法将飞船图像绘制到游戏窗口上
    
    
    12 条回复    2023-06-10 00:55:19 +08:00
    cnsdytedison
        1
    cnsdytedison  
       316 天前 via Android
    你上下左右接打印调试一下呗。
    dlsflh
        2
    dlsflh  
       316 天前 via Android
    这是新手吗?我是新新手。
    Serialize
        3
    Serialize  
       316 天前
    我也在看看这本书,我直接看那个分析数据的部分了,跳过了做游戏的
    yushenglin
        4
    yushenglin  
       316 天前
    断点看看,按下按键视图有没有刷新了
    zhaoxiaofeng
        5
    zhaoxiaofeng  
    OP
       316 天前
    @Serialize 这个项目是不是没有必要跟,实际上 pygame 基本上没有人使用吗?
    wliansheng
        6
    wliansheng  
       316 天前
    @zhaoxiaofeng py 在实际生产中,很少做游戏。用来学习 py 可以。一般是后台,数据,网络,方面。
    bloomcannon166
        7
    bloomcannon166  
       316 天前
    ship 类的 update 方法没加上
    lightcreater
        9
    lightcreater  
       316 天前
    我在 B 站黑马课程上也学过用 PYGAME 做飞机大战
    按键监听是这样写的,可以正常运行

    def __jianting(self):

    key_pressed = pygame.key.get_pressed()
    if key_pressed[pygame.K_RIGHT]:
    self.hero_group.update(-2)
    elif key_pressed[pygame.K_LEFT]:
    self.hero_group.update(2)

    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    self.__gameover()
    elif event.type == sprite_model.ENEMY_TIMER:
    enemy1 = sprite_model.enemy()
    self.enemy_group.add(enemy1)
    elif event.type == sprite_model.BULL_TIMER:
    self.hero.fire()
    # elif event.type == pygame.KEYDOWN and event.KEY == pygame.K_RIGHT:
    # pass
    Serialize
        10
    Serialize  
       316 天前
    @wliansheng 我的目标是学一下爬虫啥的,所以对游戏那部分不是特别敢兴趣,这个主要是看你自己的目标是啥
    wufumina
        11
    wufumina  
       316 天前
    代码看起来基本正确,但是在代码中缺少了`Settings`类的定义。这个类是用于管理游戏的设置和属性的。你需要添加`Settings`类的定义,并确保在`AlienInvasion`类的`__init__`方法中实例化一个`Settings`对象并将其赋值给`self.settings`属性。

    以下是一个简单的`Settings`类的示例,你可以根据自己的需求进行调整:

    ```python
    class Settings:
    """存储《外星人入侵》的所有设置的类"""

    def __init__(self):
    """初始化游戏的设置"""
    # 屏幕设置
    self.screen_width = 1200
    self.screen_height = 800
    self.bg_color = (230, 230, 230)
    ```

    将上述`Settings`类的定义添加到你的代码中,并在`AlienInvasion`类的`__init__`方法中添加以下代码来实例化一个`Settings`对象:

    ```python
    self.settings = Settings()
    ```

    这样就能够正常运行游戏,并使用自定义的设置。
    zhaoxiaofeng
        12
    zhaoxiaofeng  
    OP
       315 天前
    破案了···经过逐行比对,是 run_game 里面少调用了飞船的 update 方法
    ,再次谢谢大家
    def run_game(self):
    """开始游戏的主循环"""
    while True:
    self._check_events()
    self.ship.update()#缺的内容
    self._update_screen()
    # 每秒钟最多更新 60 次画面
    self.clock.tick(60)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2856 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:02 · PVG 21:02 · LAX 06:02 · JFK 09:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.