python-小游戏(打飞机)v1.2(三发子弹)

本教程详细介绍了使用Python和Pygame库开发一款简单的飞机大战游戏的过程。游戏包括飞机、子弹及石头(敌机)等元素,并实现了键盘控制飞机移动、子弹发射、碰撞检测等功能。

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

---------------------------------备注-----------------------------------

运行环境 :

python --v3.2.5

pygame -- pygame-1.9.2a0.win32-py3.2

-------------------------------------------------------------------------

# -*- coding: utf-8 -*-
import pygame
import random
from pygame.locals import *
from sys import exit
pygame.init()


class FeiJi:
	
	def __init__(self,x,y):
		self.x = x
		self.y = y
		self.image = pygame.image.load('C:\\Users\\bad\\Desktop\\python-test\\image\\feiji.png')
		
	def restart(self):
		self.x = 200
		self.y = 500
		#加载 飞机 图像
		screen.blit(feiji.image, (feiji.x,feiji.y))
		
	def move(self):			
	#-----------------------------------
	#判断 按键 状态
		if event.type==pygame.KEYDOWN:
			if event.key==K_w:
				keys[0]=True
			elif event.key==K_a:
				keys[1]=True
			elif event.key==K_s:
				keys[2]=True
			elif event.key==K_d:
				keys[3]=True
				
		if event.type==pygame.KEYUP:
			if event.key==K_w:
				keys[0]=False
			elif event.key==K_a:
				keys[1]=False
			elif event.key==K_s:
				keys[2]=False
			elif event.key==K_d:
				keys[3]=False
	#-----------------------------------
	# 按键 的操作
		if keys[0]==True:
			if self.y > 0:
				self.y-=0.3
		if keys[1]==True:
			if self.x > 0:
				self.x-=0.3
		if keys[2]==True:
			if self.y < 600 - feiji.image.get_height():
				self.y+=0.3
		if keys[3]==True:
			if self.x < 300 - feiji.image.get_width():
				self.x+=0.3

	#-----------------------------------
	#---------------END-----------------
	
class ShiTou:
	
	def __init__(self):
		self.x = random.randint(0, 250)
		self.y = random.randint(-150, 0)
		self.image = pygame.image.load('C:\\Users\\bad\\Desktop\\python-test\\image\\shitou.png')
		self.active = False
		self.speed = random.random() + 0.2
		
		
		
	
	#重置石头			
	def restart(self):		
		self.x=random.randint(0, 250)
		self.y=random.randint(-200, 0)
		self.active = True
				
	#石头的下落
	def down(self):
		if self.active:
			if self.y < 600:
				self.y+=self.speed			#设置石头下落速度
			if self.y > 600:
				self.active = False
		else:
			self.restart()				
	#-----------------------------------
	#---------------END-----------------
	
class ZiDan: 
	
	def __init__(self):
		self.x=feiji.x
		self.y=feiji.y
		self.image_2 = pygame.image.load('C:\\Users\\bad\\Desktop\\python-test\\image\\zidan.png')
		self.image_1 = pygame.transform.rotate(self.image_2, 30)		
		self.image_3 = pygame.transform.rotate(self.image_2, 150)
		self.active = False
		self.speed = 1
		

	
	#重置子弹
	def restart(self):
		self.active = True
		self.y=feiji.y +15
		self.x=feiji.x + 7

	#子弹的发射	
	def she1(self):
		if self.active:
			self.y-=self.speed
			self.x-=self.speed
			if (self.y < 0) and (self.x < 0) :
				self.active = False
		else:
			self.y=-20
			self.x=-20
			
	def she2(self):
		if self.active:
			self.y-=self.speed
			if self.y < 0:
				self.active = False
		else:
			self.y=-20
			self.x=-20
			
	def she3(self):
		if self.active:
			self.y-=self.speed
			self.x+=self.speed
			if (self.y < 0) and (self.x > 300) :
				self.active = False
		else:
			self.y=-20
			self.x=-20
			
	#-----------------------------------
	#---------------END-----------------

#创建石头击落函数
#判断子弹是否击中石头,只需要判断子弹是否穿过石头。
#方法--判断子弹的x坐标是否大于石头图像左边的x坐标或者是否小于石头图像右边的x坐标
def CheckHit(zidan, shitou):
    if(shitou.x < zidan.x and zidan.x < shitou.x + shitou.image.get_width()) and (shitou.y < zidan.y and zidan.y < shitou.y + shitou.image.get_height()):
        shitou.active = False
        zidan.active = False
        return True
    return False

#创建飞机坠毁函数
#方法参考“CheckHit”
def CheckTouch(shitou, feiji):
    if (shitou.x + shitou.image.get_width() > feiji.x and feiji.x + feiji.image.get_width() > shitou.x) and (shitou.y + shitou.image.get_height() > feiji.y and feiji.y + feiji.image.get_height() > shitou.y):
        return True
    return False
		
#-------------------------------------------------------------------------------------------------------------
					
