python小游戏——飞机大战代码开源

Posted 小刘在C站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python小游戏——飞机大战代码开源相关的知识,希望对你有一定的参考价值。

♥️作者:小刘在这里

♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生!

♥️夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至。

目录

一.效果呈现

 二,主代码

三,cfg

四,README


一.效果呈现

 二,主代码

'''
主题:
    简易飞机大战

'''
import sys
import cfg
import pygame
from modules import *


'''游戏界面'''
def GamingInterface(num_player, screen):
    # 初始化
    pygame.mixer.music.load(cfg.SOUNDPATHS['Cool Space Music'])
    pygame.mixer.music.set_volume(0.4)
    pygame.mixer.music.play(-1)
    explosion_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['boom'])
    fire_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['shot'])
    font = pygame.font.Font(cfg.FONTPATH, 20)
    # 游戏背景图
    bg_imgs = [cfg.IMAGEPATHS['bg_big'], cfg.IMAGEPATHS['seamless_space'], cfg.IMAGEPATHS['space3']]
    bg_move_dis = 0
    bg_1 = pygame.image.load(bg_imgs[0]).convert()
    bg_2 = pygame.image.load(bg_imgs[1]).convert()
    bg_3 = pygame.image.load(bg_imgs[2]).convert()
    # 玩家, 子弹和小行星精灵组
    player_group = pygame.sprite.Group()
    bullet_group = pygame.sprite.Group()
    asteroid_group = pygame.sprite.Group()
    # 产生小行星的时间间隔
    asteroid_ticks = 90
    for i in range(num_player):
        player_group.add(Ship(i+1, cfg))
    clock = pygame.time.Clock()
    # 分数
    score_1, score_2 = 0, 0
    # 游戏主循环
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        # --玩家一: ↑↓←→控制, j射击; 玩家二: wsad控制, 空格射击
        pressed_keys = pygame.key.get_pressed()
        for idx, player in enumerate(player_group):
            direction = None
            if idx == 0:
                if pressed_keys[pygame.K_UP]:
                    direction = 'up'
                elif pressed_keys[pygame.K_DOWN]:
                    direction = 'down'
                elif pressed_keys[pygame.K_LEFT]:
                    direction = 'left'
                elif pressed_keys[pygame.K_RIGHT]:
                    direction = 'right'
                if direction:
                    player.move(direction)
                if pressed_keys[pygame.K_j]:
                    if player.cooling_time == 0:
                        fire_sound.play()
                        bullet_group.add(player.shot())
                        player.cooling_time = 20
            elif idx == 1:
                if pressed_keys[pygame.K_w]:
                    direction = 'up'
                elif pressed_keys[pygame.K_s]:
                    direction = 'down'
                elif pressed_keys[pygame.K_a]:
                    direction = 'left'
                elif pressed_keys[pygame.K_d]:
                    direction = 'right'
                if direction:
                    player.move(direction)
                if pressed_keys[pygame.K_SPACE]:
                    if player.cooling_time == 0:
                        fire_sound.play()
                        bullet_group.add(player.shot())
                        player.cooling_time = 20
            if player.cooling_time > 0:
                player.cooling_time -= 1
        if (score_1 + score_2) < 500:
            background = bg_1
        elif (score_1 + score_2) < 1500:
            background = bg_2
        else:
            background = bg_3
        # --向下移动背景图实现飞船向上移动的效果
        screen.blit(background, (0, -background.get_rect().height + bg_move_dis))
        screen.blit(background, (0, bg_move_dis))
        bg_move_dis = (bg_move_dis + 2) % background.get_rect().height
        # --生成小行星
        if asteroid_ticks == 0:
            asteroid_ticks = 90
            asteroid_group.add(Asteroid(cfg))
        else:
            asteroid_ticks -= 1
        # --画飞船
        for player in player_group:
            if pygame.sprite.spritecollide(player, asteroid_group, True, None):
                player.explode_step = 1
                explosion_sound.play()
            elif player.explode_step > 0:
                if player.explode_step > 3:
                    player_group.remove(player)
                    if len(player_group) == 0:
                        return
                else:
                    player.explode(screen)
            else:
                player.draw(screen)
        # --画子弹
        for bullet in bullet_group:
            bullet.move()
            if pygame.sprite.spritecollide(bullet, asteroid_group, True, None):
                bullet_group.remove(bullet)
                if bullet.player_idx == 1:
                    score_1 += 1
                else:
                    score_2 += 1
            else:
                bullet.draw(screen)
        # --画小行星
        for asteroid in asteroid_group:
            asteroid.move()
            asteroid.rotate()
            asteroid.draw(screen)
        # --显示分数
        score_1_text = '玩家一得分: %s' % score_1
        score_2_text = '玩家二得分: %s' % score_2
        text_1 = font.render(score_1_text, True, (0, 0, 255))
        text_2 = font.render(score_2_text, True, (255, 0, 0))
        screen.blit(text_1, (2, 5))
        screen.blit(text_2, (2, 35))
        # --屏幕刷新
        pygame.display.update()
        clock.tick(60)


