15
2024
11

python编程学习-跳伞

学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。

可以在线运行,效果如下(在新页面中打开链接):

代码如下(用到平台自定义的xdf库):

from xdf import *

W = 768
H = 1024
groundY = H - 100
fill("#456078")
class Actor:
    def __init__(self, color, x=0, y=0):
        self.x = x
        self.y = y
        self.eyeX = 0
        self.eyeY = 0
        self.speedY = 0
        self.aY = 0
        self.showBalloon = False
        self.state = 0 # 0:未下落,1:下落中,未开伞,2:开伞,3:落地
        self.size = 30
        self.life = 100
        self.score = 0
        self.ai = None
        
        size = self.size
        self.line1 = line(x, y, x - size, y - size * 1.8, 'black', size * 0.1)
        self.line2 = line(x, y, x + size, y - size * 1.8, 'black', size * 0.1)
        
        self.balloon1 = circle(x - size, y - size * 1.8, size * 0.5, 'white')
        self.balloon2 = circle(x - size * 0.4, y - size * 2.0, size * 0.5, 'white')
        self.balloon3 = circle(x + size * 0.4, y - size * 2.0, size * 0.5, 'white')
        self.balloon4 = circle(x + size, y - size * 1.8, size * 0.5, 'white')
        
        self.head = circle(x, y, size, color)
        self.eyeL = circle(x - size * 0.32, y, size * 0.4, 'white', 'black')
        self.eyeR = circle(x + size * 0.32, y, size * 0.4, 'white', 'black')
        self.eyeM = circle(x, y, size * 0.24, 'white')
        self.eyeBallL = circle(x - size * 0.32, y, size * 0.1, 'black')
        self.eyeBallR = circle(x + size * 0.32, y, size * 0.1, 'black')
        
        
    def update(self, dt):
        if self.ai:
            self.ai.update()
        self.speedY += self.aY * dt
        if self.showBalloon:
            k = self.aY * dt / 100
            self.speedY -= self.speedY * k
        self.y += self.speedY * dt
        global groundY
        if self.state != 3 and self.y + self.size >= groundY:
            self.showBalloon = False
            self.state = 3
            maxSpeed = 100
            self.score = getScore()
            if self.speedY > maxSpeed:
                self.life -= int((self.speedY - maxSpeed) * 0.5 + 0.5)
                if self.life < 0:
                    self.life = 0
        if self.y + self.size >= groundY:
            self.y = groundY - self.size
            self.speedY *= -0.8 
        if self.showBalloon:
            self.line1.show()
            self.line2.show()
            self.balloon1.show()
            self.balloon2.show()
            self.balloon3.show()
            self.balloon4.show()
        else:
            self.line1.hide()
            self.line2.hide()
            self.balloon1.hide()
            self.balloon2.hide()
            self.balloon3.hide()
            self.balloon4.hide()
        self.updatePos()
    
    def updatePos(self):
        x = self.x
        y = self.y
        size = self.size
        self.line1.move(x, y, x - size, y - size * 1.8)
        self.line2.move(x, y, x + size, y - size * 1.8)
        self.balloon1.move(x - size, y - size * 1.8)
        self.balloon2.move(x - size * 0.4, y - size * 2.0)
        self.balloon3.move(x + size * 0.4, y - size * 2.0)
        self.balloon4.move(x + size, y - size * 1.8)
        self.head.move(x, y)
        self.eyeL.move(x - size * 0.32, y)
        self.eyeR.move(x + size * 0.32, y)
        self.eyeM.move(x, y)
        self.eyeBallL.move(x - size * 0.4 + self.eyeX, y + self.eyeY)
        self.eyeBallR.move(x + size * 0.4 + self.eyeX, y + self.eyeY)
    
    def resetTurn(self):
        self.aY = 0
        self.y = 100
        self.speedY = 0
        self.showBalloon = False
        self.state = 0
        self.score = 0
    
    def reset(self):
        self.life = 100
        self.resetTurn()
        
    def tap(self):
        if self.state == 0:
            self.aY = 30 * 10
            self.state = 1
        elif self.state == 1:
            self.showBalloon = True
            self.state = 2
            
    
class LifeBar:
    def __init__(self):
        self.life = 100
        self.bg = line(0, 10, W, 10, "black", 30)
        self.bar = line(0, 10, W, 10, "red", 30)
        self.tf = text('100', 0, 22, 30, 'green')
        
    def update(self):
        self.bar.size(self.life * W / 100)
        self.tf.change(str(self.life))
        
class Ground:
    def __init__(self):
        self.b = box(0, 0, W, 200, "black")
        self.b.move(W/2, groundY + 100)
        
class ReadyGo:
    def __init__(self):
        self.tf = text('3', W / 2, H / 2, 200, 'red', 'center')
        self.isStart = False
        self.count = 0
        self.update()
        
    def update(self):
        if self.isStart:
            self.count -= 1
            self.tf.show()
            if self.count > 50:
                self.tf.change("3")
            elif self.count > 30:
                self.tf.change("2")
            elif self.count > 10:
                self.tf.change("1")
            else:
                self.tf.change("GO")
            if self.count <= 0:
                self.stop()
                self.tf.hide()
        else:
            self.tf.hide()
    
    def isReady(self):
        return self.count <= 10
    
    def stop(self):
        self.isStart = False
        self.count = 0
        
    def start(self):
        self.isStart = True
        self.count = 70


