zoukankan      html  css  js  c++  java
  • 打飞机小游戏 python+pygame

    首先安装python和pygame的环境

    sudo apt-get install python

    sudo apt-get install python-pygame

    github项目地址:https://github.com/kiudou/fight_plane

    代码中有好几个图,自己找

      1 # -*- coding: utf-8 -*-
      2 import pygame
      3 import random
      4 from sys import exit
      5 #定义敌机类
      6 class Enemy:
      7     def restart(self): #重置敌机的位置和速度
      8         self.x = random.randint(50, 400)
      9         self.y = random.randint(-200, -50)
     10         self.speed = random.random()+0.1
     11     def __init__(self): #初始化
     12         self.restart()
     13         self.image = pygame.image.load('enemy.png').convert_alpha()
     14     def move(self): #向下移动
     15         if self.y < 800 :
     16             self.y +=self.speed
     17         else : #重置
     18             self.restart()
     19 
     20 #定义Bullet类。封装子弹相关的数据和方法
     21 class Bullet:
     22     def __init__(self): #初始变量,两个_,该类被创建时会被自动,不然会出现AttributeError: Bullet instance has no attribute
     23         self.x = 0
     24         self.y = -1
     25         self.image = pygame.image.load('bullet.png').convert_alpha()
     26         self.active = False #默认不激活
     27     def move(self): #处理子弹的运动
     28         if self.active: #激活状态下,向上移动
     29             self.y -= 3
     30         if self.y < 0:
     31             self.active = False
     32     def restart(self):    #重置子弹位置
     33         mouseX, mouseY = pygame.mouse.get_pos()
     34         self.x = mouseX - self.image.get_width()/2
     35         self.y = mouseY - self.image.get_height()/2
     36         self.active = True #激活子弹
     37 #定义飞机类
     38 class Plane:
     39     def restart(self):
     40         self.x = 200
     41         self.y = 300
     42     def __init__(self):
     43         self.restart()
     44         self.image = pygame.image.load('plane.png').convert_alpha()
     45     def move(self):
     46          x,y = pygame.mouse.get_pos() #获取鼠标的位置
     47          x -= self.image.get_width() / 2 #使得鼠标在飞机图像的最中间
     48          y -= self.image.get_height() / 2
     49          self.x = x
     50          self.y = y
     51     
     52 def checkHit(enemy, bullet): #检测子弹和飞机是否相撞
     53     if(bullet.x > enemy.x and bullet.x < enemy.x+enemy.image.get_width()) and 
     54         (bullet.y > enemy.y and bullet.y < enemy.y+enemy.image.get_height()): #空格+为代码换行
     55         enemy.restart()
     56         bullet.active = False
     57         return True
     58     return False
     59 
     60 def checkCrash(enemy, plane):#检测敌机与飞机是否相撞
     61     if (plane.x + 0.7*plane.image.get_width() > enemy.x) and (plane.x + 0.3*plane.image.get_width() < enemy.x + enemy.image.get_width()) and 
     62         (plane.y + 0.7*plane.image.get_height() > enemy.y) and (plane.y + 0.3*plane.image.get_height() < enemy.y + enemy.image.get_height()):
     63         return True
     64     return False
     65     
     66 pygame.init()
     67 screen = pygame.display.set_mode((450,700), 0, 32) #制作窗口
     68 pygame.display.set_caption('fight plane') #窗口名称
     69 background = pygame.image.load('background.jpg').convert() #加载背景图
     70 plane = Plane() #创建飞机对象
     71 enemies = [] #创建敌机list
     72 for i in range(5):
     73     enemies.append(Enemy())
     74 bullets = [] #创建子弹list
     75 for i in range(5): #list中添加5发子弹
     76     bullets.append(Bullet())
     77 count_b = len(bullets) #子弹总数
     78 index_b = 0 #即将激活的子弹序号
     79 interval_b = 0 #发射子弹间隔
     80 gameover = False
     81 score = 0
     82 font = pygame.font.Font(None,32) #创建一个font对象,None为默认字体,32为字号
     83 while True:
     84     for event in pygame.event.get():
     85         if event.type == pygame.QUIT:
     86             pygame.quit()
     87             exit()
     88         if gameover and event.type == pygame.MOUSEBUTTONUP: #点击鼠标游戏重置
     89             plane.restart()
     90             for e in enemies :
     91                 e.restart()
     92             for b in bullets :
     93                 b.active = False
     94             score = 0
     95             gameover = False
     96             index_b = 0
     97             interval_b = 0
     98     screen.blit(background,(0,0)) #画背景图像,从最左上角开始即(0,0)
     99     
    100     if not gameover :
    101         interval_b -= 1 #发射间隔递减,实际发射间隔受cpu影响
    102         if interval_b < 0: #间隔小于0时,激发一个子弹
    103             bullets[index_b].restart()
    104             interval_b = 100 #重置时间间隔
    105             index_b = (index_b + 1) %count_b #子弹序号周期性递减
    106         for b in bullets: #绘制激活的子弹
    107             if b.active:
    108                 b.move()
    109                 screen.blit(b.image,(b.x,b.y))
    110                 for e in enemies:
    111                     if checkHit(e, b) :#检测激活的子弹是否和飞机相撞
    112                         score += 10
    113         for e in enemies : #敌机的移动和描述        
    114             if checkCrash(e, plane) :
    115                 gameover = True
    116             e.move() 
    117             screen.blit(e.image,(e.x, e.y))
    118         plane.move()
    119         screen.blit(plane.image,(plane.x,plane.y)) #画飞机
    120         text = font.render("Score:%d" %score,1,(0,0,0))
    121         screen.blit(text,(0,0)) #在屏幕左上角显示分数
    122     else :
    123         text1 = font.render("Score:%d" %score,1,(0,0,0))
    124         text2 = font.render("click restart",1,(0,0,0))
    125         screen.blit(text1,(190,400)) #在屏幕中间显示分数
    126         screen.blit(text2,(170,420))
    127     pygame.display.update()    #刷新
  • 相关阅读:
    小米智能家居接入智能家居平台homeassistant的方法
    我的nodejs 快速入门
    node.js JS对象和JSON字符串之间的转换
    Mac安装搭建sublimeText3开发Nodejs环境
    使用Xcode IDE写node.js
    nodejs中exports与module.exports的区别
    安装pysqlite2
    linux 终端分屏命令
    MQTT学习笔记
    Cache缓存
  • 原文地址:https://www.cnblogs.com/creativepower/p/7623924.html
Copyright © 2011-2022 走看看