PYGAME入门之飞机大战

本文通过pygame库实现了一个简单的飞机大战游戏,玩家可以控制飞机移动并发射子弹消灭敌人。游戏包括玩家飞机、子弹及敌机等元素,并实现了碰撞检测等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pygame的入门,基本都是讲飞机大战,跟随着他人的教程自己摸索了一遍。素材都是自己下载的

#!/usr/bin/env python

"""
This is the full and final example from the Pygame Tutorial,
"How Do I Make It Move". It creates 10 objects and animates
them on the screen.

Note it's a bit scant on error checking, but it's easy to read. :]
Fortunately, this is python, and we needn't wrestle with a pile of
error codes.
"""


#import everything
import os, pygame
from pygame.locals import *
from random import randint

main_dir = os.path.split(os.path.abspath(__file__))[0]
SCREEN_WIDTH=800
SCRREN_HIGHT=600
offset = {pygame.K_LEFT:0, pygame.K_RIGHT:0, pygame.K_UP:0, pygame.K_DOWN:0}

#quick function to load an image
def load_image(name):
    path = os.path.join(main_dir, 'data', name)
    return pygame.image.load(path).convert_alpha()

class Player(pygame.sprite.Sprite):

	def __init__(self,surface,position):
		pygame.sprite.Sprite.__init__(self)
		self.image=surface
		self.rect=self.image.get_rect()
		self.rect.topleft=position
		self.speed=6
		self.bullets=pygame.sprite.Group()    #添加子弹精灵组

	def move(self,offset):
		x=self.rect.left+offset[pygame.K_RIGHT] - offset[pygame.K_LEFT]
		y=self.rect.top+offset[pygame.K_DOWN] - offset[pygame.K_UP]
		if x<0:
			self.rect.left=0
		elif x>SCREEN_WIDTH-self.rect.width:
			self.rect.left=SCREEN_WIDTH-self.rect.width
		else:
			self.rect.left=x

		if y<0:
			self.rect.top=0
		elif y>SCRREN_HIGHT-self.rect.height:
			self.rect.top=SCRREN_HIGHT-self.rect.height
		else:
			self.rect.top=y

	def  single_shoot(self,surface):
		buttle_signle=Bullet(surface,self.rect.midtop)   #在midtop位置添加子弹
		self.bullets.add(buttle_signle)      #在精灵组中添加一颗子弹


class Bullet(pygame.sprite.Sprite):
	"""docstring for Bullet"""
	def __init__(self, surface,position):
		super(Bullet, self).__init__()   #调用父类的初始化,和line31功能一样
		self.image = surface
		self.rect=self.image.get_rect()
		self.rect.topleft=position
		self.speed=10

	def update(self):
		self.rect.top-=self.speed
		if self.rect.top<-self.rect.height:
			self.kill()        #删除精灵

class Enemy(pygame.sprite.Sprite):
	"""docstring for Enemy"""
	def __init__(self, surface,position):
		super(Enemy, self).__init__()
		self.image=surface
		self.rect=self.image.get_rect()
		self.rect.topleft=position
		self.speed=3

	def update(self):
		self.rect.top+=self.speed
		if self.rect.top>SCRREN_HIGHT:
			self.kill()

						
		

#here's the full code
def main():
    print("欢迎,按A射击")
    ticks=0
    clock = pygame.time.Clock()
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH,SCRREN_HIGHT))
    pygame.display.set_caption("飞机大战")

    player = load_image('plane.png')
    player=pygame.transform.scale(player,(int(SCREEN_WIDTH/10),int(SCRREN_HIGHT/10)))

    background= load_image('background.png')
    background=pygame.transform.scale(background,(SCREEN_WIDTH,SCRREN_HIGHT))

    bullet_surface=load_image('buttle.jpg').subsurface(164,120,10,18)

    enemy=load_image('enemy.png').subsurface(128,145,80,60)
    enemy=pygame.transform.scale(enemy,(60,40))
    enemy_group=pygame.sprite.Group()    #添加敌人精灵组

    game_over=load_image('over.jpg')
    game_over=pygame.transform.scale(game_over,(SCREEN_WIDTH,SCRREN_HIGHT))

    player1=Player(player,(400,600))
    while True:
    	clock.tick(60)             #60HZ的刷新
    	ticks+=1
    	screen.blit(background,(0,0))
    	screen.blit(player1.image,player1.rect)
    	player1.move(offset)
    	player1.bullets.update()
    	player1.bullets.draw(screen)
    	enemy_group.update()
    	enemy_group.draw(screen)
    	if ticks%50==0:
    		enemy_new=Enemy(enemy,(randint(0,SCREEN_WIDTH-enemy.get_width()),-enemy.get_height()))
    		enemy_group.add(enemy_new)

    	pygame.sprite.groupcollide(player1.bullets,enemy_group,True,True)   #检测子弹与敌人有没有相撞,如果相撞就把子弹和敌人消除
    	if len(pygame.sprite.spritecollide(player1,enemy_group,True,False))>0:
    		print ("loss")
    		break
    	pygame.display.update()   #图片更新应对是放在最后一步,先绘制背景,在绘制飞机,在绘制子弹,最后刷新
    	for event in pygame.event.get():
    		if event.type == pygame.QUIT:
    			pygame.quit()
    			exit()
    		elif event.type==pygame.KEYUP:
    			if event.key in offset:
    				offset[event.key]=0
    		elif event.type==pygame.KEYDOWN:
    			if event.key in offset:
    				offset[event.key]=10
    			elif event.key==K_a:
    				player1.single_shoot(bullet_surface)

    while True:
    	screen.blit(game_over,(0,0))
    	pygame.display.update()   #图片更新应对是放在最后一步,先绘制背景,在绘制飞机,在绘制子弹,最后刷新
    	for event in pygame.event.get():
    		if event.type == pygame.QUIT:
    			pygame.quit()
    			exit()



if __name__ == '__main__': main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值