欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

今日Python练手小游戏——打飞机

程序员文章站 2022-10-05 08:09:47
打飞机文字版 思路: 1:主飞机从底层y = 1生成,左右移动 ,每次左右x轴随机移动n个位置,并且移送过的地方每一个位置都会生成一个子弹,并发射。如果此位置Y轴正好有小飞机,则击落一架且一次只能击落,加一分。(击落多架除非下一次随机位置还在原地) 2:小飞机到底层时消失,即y = 0时候消失。(这 ......

打飞机文字版 

思路: 
1:主飞机从底层y = 1生成,左右移动 ,每次左右x轴随机移动n个位置,并且移送过的地方每一个位置都会生成一个子弹,并发射。如果此位置y轴正好有小飞机,则击落一架且一次只能击落,加一分。(击落多架除非下一次随机位置还在原地)

2:小飞机到底层时消失,即y = 0时候消失。(这个条件暂时没用)

3:小飞机从顶层y = 10水平位置生成,x位置随机,每次随机生成三个

4:主飞机本身长度y=1。当主飞机和小飞机下一个坐标都为(x,1)时,碰撞。游戏结束。

 

之前版本运行完成会发现如下一个bug:小飞机生成因为是随机的,所以可能随机生成n个,其中有 n=<1个飞机位置会重复,所以会出现以下现象 :

只发射了6个炮弹,却在水平方向打掉了十多个飞机,这是因为生成飞机重复了,甚至有三四个飞机随机生成在一个y = 10的水平位置上。

问题的bug已经完善,加一个小飞机刷出条件不重叠。 

代码如下:

import random as r
import sys
legal_x = [0,10]
legal_y = [0,25]
class big:
    def __init__(self):
        """在y=1随机生成炮台位置"""
        self.x = r.randint(0,10)
        self.y = 1
 
    def move(self):
        self.interval = []
        """随机移动左右方向并移动到新的位置(x,1)"""
        self.step = r.randint(0,legal_x[1])
        self.direction = r.randint(-1,1)#方向,-1为左,0不移动,1为右
        new_x = self.x + self.direction * self.step
        mew_y = self.y
        """判断是否越界"""
        if new_x > legal_x[1]:
            pos_x = legal_x[1] - (new_x - legal_x[1])
            pos_y = mew_y
        elif new_x < legal_x[0]:
            pos_x = legal_x[0] - new_x
            pos_y = mew_y
        else:
            pos_x = new_x
            pos_y = mew_y
 
        """炮台移动前后对应坐标"""
        if self.x > pos_x:
            for i in range(pos_x,self.x + 1 ):
                self.interval.append(i)
            print("炮台从坐标x=%d移动到x=%d,沿途轰了%d炮"%(self.x,pos_x,self.x + 1 -pos_x ))
            print(">>>轰出%d个炮的位置是x ="% (self.x + 1 -pos_x),end = "")
            print(self.interval)
 

 

        elif self.x < pos_x:
            for i in range(self.x,pos_x + 1):
                self.interval.append(i)
            print("炮台从坐标x=%d移动到x=%d,沿途轰了%d炮"%(self.x,pos_x,pos_x + 1 -self.x ))
            print(">>>轰出%d个炮的位置是x ="% (pos_x + 1 -self.x),end = "")
            print(self.interval)
        else:
            self.interval.append(pos_x)
            print(">>>炮台原地轰了一炮")
            print(">>>轰炮的坐标是x = %s"% str(self.interval))
 
        """初始化炮台到移动的目标"""
        self.x = pos_x
        self.y = pos_y
        return (pos_x,pos_y)
 
class small:
    def __init__(self):
        """在y=25随机生成小飞机位置"""
        self.x = r.randint(0,legal_x[1])
        self.y = legal_y[1]
 
    def move(self):
        """固定移动,每次向下一步"""
        new_x = self.x
        mew_y = self.y - 1
        """判断是否越界"""
        if mew_y <= legal_y[0]:
            self.x = r.randint(0,legal_x[1])
            self.y = legal_y[1]
        else:
            self.x = new_x
            self.y = mew_y            
        return (new_x , mew_y)
 
class boom:
    """核武器"""
    def __init__(self):
        self.x = r.randint(0,legal_x[1])
        self.y = 1
 

 

def dafeiji(n):  
    scorer = 0
    list_s = []
    big_air = big()
    """激光炮台出场"""
 

 

    i = r.randint(9,10)
    while n:
        list_pos = []
        boom = boom()
        """核武器生成"""       
        for numbers in range(1 ,i + 1):            
            small_air = small()#小飞机出场数量位置随机,设置不重叠
            if small_air.x not in list_pos:
                list_pos.append(small_air.x)
                list_s.append(small_air)
            else:
                continue                
        pos = big_air.move()
        n = n - 1
        if pos != (boom.x ,boom.y):
            for each in list_s[:]:
                pos_small = each.move()
                if pos == pos_small:
                    print(">>>>>>>很不幸! 您的炮台撞小飞机了....gg!!")#这个几率.....
                    print("本次打飞机的分数是:%d" % scorer)
                    sys.exit(0)          
                elif pos_small[0] in (big_air.interval):
                    """一条直线打的,其实是激光炮"""
                    print("一架小飞机被打掉..")
                    scorer += 1
                    list_s.remove(each)
        else:
            print("炮台加载了核武器...======================清屏!=======================..")
            scorer += len(list_s)
            list_s.clear()
    print("本次打飞机的分数是:%d" % scorer)
#==============================主程序==================================
 

 

dafeiji(5)

初始界面y值越大,游戏结束几率越小。 

 

想了解更多python知识或者想与更多的朋友一起学习交流,可以加群705673780,群文件内更多免费资料可供学习哦~