class StartPanel:
    def __init__(self):
        texts = ["游戏规则:", 
        "1、点击任意区域开始",
        "2、倒计时结束,点击任意区域开始下落",
        "3、再次点击任意区域,打开降落伞",
        "4、根据落地时间先后进行打分",
        "5、落地时速度太快会摔伤"
        ]
        self.tfs = []
        for i in range(len(texts)):
            self.tfs.append(text(texts[i], 100, 300 + 50 * i, 30, 'red'))

    def show(self):
        for i in range(len(self.tfs)):
            self.tfs[i].show()
    
    def hide(self):
        for i in range(len(self.tfs)):
            self.tfs[i].hide()

class AI:
    def __init__(self, actor):
        self.actor = actor
    
    def update(self):
        global state
        if state == 2:
            if self.actor.state == 0:
                if random(100) > 80:
                    self.actor.tap()
            elif self.actor.state == 1:
                if self.actor.y >= H / 2:
                    if random(100) > 60:
                        self.actor.tap()
    

hero = Actor('#13C319', W / 2, 100)
computter1 = Actor('#ff00ff', W / 2 - 300, 100)
computter2 = Actor('#00ffff', W / 2 - 150, 100)
computter3 = Actor('#ffff00', W / 2 + 150, 100)
computter4 = Actor('#0000ff', W / 2 + 300, 100)
computter1.ai = AI(computter1)
computter2.ai = AI(computter2)
computter3.ai = AI(computter3)
computter4.ai = AI(computter4)

actors = [hero, computter1, computter2, computter3, computter4]
bar = LifeBar()
ground = Ground()
go = ReadyGo()
sp = StartPanel()
score = 0
scoreTf = text('得分', 0, 60, 30, 'red')
turnTf = text('点击任意位置开始下一回合', W/2, H/2, 50, 'red', 'center')
overTf = text('点击任意位置重新开始', W/2, H/2, 50, 'red', 'center')

state = 0 # 0:未开始, 1:ready-go, 2:游戏中, 3:回合结束, 4:游戏结束

scoreId = 0
scores = [10, 7, 4, 1, 0]
def getScore():
    global scores, scoreId
    sc = scores[scoreId]
    scoreId += 1
    return sc

def resetTurn():
    global scoreId
    scoreId = 0
    for i in range(len(actors)):
        actors[i].resetTurn()

def reset():
    global sp, hero,turnTf, score, state
    state = 0
    score = 0
    resetTurn()
    sp.show()
    hero.reset()

def loop():
    global actors, bar, ground, go, state, score, scoreTf, turnTf, overTf
    for i in range(len(actors)):
        actors[i].update(0.05)
    bar.life = hero.life
    if state == 1:
        checkGoEnd()
    elif state == 2:
        checkTurnEnd()
    bar.update()
    go.update()
    scoreTf.change('得分:' + str(score))
    if state == 3:
        turnTf.show()
    else:
        turnTf.hide()
    if state == 4:
        overTf.show()
    else:
        overTf.hide()

def oneTurn():
    global state, go
    go.start()
    state = 1
    resetTurn()

def checkGoEnd():
    global state, go
    if go.isReady():
        state = 2

def checkTurnEnd():
    global state, go, actors, hero, score
    isEnd = True
    for i in range(len(actors)):
        if actors[i].state != 3:
            isEnd = False
    if isEnd:
        score += hero.score
        if hero.life > 0:
            state = 3
            turnOver()
        else:
            gameOver()
    
def start():
    oneTurn()
    sp.hide()
    
def turnOver():
    global state
    state = 3
    
def gameOver():
    global state
    state = 4

def tap():
    global state,hero
    if state == 0:
        state = 1
        start()
    elif state == 2:
        hero.tap()
    elif state == 3:
        oneTurn()
    elif state == 4:
        reset()

reset()


也可以下载代码,本地python环境运行(用pygame封装了xdf库)。



« 上一篇下一篇 »

相关文章:

python编程学习-进入大圈  (2024-11-15 11:40:57)

python编程学习-跑酷01  (2024-11-15 11:40:3)

python编程学习-赛车  (2024-11-15 11:39:38)

python编程学习-贪食蛇  (2024-11-15 11:38:41)

python编程学习-警察抓小偷  (2024-11-15 11:38:7)

python编程学习-英雄天梯  (2024-11-15 11:37:35)

python编程学习-翻滚的方块  (2024-11-15 11:37:10)

python编程学习-玛丽跳跳跳  (2024-11-15 11:36:43)

python编程学习-汉诺塔  (2024-11-15 11:36:16)

python编程学习-模拟键盘按键  (2024-11-15 11:35:50)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。