使用pygame做的小游戏之大战外星人

游戏截图:

个人最高纪录11级,九百万分(手指头给点烂了.jpg)

玩法介绍!!!!

鼠标点击play开始游戏

wasd键控制上下左右

空格发射子弹

q键退出游戏

注意:

1,本游戏数值增加很快,到了后面会出现发射子弹结果外星人穿过去的结果.jpg

2,开局只能发射五颗子弹,后面不缺

3,只有三条命,用完就结束,可以点play重玩

整体代码分为多个模块还有图片和音乐文件,所有文件已打包,解压后,image和music文件夹中是图片和音乐,.exe是游戏主体,双击开始游戏(emm)

参考文章如下:

1,打包软件:

http://t.csdn.cn/wIiqv

2,pygame中加入图片: 

http://t.csdn.cn/nrKhH 

3,pygame中加入音乐:

http://t.csdn.cn/n1FBe  

代码如下: 

1,主体 

import sys
import pygame
from settings import Settings
from time import sleep
from game_stats import GameStats
from my_ship import MY_ship
from bullets import Bullet
from alien import Alien
from button import Button
from score import Score



class Alien_game:
    def __init__(self):
        """初始化"""
        pygame.init()
        self.settings = Settings()
        """屏幕界面"""
        self.clock = pygame.time.Clock()
        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height))
        self.ship = MY_ship(self)
        pygame.display.set_caption('Player vs Alien')
        """组"""
        self.aliens = pygame.sprite.Group()
        self.bullets = pygame.sprite.Group()
        """添加外星人"""
        self._creat_fleet()
        self.stats = GameStats(self)
        """结束条件"""
        self.game_over = False
        """图"""
        self.play_button = Button(self,'play')

        self.s_b = Score(self)
    def run_game(self):
        pygame.font.init()
        background = pygame.image.load('images/1-1.png').convert()
        pygame.init()
        pygame.mixer.init()
        pygame.mixer.music.load('music/BJ_1.ogg')
        pygame.mixer.music.play(-1, start=0)

        while pygame.mixer.music.get_busy():

            # pygame.time.Clock().tick(10)
            self._check_events()
            if self.game_over:
                self._alien_update()
                self._update_bullets()
                self.ship.update()

            self._update_screen(background)

            self.clock.tick(60)

    def _update_screen(self, background):



        self.screen.fill(self.settings.sc_color)
        self.screen.blit(background, (0,0))
        self.ship.blitem()  # 绘制飞船
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.s_b.show_score()
        self.aliens.draw(self.screen)

        if not self.game_over:
            self.play_button.draw_button()

        pygame.display.flip()

    def check_alien(self):
        for alien in self.aliens.sprites():
            #print(1)
            if alien.rect.left <= 0:
                print(1)
                self._ship_hit()
                break

    # 玩家碰撞后结果
    def _ship_hit(self):
        if self.stats.ships_left >1 :
            self.stats.ships_left -= 1
            # print(self.stats.ships_left)
            self.bullets.empty()  # 重置子弹和alien
            self.aliens.empty()

            self._creat_fleet()  # 新建外星人和重置玩家位置
            self.ship.center_ship()

            sleep(0.5)  # 暂停0.5秒
        else:
            self.game_over = False
            pygame.mouse.set_visible(True)
    # 检测alien碰撞墙壁
    def _check_fleet_edges(self):
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    # 重置alien位移方向
    def _change_fleet_direction(self):
        for alien in self.aliens.sprites():
            alien.rect.x -= self.settings.alien_x_speed
        self.settings.fleet_direction *= -1

    # 检测外星人碰撞
    def _alien_update(self):
        self._check_fleet_edges()
        self.aliens.update()
        if pygame.sprite.spritecollideany(self.ship, self.aliens):

            self._ship_hit()
            # print('重铸1096之光,人人有责!')
        self.check_alien()

    # 生成alien并控制外星人位移
    def _creat_fleet(self):
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size

        current_y, current_x = 2 * alien_height, 25 * alien_width
        while current_x < (self.settings.screen_width - alien_width):
            while current_y < (self.settings.screen_height - 2 * alien_height):
                self._current_y(current_y, current_x)
                current_y += 2 * alien_width
            current_y = 2 * alien_height
            current_x += 2 * alien_width

    #   控制alien
    def _current_y(self, current_y, current_x):
        new_alien = Alien(self)
        new_alien.y = current_y
        new_alien.rect.y = current_y
        new_alien.rect.x = current_x
        self.aliens.add(new_alien)

    # 生成子弹
    def _update_bullets(self):
        self.bullets.update()
        for bullet in self.bullets.copy():
            if bullet.rect.left >= self.settings.screen_width:
                self.bullets.remove(bullet)

        self._check_bullet_()

    # 检测子弹的碰撞
    def _check_bullet_(self):
        collisions = pygame.sprite.groupcollide(
            self.bullets, self.aliens, True, True
        )
        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points *len(aliens)

            self.s_b.prep_score()
        if not self.aliens:
            self.bullets.empty()
            self._creat_fleet()

            self.settings.speed_up()
            self.stats.level += 1
            self.s_b.prep_level()



    # 键盘控制
    def _check_events(self):
        '''游戏主体循环'''

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mous_pop = pygame.mouse.get_pos()
                self._check_button(mous_pop)
            elif event.type == pygame.KEYDOWN:
                self._KEY_TR(event)
            elif event.type == pygame.KEYUP:
                self._KEY_FA(event)



    def _check_button(self,mous_pos):
        button_clicked = self.play_button.rect.collidepoint(mous_pos)
        if button_clicked and not self.game_over:


            self.game_over = True

            self.stats.rest_stats()
            self.s_b.prep_score()
            self.s_b.prep_level()
            self.bullets.empty()
            self.aliens.empty()

            self.ship.center_ship()
            self._creat_fleet()

            self.settings.speed_reduction()
            pygame.mouse.set_visible(False)
    # 刷新屏幕


    # 开火
    def _fire_bullet(self):
        if len(self.bullets) < self.settings.bullet_allowed:
            new_bullets = Bullet(self)
            self.bullets.add(new_bullets)

    def _KEY_TR(self, event):
        if event.key == pygame.K_d:
            self.ship.moving_right = True
        if event.key == pygame.K_a:
            self.ship.moving_left = True
        if event.key == pygame.K_w:
            self.ship.moving_top = True
        if event.key == pygame.K_s:
            self.ship.moving_bottom = True
        elif event.key == pygame.K_q:
            sys.exit()
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    def _KEY_FA(self, event):
        if event.key == pygame.K_d:
            self.ship.moving_right = False
        if event.key == pygame.K_a:
            self.ship.moving_left = False
        if event.key == pygame.K_w:
            self.ship.moving_top = False
        if event.key == pygame.K_s:
            self.ship.moving_bottom = False


