Python:在所有墙壁上的GraphWin窗口上制作抛射物?

时间:2014-03-06 23:23:47

标签: python graphics bounce

扩展射弹和追踪器以实现以下图形游戏:

一个。有一个给定尺寸的方框(选择一个合理尺寸的框),其中 有一个弹丸随机弹回四面墙。

湾当射弹撞击墙壁时,通过随机选择一个角度再次发射 允许的范围和给定范围内的随机速度。例如,如果 射弹击中底部边界,它选择0到180范围内的随机角度 度;如果它碰到了正确的垂直墙,那么它会选择90和90之间的随机角度 270度;等等。

℃。不是绘制圆圈,而是移动圆圈并用一些颜色填充圆圈。

d。延伸到两个射弹。

不要询问用户参数。使用您认为最佳的一组参数。

所以我很难找到如何让两个球(弹丸)从一个墙到另一个墙弹跳。我想到了如何将它们从窗户的底壁反弹,但它并没有停在右边的墙上并从那里反弹。不仅如此,我不知道如何使球跟随而不是连续印刷圆圈来跟踪球的运动。我使用“.undraw()”但它非常跳跃并且根本不光滑。

我非常感谢你的帮助!作业将于明天到期,这就是我所拥有的:

# projectilebounce.py
#   Projectile hits a wall and again is launced

from math import sin, cos, radians

from graphics import *

class Projectile:

    def __init__(self, angle, velocity, height):
        self.xpos = 0.0
        self.ypos = height
        theta = radians(angle)
        self.xvel = velocity * cos(theta)
        self.yvel = velocity * sin(theta)

    def update(self, time):
        self.xpos = self.xpos + time * self.xvel
        yvel1 = self.yvel - 9.8 * time
        self.ypos = self.ypos + time * (self.yvel + yvel1) / 2.0
        self.yvel = yvel1

    def getY(self):
        return self.ypos

    def getX(self):
        return self.xpos

    def reset(self, angle, velocity, height):
        self.xpos = self.getX()
        self.ypos = height
        theta = radians(angle)
        self.xvel = velocity * cos(theta)
        self.yvel = velocity * sin(theta)


class Tracker:

    def __init__(self, window, objToTrack):
        self.win = window
        self.obj = objToTrack

    def update(self):
        a = Circle( Point(self.obj.getX(), self.obj.getY()), 5)
        a.draw(self.win)
        a.setFill("Black")
        a.undraw()


def getInputs():
    a1 = 60
    a2 = 30
    v1 = 60
    v2 = 60
    h1 = 10
    h2 = 10
    t = 0.1
    return a1, a2, v1, v2, h1, h2, t

def main():
    print("This program graphically depicts the flight of a cannonball.\n")

    win = GraphWin("TRACKER", 600, 500)
    win.setCoords(0.0, 0.0, 600, 500)

    angle1, angle2, vel1, vel2, h01, h02, time = getInputs()
    cball1 = Projectile(angle1, vel1, h01)
    cball2 = Projectile(angle2, vel2, h02)
    tracker_cball1 = Tracker(win, cball1)
    tracker_cball2 = Tracker(win, cball2)

    while True:
        if cball1.getY() <= 0:    #<---ball 1
            cball1.reset(60, 60, 10)
        else:
            cball1.update(time)
            tracker_cball1.update()

        if cball2.getY() <= 0:    #<---ball 2
            cball2.reset(30, 60, 10)
        else:
            cball2.update(time)
            tracker_cball2.update()

if __name__ == '__main__' : main()

谢谢!,我现在是编码的大菜鸟。非常感谢!

0 个答案:

没有答案