'''主函数'''
def main():
    pygame.init()
    pygame.font.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode(cfg.SCREENSIZE)
    pygame.display.set_caption('简易版——飞机大战 ')
    num_player = StartInterface(screen, cfg)
    if num_player == 1:
        while True:
            GamingInterface(num_player=1, screen=screen)
            EndInterface(screen, cfg)
    else:
        while True:
            GamingInterface(num_player=2, screen=screen)
            EndInterface(screen, cfg)


'''run'''
if __name__ == '__main__':
    main()

三,cfg

'''配置文件'''
import os


'''屏幕大小'''
SCREENSIZE = (956, 560)
'''字体路径'''
FONTPATH = os.path.join(os.getcwd(), 'resources/font/simkai.ttf')
'''图片路径'''
IMAGEPATHS =
    'asteroid': os.path.join(os.getcwd(), 'resources/images/asteroid.png'),
    'bg_big': os.path.join(os.getcwd(), 'resources/images/bg_big.png'),
    'bullet': os.path.join(os.getcwd(), 'resources/images/bullet.png'),
    'seamless_space': os.path.join(os.getcwd(), 'resources/images/seamless_space.png'),
    'ship': os.path.join(os.getcwd(), 'resources/images/ship.png'),
    'ship_exploded': os.path.join(os.getcwd(), 'resources/images/ship_exploded.png'),
    'space3': os.path.join(os.getcwd(), 'resources/images/space3.jpg'),

'''声音路径'''
SOUNDPATHS =
    'boom': os.path.join(os.getcwd(), 'resources/sounds/boom.wav'),
    'Cool Space Music': os.path.join(os.getcwd(), 'resources/sounds/Cool Space Music.mp3'),
    'shot': os.path.join(os.getcwd(), 'resources/sounds/shot.ogg'),

四,README

# Introduction
https://mp.weixin.qq.com/s/n-f_6sh8bB7-dtIFJLbnFg

# Environment
```
OS: Windows10
Python: Python3.5+(have installed necessary dependencies)
```

# Usage
```
Step1:
pip install -r requirements.txt
Step2:
run "python Game10.py"
```

# Game Display
![giphy](demonstration/running.gif)

♥️关注,就是我创作的动力

♥️点赞,就是对我最大的认可

♥️这里是小刘,励志用心做好每一篇文章,谢谢大家

python学习——飞机大战之初期

在开始正式编写飞机大战游戏之前,对pygame所提供的模块进行学习,以下代码只是验证了一些功能,并不能进行飞机大战游戏。

在开始正式的编写代码之前一定一定要先调用pygame.init()方法,并相应的调用pygame.quit()方法,这里要养成好的习惯,把成对出现的代码一并写好,以免最后忘记写,而导致错误,然后在pygame.init()与pygame.quit()之间写游戏代码。

