15
2024
11

python编程学习-跑酷01

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

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

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

from xdf import *
import math

class Body:
    def __init__(self, x, y, w, h, dynamic = True):
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.vx = 0
        self.vy = 0
        self.isStand = False
        self.dynamic = dynamic
        
    def hit(self, bd):
        return self.x <= bd.x + bd.w and self.x + self.w >= bd.x and self.y <= bd.y + bd.h and self.y + self.h >= bd.y
    

class World:
    def __init__(self, gravity):
        self.bodies = []
        self.gravity = gravity
    
    def addBody(self, bd):
        self.bodies.append(bd)
        
    def removeBody(self, bd):
        self.bodies.remove(bd)
        
    def clear(self):
        self.bodies.clear()
    
    def tryMoveX(self, bd, dt):
        bd.x += bd.vx * dt
        if self.hit(bd):
            bd.x -= bd.vx * dt
            bd.vx = 0
    
    def tryMoveY(self, bd, dt):
        bd.vy += self.gravity * dt
        bd.y += bd.vy * dt
        bd.isStand = False
        if self.hit(bd):
            bd.isStand = bd.vy > 0
            bd.y -= bd.vy * dt
            bd.vy = 0
    
    def hit(self, bd):
        for bd0 in self.bodies:
            if bd0 != bd and bd.hit(bd0):
                return True
        return False
    
    def update(self, dt):
        for bd in self.bodies:
            if bd.dynamic:
                self.tryMoveX(bd, dt)
                self.tryMoveY(bd, dt)
    
PX_M = 30
def m2px(m):
    return m * PX_M
def px2m(px):
    return px / PX_M 

GRAVITY = m2px(10 * 2)
JUMP_SPEED = m2px(-10)
X_SPEED = m2px(1)

class Game:
    def __init__(self):
        self.world = World(GRAVITY)
        self.CAMERAX = 200
        self.hero = Body(self.CAMERAX, 0, m2px(0.5), m2px(1.8), True)
        self.tf = text("", 0, 50, 30)
        self.overTf = text("Game Over", 100, "red", "center")
        self.left = False
        self.right = False
        self.jump = False
        self.isOver = True
        self.sx = 0
        self.lastFloor = None
        self.reset()
    
    def reset(self):
        if self.isOver:
            self.isOver = False
            self.sx = 0
            self.overTf.hide()
            self.world.clear()
            self.hero.x = self.CAMERAX
            self.hero.y = 0
            self.hero.vx = self.hero.vy = 0
            self.world.addBody(self.hero)
            self.lastFloor = None
            self.addFloor()
            
    def gameOver(self):
        self.isOver = True
        self.overTf.show()
        
    def addFloor(self):
        if not self.lastFloor:
            self.lastFloor = Body(0, 800, 768, 40, False)
            self.world.addBody(self.lastFloor)
        else:
            if self.sx + 768 >= self.lastFloor.x + self.lastFloor.w:
                x0 = self.lastFloor.x + self.lastFloor.w + random(200) + 100
                y0 = 800 + random(100) - 50
                w0 = random(200) + 100
                self.lastFloor = Body(x0, y0, w0, 40, False)
                self.world.addBody(self.lastFloor)
        
    def update(self, dt):
        if self.isOver:
            return
        self.hero.vx *= 0.9
        if self.left:
            self.hero.vx -= X_SPEED
        if self.right:
            self.hero.vx += X_SPEED
        if self.jump and self.hero.isStand:
            self.hero.vy = JUMP_SPEED * (1 + px2m(px2m(self.hero.vx)))
        if self.hero.x - self.sx < 20 and self.hero.vx < 0:
            self.hero.vx = 0
        self.world.update(dt)
        self.addFloor()
        if self.hero.x - self.sx > self.CAMERAX:
            self.sx += self.hero.x - self.sx - self.CAMERAX
        if self.hero.y > 1024:
            self.gameOver()
        self.tf.change(str(int(px2m(self.sx))) + "米")

        for bd in reversed(self.world.bodies):
            if bd != self.hero and bd.x + bd.w < self.sx:
                pass
                #self.world.removeBody(bd)

keys = {}
game = Game()
rects = []
def refresh():
    n0 = len(game.world.bodies)
    n1 = len(rects)
    for i in range(n1, n0):
        rects.append(box(0, 0, 1, 1, "transparent", "black"))
    for i in range(n1):
        if i < n0:
            bd = game.world.bodies[i]
            rects[i].move(bd.x + bd.w / 2 - game.sx, bd.y + bd.h /2)
            rects[i].size(bd.w, bd.h)
            rects[i].show()
        else:
            rects[i].hide()
            
def loop():
    game.jump = game.left = game.right = False
    if keys.get("37", False):
        game.left = True
    if keys.get("38", False):
        game.jump = True
    if keys.get("39", False):
        game.right = True
    N = 10
    for i in range(N):
        game.update(0.05 / N)
    refresh()
def tap():
    game.reset()
def keyup(code, key):
    keys[str(code)] = False
def keydown(code, key):
    keys[str(code)] = True

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



« 上一篇下一篇 »

相关文章:

python编程学习-跳伞  (2024-11-15 11:40:27)

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)

python编程学习-显示帧频  (2024-11-15 11:35:26)

发表评论:

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