if __name__ == '__main__':
    ai = Alien_game()
    ai.run_game()


2,外星人的属性

import pygame
from pygame.sprite import Sprite


class Alien(Sprite):
    def __init__(self, ai_game):
        super().__init__()
        self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()
        """图片"""
        self.image = pygame.image.load('images/enemy.png')
        self.rect = self.image.get_rect()
        """位置"""
        self.rect.topright = self.screen_rect.topright
        """记录水平位置"""
        self.x = self.rect.x
        self.y = self.rect.y

        self.settings = ai_game.settings

    def update(self):
        self.y += self.settings.alien_y_speed * self.settings.fleet_direction
        self.rect.y = self.y

    def check_edges(self):
        screen_rect = self.screen.get_rect()
        return (self.rect.top <= 0) or (self.rect.bottom >= screen_rect.bottom)

3, 子弹设置

import pygame


class Bullet(pygame.sprite.Sprite):
    def __init__(self, ai_game):
        super().__init__()  # 调用父类
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        self.color = self.settings.bullet_color

        self.rect = pygame.Rect(
            0, 0, self.settings.bullet_width, self.settings.bullet_height)
        self.rect.midleft = ai_game.ship.rect.midright

        self.x = self.rect.x

    def update(self):
        self.x += self.settings.bullet_speed
        self.rect.x = self.x

    def draw_bullet(self):
        pygame.draw.rect(self.screen, self.color, self.rect)

4, 按钮设置

import pygame.font

class Button:
    def __init__(self,ai_game,msg):
        self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()

        self.width,self.heigt = 200,50
        self.button_color = (0,135,0)
        self.text_color = (255,255,255)
        self.font = pygame.font.SysFont(None,48)

        self.rect = pygame.Rect(0,0,self.width,self.heigt)
        self.rect.center = self.screen_rect.center

        self._prep_msg(msg)

    def _prep_msg(self,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)

