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

2023-06-09 01:25:49 +08:00
 zhaoxiaofeng

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

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

下面是代码

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 方法将飞船图像绘制到游戏窗口上

1800 次点击
所在节点    Python
12 条回复
cnsdytedison
2023-06-09 07:28:46 +08:00
你上下左右接打印调试一下呗。
dlsflh
2023-06-09 09:27:51 +08:00
这是新手吗?我是新新手。
Serialize
2023-06-09 10:09:15 +08:00
我也在看看这本书,我直接看那个分析数据的部分了,跳过了做游戏的
yushenglin
2023-06-09 10:12:05 +08:00
断点看看,按下按键视图有没有刷新了
zhaoxiaofeng
2023-06-09 10:54:11 +08:00
@Serialize 这个项目是不是没有必要跟,实际上 pygame 基本上没有人使用吗?
wliansheng
2023-06-09 11:17:20 +08:00
@zhaoxiaofeng py 在实际生产中,很少做游戏。用来学习 py 可以。一般是后台,数据,网络,方面。
bloomcannon166
2023-06-09 12:12:05 +08:00
ship 类的 update 方法没加上
Alias4ck
2023-06-09 12:26:25 +08:00
lightcreater
2023-06-09 14:33:56 +08:00
我在 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
2023-06-09 15:06:59 +08:00
@wliansheng 我的目标是学一下爬虫啥的,所以对游戏那部分不是特别敢兴趣,这个主要是看你自己的目标是啥
wufumina
2023-06-09 17:59:05 +08:00
代码看起来基本正确,但是在代码中缺少了`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
2023-06-10 00:55:19 +08:00
破案了···经过逐行比对,是 run_game 里面少调用了飞船的 update 方法
,再次谢谢大家
def run_game(self):
"""开始游戏的主循环"""
while True:
self._check_events()
self.ship.update()#缺的内容
self._update_screen()
# 每秒钟最多更新 60 次画面
self.clock.tick(60)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/947141

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX