#---------------------------------------------------备注--------------------------------------------------------------------------
#这游戏是学习 (类,函数,循环,条件,判断)的简单小游戏;
#运行环境:python-3.2.5,pygame-1.9.2a0.win32-py3.2;
#---------------------------------------------------END--------------------------------------------------------------------------
# -*- coding: utf-8 -*-import pygameimport randomfrom pygame.locals import *from sys import exitpygame.init()class FeiJi:def __init__(self,x,y):self.x = xself.y = yself.image = pygame.image.load('C://Users//bad//Desktop//python-test//image//feiji.png')def restart(self):self.x = 200self.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]=Trueelif event.key==K_a:keys[1]=Trueelif event.key==K_s:keys[2]=Trueelif event.key==K_d:keys[3]=Trueif event.type==pygame.KEYUP:if event.key==K_w:keys[0]=Falseelif event.key==K_a:keys[1]=Falseelif event.key==K_s:keys[2]=Falseelif event.key==K_d:keys[3]=False#-----------------------------------# 按键 的操作if keys[0]==True:if self.y > 0:self.y-=0.3if keys[1]==True:if self.x > 0:self.x-=0.3if keys[2]==True:if self.y < 600 - feiji.image.get_height():self.y+=0.3if 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#设置石头下落速度 def speed(self):self.y+=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.speed()if self.y > 600:self.active = Falseelse:self.restart()#-----------------------------------#---------------END-----------------class ZiDan(FeiJi): def __init__(self):self.x=feiji.xself.y=feiji.yself.image = pygame.image.load('C://Users//bad//Desktop//python-test//image//zidan.png')self.active = False#设置子弹发射速度def speed(self):self.y-=0.8#重置子弹def restart(self):self.active = Trueself.y=feiji.yself.x=feiji.x + 7#子弹的发射 def she(self):if self.active:self.speed()if self.y < 0:self.active = Falseelse:self.restart()#-----------------------------------#---------------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 #初始化积分zidan_jiange = 500 #子弹发射间隔时间zidan_index = 0 #引导子弹组#------------------------END----------------------------------------------------------------------------------#----------------------实例化类--------------------------------------------------------------------------------feiji = FeiJi(200,500) #实例化-飞机shitou = [] #实例化-石头组for s in range(5): #设置实例化数目 shitou.append(ShiTou())#-----------(5个)zidan = [] #实例化-子弹组for z in range(5): #设置实例化数目 zidan.append(ZiDan())#-----------(5个)#------------------------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 = Trues.down()screen.blit(s.image, (s.x,s.y))zidan_jiange -= 1#设置子弹组循环发射if zidan_jiange < 0:zidan_jiange = 500#子弹发射间隔zidan[zidan_index].restart()#子弹组发射zidan_index = (zidan_index + 1) % 5#设置子弹组循环发射for z in zidan:#加载 子弹组 图像并且调用子弹射击的方法z.she()screen.blit(z.image, (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))#文本-游戏restartscreen.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]=Trueif event.type==pygame.KEYUP:if event.key==K_r:keys[4]=Falseif keys[4]==True:jifen = 0 #积分清零screen.blit(feiji.image, (200,500))#加载飞机图像for s in shitou:s.restart()for z in zidan:z.active = Falsekeys = [False, False, False, False, False]#按键初始化(w,a,s,d,r) gameover = False#刷新屏幕 pygame.display.flip()新闻热点
疑难解答