5, 分值设置

class GameStats:

    def __init__(self,ai_game):
        self.settings = ai_game.settings
        self.rest_stats()

    def rest_stats(self):
        self.ships_left = self.settings.ship_limit
        self.score = 0
        self.level = 1

 6,玩家飞船的设置

import pygame
from settings import Settings


class MY_ship:
    def __init__(self, ai_game):
        """初始化"""
        self.settings = Settings()

        """获取屏幕大小信息"""
        self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()
        """获取图片信息"""
        self.image = pygame.image.load('images/player.png')
        self.rect = self.image.get_rect()
        """控制飞船位置"""
        self.rect.midleft = self.screen_rect.midleft
        self.moving_right = False
        self.moving_left = False
        self.moving_top = False
        self.moving_bottom = False

    def update(self):
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.rect.x += self.settings.sp_x
        if self.moving_left and self.rect.left > 0:
            self.rect.x -= self.settings.sp_x
        if self.moving_top and self.rect.top > 0:
            self.rect.y -= self.settings.sp_y
        if self.moving_bottom and self.rect.bottom < self.screen_rect.bottom:
            self.rect.y += self.settings.sp_y

    def blitem(self):
        self.screen.blit(self.image, self.rect)

    def center_ship(self):

        self.rect.midleft = self.screen_rect.midleft
        self.y = self.rect.y
        self.x = self.rect.x

7, 把分数渲染成图片

import pygame.font

class Score:

    def __init__(self,ai_game):

        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        self.settings = ai_game.settings
        self.stats = ai_game.stats

        self.text_color = (30,30,30)
        self.font = pygame.font.SysFont(None,48)

        self.prep_score()
        self.prep_level()

    def prep_level(self):
        level_str = str(self.stats.level)
        self.level_image = self.font.render(level_str,True,self.text_color,self.settings.sc_color)
        self.level_rect = self.level_image.get_rect()
        self.level_rect.right = self.score_rect.right
        self.level_rect.top = self.score_rect.bottom + 10

    def prep_score(self):
        rounded_score = round(self.stats.score,-1)
        score_str = f'{rounded_score:,}'

        self.score_image = self.font.render(score_str,True,self.text_color,self.settings.sc_color)

        self.score_rect = self.score_image.get_rect()
        self.score_rect.left = self.screen_rect.left + 20
        self.score_rect.bottom = 50

    def show_score(self):
        self.screen.blit(self.score_image,self.score_rect)
        self.screen.blit(self.level_image,self.level_rect)

 8,游戏数值设置

class Settings:
    def __init__(self):
        """屏幕颜色和高宽"""
        self.sc_color = (230, 230, 230)
        self.screen_width = 1200
        self.screen_height = 800

        """飞船速度"""
        self.sp_x = 10
        self.sp_y = 10
        self.ship_limit = 3

        """子弹设置"""
        self.bullet_speed = 10
        self.bullet_width = 3
        self.bullet_height = 25
        self.bullet_color = (215, 45, 205)
        self.bullet_allowed = 5

        """alien速度"""
        self.alien_y_speed = 2
        self.alien_x_speed = 2
        self.fleet_direction = 1

        """速度提升"""
        self.speed_up_number = 1.5
        self.alien_points_upspeed = 2
        """还原"""
        self.speed_reduction()

    def speed_reduction(self):
        self.alien_y_speed = 2
        self.alien_x_speed = 2
        self.fleet_direction = 1

        self.sp_x = 5
        self.sp_y = 5
        self.ship_limit = 3

        self.bullet_speed = 10

        self.bullet_width = 3
        self.bullet_height = 25

        self.alien_points = 50

    def speed_up(self):
        self.alien_y_speed *= self.speed_up_number
        self.alien_x_speed *= self.speed_up_number

        self.sp_x *= self.speed_up_number
        self.sp_y *= self.speed_up_number

        self.bullet_speed *= self.speed_up_number

        self.bullet_width *=self.speed_up_number
        self.bullet_height *=self.speed_up_number

        self.alien_points *=self.alien_points_upspeed

每天都是杂鱼❤ 呢

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值