zoukankan      html  css  js  c++  java
  • [python] 小游戏

      GitHub:https://github.com/liqingwen2015/play_plane

      目前只做了第一部分:一个界面,有个飞机,可以左右移动,放子弹。

      暂无计划做第二部分。

      alien_invasion.py

    import sys
    
    import pygame
    
    from settings import Settings
    from ship import Ship
    import game_functions as gf
    from pygame.sprite import Group
    
    def run_game():
        # 初始化游戏并创建一个屏幕对象
        pygame.init()
        ai_settings = Settings()
        screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screnn_height))
        pygame.display.set_caption('Alien Invasion')
    
        # 创建一艘飞船
        ship = Ship(ai_settings, screen)
        # 创建一个存储的子弹组
        bullets = Group()
    
        # 设置背景色
        bg_color = (230, 230, 230)
    
        # 开始游戏的主循环
        while True:
            gf.check_events(ai_settings, screen, ship, bullets)
            ship.update()
            gf.update_bullets(bullets)
            gf.update_screen(ai_settings, screen, ship, bullets)
    
    run_game()

      bullet.py

    import pygame
    
    from pygame.sprite import Sprite
    
    class Bullet(Sprite):
    
        def __init__(self, ai_settings, screen, ship):
            super(Bullet, self).__init__()
            self.screen = screen
    
            self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)
            self.rect.centerx = ship.rect.centerx
            self.rect.top = ship.rect.top
    
            # 存储用小数表示的子弹位置
            self.y = float(self.rect.y)
    
            self.color = ai_settings.bullet_color
            self.speed_factor = ai_settings.bullet_speed_factor
    
        def update(self):
            self.y -= self.speed_factor
            # 更新子弹位置
            self.rect.y = self.y
    
        def draw_bullet(self):
            pygame.draw.rect(self.screen, self.color, self.rect)

      game_functions

    import sys
    
    import pygame
    
    from bullet import Bullet
    
    
    def check_events(ai_settings, screen, ship, bullets):
        # 监听键盘和鼠标的事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                check_keydown_events(event, ai_settings, screen, ship, bullets)
            elif event.type == pygame.KEYUP:
                check_keyup_events(event, ship)
    
    
    def update_screen(ai_settings, screen, ship, bullets):
        # 每次循环时都重绘屏幕
        screen.fill(ai_settings.bg_color)
    
        # 在飞船和外星人后面重绘所有子弹
        for bullet in bullets.sprites():
            bullet.draw_bullet()
    
        ship.blitme()
    
        # 让最近绘制的屏幕可见
        pygame.display.flip()
    
    def check_keydown_events(event, ai_settings, screen, ship, bullets):
        if event.key == pygame.K_RIGHT:
            ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            ship.moving_left = True
        elif event.key == pygame.K_SPACE:
            # 创建一颗子弹,并将其加入到编组 bullets 中
            fire_bullet(ai_settings, screen, ship, bullets)
    
    def check_keyup_events(event, ship):
        if event.key == pygame.K_RIGHT:
            ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            ship.moving_left = False
    
    def update_bullets(bullets):
        bullets.update()
    
        # 删除已经消失的子弹
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
    
    def fire_bullet(ai_settings, screen, ship, bullets):
        if len(bullets) < ai_settings.bullets_allowed:
            new_bullet = Bullet(ai_settings, screen, ship)
            bullets.add(new_bullet)

      settings.py

    class Settings():
    
        def __init__(self):
            # 屏幕设置
            self.screen_width = 1200
            self.screnn_height = 800
            self.bg_color = (230, 230, 230)
    
            self.ship_speed_factor = 1.5
    
            # 子弹设置
            self.bullet_speed_factor = 1
            self.bullet_width = 3
            self.bullet_height = 15
            self.bullet_color = 60, 60, 60
            self.bullets_allowed = 5

      ship.py

    import pygame
    
    class Ship():
    
        def __init__(self, ai_settings, screen):
            self.screen = screen
            self.ai_settings = ai_settings
    
            # 加载飞船图像并获取其外接矩形
            self.image = pygame.image.load('images/ship.bmp')
            self.rect = self.image.get_rect()
            self.screen_rect = screen.get_rect()
    
            # 将每艘新飞船放在屏幕底部中央
            self.rect.centerx = self.screen_rect.centerx
            self.rect.bottom = self.screen_rect.bottom
    
            # 在飞船的属性 center 中存储小数值
            self.center = float(self.rect.centerx)
    
            # 移动标识
            self.moving_right = False
            self.moving_left = False
    
        def blitme(self):
            # 屏幕指定位置绘制飞船
            self.screen.blit(self.image, self.rect)
    
        def update(self):
            if self.moving_right and self.rect.right < self.screen_rect.right:
                self.center += self.ai_settings.ship_speed_factor
            elif self.moving_left and self.rect.left > 0:
                self.center -= self.ai_settings.ship_speed_factor
    
            # 更新 rect 对象
            self.rect.centerx = self.center
  • 相关阅读:
    PermissionError: [Errno 1] Operation not permitted: '/tmp/tmpg255ml7f' -> '/tmp/jieba.cache'
    远程连接MySql
    Unity 连接MySql数据库
    Unity WIndows语音识别(一)关键字识别
    Mac M1原生(ARM64)Golang dev&debug
    记一次思考:中级开发的突破之道
    深入web workers (上)
    indexDB出坑指南(二)
    html+css展示空白类字符的技巧
    前端冷知识
  • 原文地址:https://www.cnblogs.com/liqingwen/p/6763962.html
Copyright © 2011-2022 走看看