zoukankan      html  css  js  c++  java
  • 基于pygame的一个小游戏


    class
    GameStats(): """跟踪游戏的统计信息""" #def __int__(self, ai_settings): def __init__(self, ai_settings): """初始化统计信息""" self.ai_settings = ai_settings self.reset_stats() # 让游戏 处于非活动状态 self.game_active = False # self.score = 0 #在任何场景 不应该重置最高得分 self.high_score = 0 def reset_stats(self): """初始化在游戏运行期间可能变化的统计信息""" self.ship_left = self.ai_settings.ship_limit self.level = 1
    import pygame
    from pygame.sprite import Sprite
    
    
    class Alien(Sprite):
        """表示单个外星人的类"""
    
        def __init__(self, ai_settings, screen):
            """初始化外星人并设置其初始位置"""
            super(Alien, self).__init__()
            self.screen = screen
            self.ai_settings = ai_settings
    
            # 加载外星人图像 并设置其rect属性
            self.image = pygame.image.load('image/alien.png')
            self.rect = self.image.get_rect()
    
            # 每个外星人最初都在屏幕左上角附近
            self.rect.x = self.rect.width
            self.rect.y = self.rect.height
    
            #储存外星人的准确位置
            self.x = float(self.rect.x)
    
        def blitme(self):
            """在指定位置绘画外星人"""
            self.screen.blit(self.image,self.rect)
    
        def update(self):
            """向右移动外星人"""
            self.x += (self.ai_settings.alien_speed_factor *
                        self.ai_settings.fleet_direction)
            self.rect.x = self.x
    
        def check_edges(self):
            """碰撞检测"""
            screen_rect = self.screen.get_rect()
            if self.rect.right >= screen_rect.right:
                return True
            elif self.rect.left <= 0:
                return  True
    # -*- coding: gb2312 -*-   
    import sys
    import pygame
    
    from settings import Settings  #导入必须正确 
    from ship import Ship
    import game_functions as gf
    
    from scoreboard import Scoreboard
    
    from alien import Alien
    from pygame.sprite import Group
    from game_stats import GameStats
    from button import Button
    
    #ctrl e 快速注释
    def run_game():
        """"""
        #初始化游戏穿件屏幕对象
        pygame.init()
        ai_settings = Settings()
    
        #ai_settings.ship_speed_factor=1.5
        screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
        pygame.display.set_caption("spider_play")
    
        #创建play按钮
        play_button = Button(ai_settings,screen,"Play")
        # 创建一个用于储存游戏统计信息的实例
        stats = GameStats(ai_settings)
        sb = Scoreboard(ai_settings,screen,stats)
        ship = Ship(ai_settings, screen)
        #创建一个用于储存子弹的编组
        bullets = Group()
        aliens = Group()
    
        # 创建一个外星人
        gf.create_fleet(ai_settings,screen,ship,aliens)
        #alien = Alien(ai_settings,screen)
    
    
        #主循环
        while True:
    
            # 扫描键盘
            gf.check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets)
    
            if stats.game_active:
                ship.update()
    
                gf.update_bullets(ai_settings, screen,stats,sb, ship, aliens, bullets)
                gf.update_aliens(ai_settings, stats,sb, screen, ship, aliens, bullets)
    
    
            gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button)
    
    run_game()
    # -*- coding: gb2312 -*-   
    import pygame
    from pygame.sprite import Sprite
    
    
    class Bullet(Sprite):
        """"一个对飞船发射子弹进行管理的类"""
        def __init__(self,ai_settings,screen,ship):
            """"在飞船所处位置创造一个子弹对象"""
            super(Bullet,self).__init__()
            self.screen = screen
            
            #在(0,0)出创建一个表示子弹的矩形,在设置正确的位置
            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
            #更新子弹 rect 
            self.rect.y =self.y
        
        def draw_bullet(self):
            """"在屏幕上位置子弹"""
            pygame.draw.rect(self.screen,self.color,self.rect )
         
    import pygame.font
    
    class Button():
        def __init__(self,ai_settings,screen,msg):
            """初始化按钮的属性"""
            self.screen = screen
            self.screen_rect = screen.get_rect()
    
            #设置按钮的尺寸和其他属性
            self.width,self.height = 200,50
            self.button_color = (0,255,0)
            self.text_color = (255,255,255)
            self.font = pygame.font.SysFont(None,48)
    
            #创建按钮的rect对象 并使其居中
            self.rect = pygame.Rect(0,0,self.width,self.height)
            self.rect.center = self.screen_rect.center
    
            #按钮的标签只需要创建一次
            self.prep_msg(msg)
    
        def prep_msg(self,msg):
            """将msg渲染为图像并将其居中"""
            self.msg_image = self.font.render(msg,True,self.text_color,self.button_color)
            self.msg_image_rect = self.msg_image.get_rect()
            self.msg_image_rect.center = self.rect.center
    
        def draw_button(self):
            # 绘制一个颜色填充按钮,在绘制文本
            self.screen.fill(self.button_color,self.rect)
            self.screen.blit(self.msg_image,self.msg_image_rect)
    # -*- coding: gb2312 -*-   
    import sys
    import pygame
    from bullet import Bullet
    from alien import Alien
    from time import sleep
    
    def ship_hit(ai_settings,stats,sb,screen,ship,aliens,bullets):
        """相应被外星人撞到的飞船"""
        if stats.ship_left > 0:
    
            # 将 ships_left -=1
            stats.ship_left -= 1
            # 更新记分牌
            sb.prep_ships()
    
            # 清空外星人列表和子弹列表
            aliens.empty()
            bullets.empty()
    
            #创建一群新的外星人,并将飞创放到屏幕低端 中央
            create_fleet(ai_settings,screen,ship,aliens)
            ship.center_ship()
    
            #暂停
            sleep(0.5)
        else:
            stats.game_active = False
            pygame.mouse.set_visible(True)
    
    def get_number_aliens_x(ai_settings , alien_width):
        """"计算外星人数量"""
        available_space_x = ai_settings.screen_width - 2*alien_width
        number_aliens_x = int(available_space_x/(2*alien_width))
        return number_aliens_x
    
    def create_alien(ai_settings, screen, aliens, alien_number,row_number):
        """"创建一个外星人并将其放在当前行"""
        # 创建一行外星人
        alien = Alien(ai_settings,screen)
        alien_width = alien.rect.width
        alien.x = alien_width + 2*alien_width*alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2*alien.rect.height*row_number
        aliens.add(alien)
    
    
    def create_fleet(ai_settings,screen,ship,aliens):
        """创建外星人群"""
        # 创建一个外星人,并计算可容纳多少个外星人
        # 外星人间距为外星人宽度
        alien = Alien(ai_settings,screen)
        number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width)
        number_rows = get_number_rows(ai_settings,ship.rect.height,alien.rect.height)
    
        #穿件第一行外星人
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                #创建一行外星人
                create_alien(ai_settings,screen,aliens,alien_number,row_number)
    
    def get_number_rows(ai_settings,ship_height,alien_height):
        """"计算可以容纳的行数"""
        available_apace_y = (ai_settings.screen_height-(3*alien_height)-ship_height)
        get_number_rows = int(available_apace_y/(2*alien_height))
        return  get_number_rows-1
    
    
    
    def check_keydown_events(event,ai_settings,screen,ship,bullets):
        """"相应按键"""
        if event.key == pygame.K_RIGHT:
            # 向右移动飞船
            # ship.rect.centerx +=1
            ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            # 向右移动飞船
            # ship.rect.centerx +=1
            ship.moving_left = True
        elif event.key == pygame.K_SPACE:
            fire_bullet(ai_settings,screen,ship,bullets)
        elif event.key == pygame.K_q:
            sys.exit()
    
    
    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)
    
    
    def check_keyup_events(event,ship):
        """松开按键"""
        if event.key == pygame.K_RIGHT:
            ship.moving_right =False
        elif event.key == pygame.K_LEFT:
            # 向右移动飞船
            # ship.rect.centerx +=1
            ship.moving_left = False    
    
    
    def check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,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)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_x,mouse_y = pygame.mouse.get_pos()
                check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y)
    
    
    def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y):
        """"在玩家单击paly按钮的时候开始新游戏"""
        button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)
        if button_clicked and not stats.game_active:
            # 重置游戏速度
            ai_settings.initialize_dynamic_settings()
    
            #隐藏光标
            pygame.mouse.set_visible(False)
            # 重置游戏统计信息
            stats.reset_stats()
            stats.game_active = True
            # 重置记分牌图像
            sb.prep_score()
            sb.prep_high_score()
            sb.prep_level()
            sb.prep_ships()
            #清空外星人列表 和 子弹列表
            aliens.empty()
            bullets.empty()
    
            #创建一群新的外星人,并让飞船居中
            create_fleet(ai_settings,screen,ship,aliens)
            ship.center_ship()
    
    
    def update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_bytton):
        """更新屏幕上的图像,并切换到新屏幕"""
        #重绘屏幕
        screen.fill(ai_settings.bg_colors)  # 括号会导致严重问题 但是不会报错
        # print(ai_settings.bg_colors)
        # screen.fill(bg_color)
        # 在飞船和外星人相遇后重绘所有子弹
        for bullet in bullets.sprites():
            bullet.draw_bullet() 
        ship.blitme()
        aliens.draw(screen)
        #显示得分
        sb.show_score()
    
        #如果游戏处于非活动状态 就绘制play按钮
        if not stats.game_active:
            play_bytton.draw_button()
        # 刷新屏幕
        pygame.display.flip()
    
    
    def update_bullets( ai_settings, screen,stats,sb, ship, aliens, bullets):
        """更新子弹位置,并删除已小时的子弹  检测碰撞"""
        # 更新子弹的位置
        bullets.update()
        # 删除已经消失的子弹  子弹距离小于0的时候要删除列表
        for bullet in bullets.copy():  # 复制一个新的列表 以便解决。。。
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        # 检查是否有子弹击中了外星人
        # 如果 删除相应的子弹和外星人
        check_buttet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets)
    
    def check_buttet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets):
        """
        相应子弹和外星人的碰撞
        :param ai_settings: 
        :param screen: 
        :param ship: 
        :param aliens: 
        :param bullets: 
        :return: 
        """
        collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
        if collisions:
            for aliens in collisions.values():
                stats.score += ai_settings.alien_points * len(aliens)
                sb.prep_score()
            check_high_score(stats,sb)
            #stats.score += ai_settings.alien_points
            #sb.prep_score()
    
        if len(aliens) == 0 :
            #删除现有的子弹并创建一群外星人
            bullets.empty()
            ai_settings.increase_speed()
            # 提高等级
            stats.level += 1
            sb.prep_level()
            create_fleet(ai_settings, screen, ship, aliens)
    
    
    def update_aliens(ai_settings,screen,stats,sb,ship,aliens,bullets):
        """更新外星人人群中所有外星人的位置"""
        check_fleet_edges(ai_settings,aliens)
        aliens.update()
        # 检测外星人和非常之间的碰撞
        if pygame.sprite.spritecollideany(ship,aliens) :
            ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets)
            print("ship hit !!!")
    
        # 检查是否有到达底端的飞船
        check_aliens_bottom(ai_settings,screen,stats,sb,ship,aliens,bullets)
    
    
    
    
    def check_fleet_edges(ai_settings,aliens):
        """有外星人到达边缘时应采取措施"""
        for alien in aliens.sprites():
            if alien.check_edges():
                change_fleet_direction(ai_settings, aliens)
                break
    
    def change_fleet_direction(ai_settings,aliens):
        """
        下移动应该变方向
        :param ai_settings:
        :param aliens:
        :return:
        """
        for alien in aliens.sprites():
            alien.rect.y += ai_settings.fleet_drop_speed
    
        ai_settings.fleet_direction *= -1
    
    
    def check_aliens_bottom(ai_settings,stats,sb,screen,ship,aliens,bullets):
        """检查是否有诶创到达了底端"""
        screen_rect = screen.get_rect()
        for alien in aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # 飞创被撞到
                ship_hit(ai_settings,stats,sb,screen,ship,aliens,bullets)
                break
    
    def check_high_score(stats,sb):
        """检查是否产生了最高分"""
        if stats.score > stats.high_score:
            stats.high_score = stats.score
            sb.prep_high_score()
    # -*- coding: gb2312 -*-   
    
    class Settings():
        
        """设置系统使用变量"""
        def __init__(self):
            
            
            #"""初始化游戏的设置"""
            #屏幕设置
            self.screen_width =1200
            self.screen_height =800
            self.bg_colors=(230,230,230)
            #self.bg_color =(230,230,230)
    # -*- coding: gb2312 -*-   
    import sys
    import pygame
    
    def run_game():
        """"""
        #初始化游戏穿件屏幕对象
        pygame.init()
        screen =pygame.display.set_mode((1200,800))
        pygame.display.set_caption("spider_play")
        
        #设置背景颜色
        bg_color=(230,230,230)
        
        #主循环
        while True:
            #扫描键盘
            for event in pygame.event.get():
                if event.type==pygame.quit:
                    sys.exit()
            #重绘屏幕
            screen.fill(bg_color)        
            #刷新屏幕
            pygame.display.flip()
        
    run_game()
    import requests
    
    # 执行API调用并储存相应
    url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
    r = requests.get(url)
    print("Status code :",r.status_code)
    
    # 将api响应储存在一个变量中
    response_dict = r.json()
    print("Total repositories:",response_dict['total_count'])
    # 探索有关仓库信息
    repo_dicts = response_dict['items']
    print("Repositories returned:",len(repo_dicts))
    
    # 研究第一个仓库
    repo_dicts = repo_dicts[0]
    print("
     keys:",len(repo_dicts))
    for key in sorted(repo_dicts.keys()):
        print(key)
    # 处理结果
    
    #print(response_dict.keys())
    import pygame.font
    from  pygame.sprite import  Group
    
    from ship import Ship
    
    
    class Scoreboard():
        """显示得分信息的类"""
    
        def __init__(self,ai_settings,screen,stats):
            """初始化显示得分涉及的属性"""
            self.screen = screen
            self.screen_rect = screen.get_rect()
            self.ai_settings = ai_settings
            self.stats = stats
    
            # 显示得分信息使用的字体
            self.text_color = (30,30,30)
            self.font = pygame.font.SysFont(None,48)
    
            # 准备初始得分图像
            self.prep_score()
            # 准备包含最高得分 和 当前得分的图像
            self.prep_high_score()
            self.prep_level()
            self.prep_ships()
    
    
    
        def prep_score(self):
            """将得分渲染为为一副图片"""
            rounded_score = int(round(self.stats.score,-1)) #精确多少位小数 -1 代表精确到 10的倍数
            score_str = "{:,}".format(rounded_score)
            #score_str = str(self.stats.score)
            self.score_image = self.font.render(score_str,True,self.text_color,self.ai_settings.bg_colors)
    
    
            #将得分放在屏幕右上角
            self.score_rect = self.score_image.get_rect()
            self.score_rect.right = self.screen_rect.right -20
            self.score_rect.top = 20
    
        def show_score(self):
            """在屏幕上显示得分"""
            self.screen.blit(self.score_image,self.score_rect)
            self.screen.blit(self.high_score_image,self.high_score_rect)
            self.screen.blit(self.level_image,self.level_rect)
            # 绘制飞船
            self.ships.draw(self.screen)
    
        def prep_high_score(self):
            """将最高分转换为渲染的图像"""
            high_score = int(round(self.stats.high_score,-1))
            high_score_str = "{:,}".format(high_score)
            self.high_score_image = self.font.render(high_score_str,True,self.text_color,self.ai_settings.bg_colors)
    
            #将最高的纷纷放到屏幕顶部中央
            self.high_score_rect = self.high_score_image.get_rect()
            self.high_score_rect.centerx = self.screen_rect.centerx
            self.high_score_rect.top = self.score_rect.top
    
        # class image_int():
        #     # 定义图像相关属性
        #     def
    
        def display_text(self,number,text_color,bg_color,x,y):
            """
    
            :param number:
            :param text_color:
            :param bg_color:
            :param x:
            :param y:
            :return:
            """
            #images = {'a':3231,'b':13}
            #images['a']=
            num = int(round(number,0))
            num_str = "{:,}".format(num)
            images = self.font.render(num_str,True,text_color,bg_color)
    
            #将最高的纷纷放到屏幕顶部中央
            rect = images.get_rect()
            rect.centerx = x
            rect.top = y
    
            return images ,rect
    
        def prep_level(self):
            """将等级转换为渲染的图像"""
            #images = {'a':self.level_image,'b':self.level_rect}
            self.level_image,self.level_rect =self.display_text(self.stats.level,self.text_color,self.ai_settings.bg_colors,self.score_rect.right,self.score_rect.bottom+10)
    
        def prep_ships(self):
            """显示 还余下多少艘飞船"""
            self.ships = Group()
            for ship_number in range (self.stats.ship_left):
                ship = Ship(self.ai_settings,self.screen)
                ship.rect.x = 10 + ship_number * ship.rect.width
                ship.rect.y = 10
                self.ships.add(ship)
    # -*- coding: gb2312 -*-   
    import pygame
    
    class Settings():
        
        """设置系统使用变量"""
        def __init__(self):
            #"""初始化游戏的设置"""
            #屏幕设置
            self.screen_width =1200
            self.screen_height =800
            self.bg_colors=(230,230,230)
            #self.image =pygame.image.load ('image/bg.jpg')
            #$self.rect =self.image.get_rect()
            #飞船的设置
            self.ship_speed_factor = 1.5
            #self.bg_color =(230,230,230)
            self.ship_limit = 3
            
            #子弹设置
            self.bullet_speed_factor = 2
            self.bullet_width =   3 # 3
            self.bullet_height = 15
            self.bullet_color = (60, 60, 60)
            self.bullets_allowed = 3 #最多能存在3颗子弹
    
            # 外星人设置
            self.alien_speed_factor = 3
            self.fleet_drop_speed = 10
            #方向
            self.fleet_direction = 1
    
            #以什么样的速度加快游戏
            self.speedup_scale = 1.1
            # 外星人点数的提高速速
            self.score_scale = 1.5
    
            self.initialize_dynamic_settings()
    
        def initialize_dynamic_settings(self):
            """随游戏进行而变化的量"""
            self.ship_speed_factor = 1.5
            self.bullet_speed_factor = 3
            self.alien_speed_factor = 1
    
            # fleet_direction 位1表示向右 为-1表示向左
            self.fleet_direction = 1
            #积分点
            self.alien_points = 50
    
        def increase_speed(self):
            """提高速度设置  和外星人价值"""
            self.ship_speed_factor *= self.speedup_scale
            self.bullet_speed_factor *= self.speedup_scale
            self.alien_speed_factor *= self.speedup_scale
    
            self.alien_points = int(self.alien_points * self.score_scale)
            print(self.alien_points)
    # -*- coding: gb2312 -*-   
    import pygame
    from pygame.sprite import Sprite
    
    class Ship(Sprite):
    
        def __init__(self,ai_settings,screen):        
            """初始化飞船初始位置"""
            super(Ship, self).__init__()
            self.screen =screen
            self.ai_settings = ai_settings  #获取速度设定
            
            #加载飞船图像并获取矩形外形
            self.image = pygame.image.load('image/ship.png')
            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 update(self):
            """根据移动标志移动飞船位置"""
            #更新飞船的center值不是rect
            if self.moving_right and self.rect.right<self.screen_rect.right:
                self.center +=self.ai_settings.ship_speed_factor
                
            if self.moving_left and self.rect.left>0:
                self.center -=self.ai_settings.ship_speed_factor
            #分局self.centr 更新rect对象
            self.rect.centerx=self.center
            
        def blitme(self):  #函数应该与  int对齐
            
            """"指定位置绘制飞船"""
    
            self.screen.blit(self.image,self.rect)
        
        def center_ship(self):
            """让飞船在屏幕上居中"""
            self.center =self.screen_rect.centerx
        

    你只要替换相关的有意思图片就可以实现各种有意思的东西

  • 相关阅读:
    随机森林算法参数调优
    BAYES和朴素BAYES
    阿里云 金融接口 token PHP
    PHP mysql 按时间分组 表格table 跨度 rowspan
    MySql按周,按月,按日分组统计数据
    PHP 获取今日、昨日、本周、上周、本月的等等常用的起始时间戳和结束时间戳的时间处理类
    thinkphp5 tp5 会话控制 session 登录 退出 检查检验登录 判断是否应该跳转到上次url
    微信 模板消息
    php 腾讯 地图 api 计算 坐标 两点 距离 微信 网页 WebService API
    php添加http头禁止浏览器缓存
  • 原文地址:https://www.cnblogs.com/polar-lights/p/9065988.html
Copyright © 2011-2022 走看看