#---------------------设置游戏常数------------------------------------------------------------------------------
width,height=(300,600)										#设置游戏窗口大小
bg=pygame.image.load('C:\\Users\\bad\\Desktop\\python-test\\image\\black.png')#设置背景图路径
screen=pygame.display.set_mode((width,height))				#新建一个游戏窗口,窗口大小为(width,height)
font = pygame.font.Font(None, 32)							#游戏运行时的字体
font_over = pygame.font.Font(None, 128)						#游戏结束时的字体
pygame.display.set_caption("test-game")						#设置游戏窗口标题
keys = [False, False, False, False, False]					#按键初始化(w,a,s,d,r)		
gameover = False											#游戏状态
jifen = 0													#初始化积分
zidan1_jiange = 0											#子弹发射间隔时间
zidan2_jiange = 0
zidan3_jiange = 0
zidan_index = 0												#引导子弹组
#------------------------END----------------------------------------------------------------------------------
#----------------------实例化类--------------------------------------------------------------------------------
feiji = FeiJi(200,500)										#实例化-飞机	

shitou = []													#实例化-石头组
for s in range(5):											#设置实例化数目 
	shitou.append(ShiTou())									#-----------(5个)
	
zidan1 = []
for z in range(6):											#设置实例化数目 
	zidan1.append(ZiDan())	
	
zidan2 = []
for z in range(6):											#设置实例化数目 
	zidan2.append(ZiDan())
	
zidan3 = []
for z in range(6):											#设置实例化数目 
	zidan3.append(ZiDan())

#------------------------END----------------------------------------------------------------------------------					
while 1:#游戏主循环
	
		for event in pygame.event.get():
			if event.type==pygame.QUIT:
				pygame.quit() 
				exit(0)
		
		#screen.fill(0)												#将没有图像的空间填满(黑色)
		screen.blit(bg, (0,0))										#载入背景图
		screen.blit(feiji.image, (feiji.x,feiji.y))					#加载飞机图像

		if not gameover:											#判断游戏状态 
			text_jifen = font.render("Score: %d" %jifen, 0, (0, 0, 0))#文本-积分统计
			screen.blit(text_jifen, (0, 0))							#载入文本(积分统计)
			feiji.move()											#调用 飞机 移动的方法
			
			for s in shitou:										#加载 石头组 图像并且调用石头下落的方法
				if CheckTouch(s, feiji):
					gameover = True
				s.down()
				screen.blit(s.image, (s.x,s.y))

			zidan1_jiange -= 1									#设置子弹组循环发射
			if zidan1_jiange < 0:
				zidan1_jiange = 300						#子弹发射间隔
				zidan1[zidan_index].restart()						#子弹组发射
				zidan_index = (zidan_index + 1) % 6					#设置子弹组循环发射
				
			zidan2_jiange -= 1									#设置子弹组循环发射
			if zidan2_jiange < 0:
				zidan2_jiange = 300						#子弹发射间隔
				zidan2[zidan_index].restart()						#子弹组发射
				zidan_index = (zidan_index + 1) % 6					#设置子弹组循环发射
				
			zidan3_jiange -= 1									#设置子弹组循环发射
			if zidan3_jiange < 0:
				zidan3_jiange = 300						#子弹发射间隔
				zidan3[zidan_index].restart()						#子弹组发射
				zidan_index = (zidan_index + 1) % 6					#设置子弹组循环发射
					
#						
			for z in zidan1:											#加载 子弹组 图像并且调用子弹射击的方法
				z.she1()
				screen.blit(z.image_1, (z.x,z.y))
				for s in shitou:
					if (CheckHit(z, s)):							#调用 检查击中 函数,判断子弹是否击中 石头
						jifen+=100         							#当子弹 击中 石头,积分加 100
						
			for z in zidan2:											#加载 子弹组 图像并且调用子弹射击的方法
				z.she2()
				screen.blit(z.image_2, (z.x,z.y))
				for s in shitou:
					if (CheckHit(z, s)):							#调用 检查击中 函数,判断子弹是否击中 石头
						jifen+=100         							#当子弹 击中 石头,积分加 100
						
			for z in zidan3:											#加载 子弹组 图像并且调用子弹射击的方法
				z.she3()
				screen.blit(z.image_3, (z.x,z.y))
				for s in shitou:
					if (CheckHit(z, s)):							#调用 检查击中 函数,判断子弹是否击中 石头
						jifen+=100         							#当子弹 击中 石头,积分加 100
					
		else:
			text_restart = font.render("按 R 键重新游戏", 1, (0, 0, 0))	#文本-游戏restart
			screen.blit(text_restart, (100,350))						#载入文本(游戏restart)
			text_over = font.render("Game Over", 1, (0, 0, 0))			#文本-游戏结束
			screen.blit(text_over, (100,250))							#载入文本(游戏结束)
			text_jifen = font.render("Score: %d" %jifen, 1, (0, 0, 0))	#文本-获取的积分数
			screen.blit(text_jifen, (100, 300))							#载入文本(获取的积分数)
			if event.type==pygame.KEYDOWN:
				if event.key==K_r:										#按R键重新游戏
					keys[4]=True
			if event.type==pygame.KEYUP:
				if event.key==K_r:
					keys[4]=False
			if keys[4]==True:
				jifen = 0												#积分清零
				screen.blit(feiji.image, (200,500))						#加载飞机图像
				for s in shitou:
					s.restart()
				for z in zidan1:
					z.active = False
				for z in zidan2:
					z.active = False
				for z in zidan3:
					z.active = False
				keys = [False, False, False, False, False]				#按键初始化(w,a,s,d,r)	
				gameover = False
		
		
		
		
		#刷新屏幕		
		pygame.display.flip()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值