python小游戏——飞机大战代码开源
Posted 小刘在C站
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python小游戏——飞机大战代码开源相关的知识,希望对你有一定的参考价值。
♥️作者:小刘在这里
♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生!
♥️夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至。
目录
一.效果呈现
二,主代码
'''
主题:
简易飞机大战
'''
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小游戏——飞机大战代码开源的主要内容,如果未能解决你的问题,请参考以下文章