新手学习《 Python 编程:从入门到实践》遇到了个问题 - V2EX
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 2023-06-09 01:25:49 +08:00 2440 次点击
    这是一个创建于 922 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    下面是代码

    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.scren.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  
       2023-06-09 07:28:46 +08:00 via Android
    你上下左右接打印调试一下呗。
    dlsflh
        2
    dlsflh  
       2023-06-09 09:27:51 +08:00 via Android
    这是新手吗?我是新新手。
    Serialize
        3
    Serialize  
       2023-06-09 10:09:15 +08:00
    我也在看看这本书,我直接看那个分析数据的部分了,跳过了做游戏的
    yushenglin
        4
    yushenglin  
       2023-06-09 10:12:05 +08:00
    断点看看,按下按键视图有没有刷新了
    zhaoxiaofeng
        5
    zhaoxiaofeng  
    OP
       2023-06-09 10:54:11 +08:00
    @Serialize 这个项目是不是没有必要跟,实际上 pygame 基本上没有人使用吗?
    wliansheng
        6
    wliansheng  
       2023-06-09 11:17:20 +08:00
    @zhaoxiaofeng py 在实际生产中,很少做游戏。用来学习 py 可以。一般是后台,数据,网络,方面。
    bloomcannon166
        7
    bloomcannon166  
       2023-06-09 12:12:05 +08:00
    ship 类的 update 方法没加上
    Alias4ck
        8
    Alias4ck  
       2023-06-09 12:26:25 +08:00
    lightcreater
        9
    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
        10
    Serialize  
       2023-06-09 15:06:59 +08:00
    @wliansheng 我的目标是学一下爬虫啥的,所以对游戏那部分不是特别敢兴趣,这个主要是看你自己的目标是啥
    BaldPhoenix
        11
    BaldPhoenix  
       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
        12
    zhaoxiaofeng  
    OP
       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)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1287 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:13 PVG 01:13 LAX 09:13 JFK 12:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86