import pygame #导入pygame模块,pygame是专门设计用来设计游戏的python模块。
from plane_sprites import* #此模块继承了pygame中sprite类中Sprite方法,有了此模块后不需要每次都进行处理图像加载、绘制图像等代码
pygame.init()#加载pygame的模块
screen = pygame.display.set_mode((480,850))#利用set_mode方法创建游戏的主窗口,set_mode方法有三个缺省参数,第一个位元组,指定屏幕的大小,默认屏幕与窗口大小一致,第二个为标志位,默认为0,第三个为深度,默认也为0,注意set_mode方法有返回结果,返回一个Surface对象,需要变量记录此返回结果,此程序中由screen接收返回结果,后续的图像绘制都在此窗口上进行
background = pygame.image.load("./image/background.png")#调用load方法加载背景图像,load方法中传入背景图像所在位置,.表示当前目录
screen.blit(background,(0,0)) #screen调用blit方法,在刚刚创建的窗口中绘制背景图像,bilt方法需要传入两个参数第一个为背景图像,第二个为背景图像绘制的位置,此参数可以为元组,也可以为矩形对象,如果想要看到绘制的图像还需要调用display模块中的update()方法,此方法更新屏幕显示,所以最好一起写出来两个方法
hero = pygame.image.load("./image/hero.gif")#加载英雄图片 screen.blit(hero,(200,400))#在制定位置绘制英雄图片 pygame.display.update()#更新屏幕显示 ,可以在窗口上看到刚刚绘制英雄的图片,一定要记住无论绘制什么图像最后都要调用此方法,否则在游戏窗口中看不到所绘制的图像 clock = pygame.time.Clock()#创建时钟对象 hero_rect = pygame.Rect(200,400,100,124)#调用Rect()方法,Rect()方法用来描述矩形对象,接收4个参数分别是位置参数,x,y代表绘制图像的位置,以及矩形的宽高,用hero_rect变量来记录英雄图片的位置 enemy0 = GameSprite("./image/enemy0_down1.png")#GameSprite类的实例化,并传入相应参数,speed为默认值 enemy1 = GameSprite("./image/enemy0_down2.png",speed = 2) enemy_group = pygame.sprite.Group(enemy0,enemy1)#调用精灵组方法 while True:#游戏循环,游戏正式开始,产生相应的动画效果,(所谓动画效果就是静止图片快速移动,产生的视觉效果就是连续的,所以就需要调用一种方法使图像快速移动,快速更新)以上都是游戏的准备工作,下面就是可以是图片可以连续移动的代码   clock.tick(60)#游戏刷新帧率,tick()方法会根据上次被调用的时间,设置循环中的延时,tick()可以指定循环体内部的代码执行频率   hero_rect.y -= 1#使英雄图片向上移动   if hero_rect.y <= -124: #判断英雄图片是否移出屏幕,如果移出则将英雄图片重新放到背景图片底部     hero_rect.y = 800   screan.blit(background,(0,0)) #重新绘制背景图片,然后把每一张图片重新绘制到新的背景图片上,否则会出现重影现象   screan.blit(hero ,hero_rect)#在hero_rect上绘制英雄图像,hero_rect实际是记录英雄图片移动的每一帧  
enemy_group.update()
#调用精灵组中update方法,使精灵组中所有精灵调用update方法   enemy_group.draw(screen) #调用精灵组中的draw方法,使精灵组中所有精灵绘制到screen上   pygame.display.update() #更新屏幕显示 pygame.quit()#卸载所有pygame模块

 



以上是关于python小游戏——飞机大战代码开源的主要内容,如果未能解决你的问题,请参考以下文章

python学习——飞机大战之初期

Python小游戏飞机大战源码

Python小游戏之 - 飞机大战美女 !

python(pygame)滑稽大战(类似飞机大战) 教程

500行代码,教你用python写个微信飞机大战

如何用用python写飞机大战?