#2.完善游戏界面和功能

import pygame #导入pygame模块 import random import math #为了算开方引入数学模块 #1.初始化界面 pygame.init() #pygame用之前要初始化 screen=pygame.display.set_mode((1284,932)) #访问pygame窗口,设置窗口大小,set.mode()参数为一个元组,参数表示宽和高 pygame.display.set_caption('期末不挂科') #设置一个标题表示游戏的名字 icon = pygame.image.load('Ufo.jpg') #将目标图片导入icon作为图标 pygame.display.set_icon(icon) beijing=pygame.image.load('beijingtu.png') #设置背景图

#飞机 feiji=pygame.image.load('feiji.png') #设置飞机的图片 feijiX=642 #将飞机的位置定义为一个变量,并且给出初值,玩家飞机的x坐标 feijiY=750 #玩家飞机的y坐标 feijistep=0 #设置一个变量控制玩家的速度

#分数 score=0 ziti=pygame.font.Font('freesansbold.ttf',40) #创建字体,创建pggame里面font模块的fnot类,大小为32,freesansbold是pygame自带的字体文件,.ttf表示字体文件 def show_score(): text=f'score:{score}' #f格式字符串,表示字符串里面可以直接嵌入变量 score_render=ziti.render(text,True,(45,168,67)) screen.blit(score_render,(10,10))

#添加敌人 number_of_enemies=16 #敌人的数量 #敌人类 class Enemy(): #定义一个敌人的类 def init(self): self.img=pygame.image.load('enemy.png') self.X=random.randint(200,1000) self.Y=random.randint(50,350) self.step=random.randint(1,10) #敌人移动的速度 #当被射中时恢复位置 def reset(self): self.X=random.randint(200,600) self.Y=random.randint(50,200) enemies=[] #保存所有敌人的列表 for i in range(number_of_enemies): #利用for循环创建多个敌人 enemies.append(Enemy())

#两个点之间的距离 def distance(bX,bY,eX,eY): #bx,by表示子弹的坐标,ex,ey表示敌人的坐标 a=bX-bX b=bY-eY return math.sqrt(aa+bb)

#创建一个子弹的类 class Bullet(): #定义一个敌人的类 def init(self): self.img=pygame.image.load('bullet.png') #设置子弹的图片 self.X=feijiX #子弹的x坐标跟玩家飞机的一样 self.Y=feijiY+10 #子弹的y坐标应该比玩家飞机往上一点 self.step=8 #子弹移动的速度 #击中 def hit(self): global enemies,score for e in enemies: #循环判断所有的敌人 if(distance(self.X,self.Y,e.X,e.Y)<20): #射中啦 '''bullets.remove(self)''' #使用这个的语句的话,同时击中两个敌人会报错 try: bullets.remove(self) except ValueError: break e.reset() score+=1 print(score) bullets=[] #支持连发,保存现有多颗子弹

enemyimg=pygame.image.load('enemy.png') #敌人的图片 #让敌人出现的位置在指定界面范围上随机化 enemyX=random.randint(200,1000) #界面尺寸的横长为0到1284 enemyY=random.randint(50,350) enemystep=5 #d敌人移动的速度

#显示并移动子弹 def show_bullets(): for b in bullets: screen.blit(b.img,(b.X,b.Y)) b.hit() #看看是否击中了敌人 b.Y-=b.step #控制子弹往上移动 #判断子弹是否出了界面,如果出了就移除 if b.Y<0: bullets.remove(b)

#让敌人出现在界面上,并且显示敌人的移动和下沉 def show_enemy(): global enemyX,enemystep,enemyY,is_over for e in enemies: screen.blit(e.img,(e.X,e.Y)) #在随机产生的位置上画出敌人的图像 e.X+=e.step #让敌人动起来 if (e.X>1130 or e.X<0): #让敌人不超过边界 e.step*=-1 #到边界就反方向运动 e.Y+=40 if e.Y>650: #如果e.Y>650表明敌人就要撞到飞机了,此时就游戏结束 is_over=True print('游戏结束啦!') enemies.clear()

def move_wanjia(): global feijiX feijiX+=feijistep #改变飞机的坐标值,让飞机移动起来,还可以调节飞机的速度,正数向右移动,负数向左移动 #防止飞机出界 if feijiX>1130: #即右边界不能大于1284-154,(飞机图片的大小为154*146) feijiX=1130 if feijiX<0: feijiX=0

#游戏结束 is_over=False #默认没有结束 ziti2=pygame.font.Font('freesansbold.ttf',128) def chck_is_over(): if is_over: text='Game over' #f格式字符串,表示字符串里面可以直接嵌入变量 render=ziti2.render(text,True,(255,0,0)) screen.blit(render,(350,400)) #game over显示的位=位置坐标

#游戏主循环 running=True #设置一个变量 while running: #设置一个死循环 screen.blit(beijing,(0,0)) #调用screen方法,将图片在指定的坐标上画出来,pygame坐标以界面的左上角为原点,界面上边距为x轴,左边距为y轴 show_score() for event in pygame.event.get(): #event是pygame里面一个关于事件的方法,可以将发生的事件返回过来 if event.type==pygame.QUIT: #event.type判断是什么类型的事件,OUIT代表退出 running=False #让程序可以跳出死循环,结束游戏

    #通过键盘事件来控制飞机的移动
    if event.type==pygame.KEYDOWN:                #判断事件类型如果为键盘按下
        if event.key==pygame.K_RIGHT:             #如果按下的键是向右的方向键
            feijistep=15                           #正数向右移动
        elif event.key==pygame.K_LEFT:            #如果按下

原文地址: https://www.cveoy.top/t/topic/hpLk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录