0

我正在为我的物理期末写一个程序。在整个学期中,我们都使用 vPython 来模拟情况并获得准确的答案等。我们的最终项目是使用 vPython 创建一个包含某种物理类型的游戏。

我选择重制鲍曼,除了坦克。所以你在屏幕的右手边有一个坦克,在屏幕的左手边有一个中间的墙。目标是瞄准你的大炮并射击正确的速度以击中对手的坦克。我已经完成了大部分程序,但是我被困在一些不同的事情上。

首先,我怎样才能为击键计时?我有它,所以我从每门大炮射击,但是我希望能够按住一个键并取决于它被按住的时间,以获得更快的初始速度。

其次,我应该在哪里将重力融入到程序中?我对如何进行大致了解,但我只是不知道将其放入哪个函数中。

最后,每次运行程序时,我都会随机生成一个墙高。然而,有时墙太小了,你看不到它。有没有办法为此设置一系列值?

这是我的代码:

from visual import*
from random import*

scene.autoscale=False
scene.width = 1500
scene.height = 800
scene.title='Tanks'


def moveaup(gun):
    theta=arctan(gun.axis.y/gun.axis.x)
    dtheta=.1

    if (theta<pi/2):
        theta=theta+dtheta
        if not (theta>pi/2):
            gun.axis=(cos(theta),sin(theta),0)
    else:
        gun.axis=vector(0,1,0)

def moveadown(gun):
    theta=arctan(gun.axis.y/gun.axis.x)
    dtheta=.1

    if (theta>0):
        theta=theta-dtheta
        gun.axis=(cos(theta),sin(theta),0)

def movebup(gun):
    theta=arctan(gun.axis.y/gun.axis.x)+pi
    dtheta=.1

    if (theta>pi/2):
        theta=theta-dtheta
        if not (theta<pi/2):
            gun.axis=(cos(theta),sin(theta),0)
    else:
        gun.axis=vector(0,1,0)

def movebdown(gun):
    theta=arctan(gun.axis.y/gun.axis.x)+pi
    dtheta=.1

    if (theta<pi):
        theta=theta+dtheta
        gun.axis=(cos(theta),sin(theta),0)


def shoota(gun):
    vel = vector(1,1,0)
    bullet = sphere(pos=(gun.pos.x+gun.axis.x,gun.pos.y+gun.axis.y,0),radius=(.0785),color=color.yellow)
    bullet.v = vector(0,0,0)
    bullet.v = bullet.v+vel
    bulletlist.append(bullet)


def shootb(gun):
    vel = vector(-1,1,0)
    bullet = sphere(pos=(gun.pos.x+gun.axis.x,gun.pos.y+gun.axis.y,0),radius=(.0785),color=color.green)
    bullet.v = vector(0,0,0)
    bullet.v = bullet.v+vel
    bulletlist.append(bullet)

def bulletlistupdate(bulletlist):
    dt=.01
    for a in bulletlist:
        a.pos=a.pos+a.v*dt


def checks(agun,bgun):
    if scene.kb.keys:
        key=scene.kb.getkey()
        if key=='a':
            moveaup(agun)
        if key=='s':
            moveadown(agun)
        if key=='l':
            movebup(bgun)
        if key=='k':
            movebdown(bgun)
        if key=='d':
            shoota(agun)
        if key=='j':
            shootb(bgun)


#enviroment
ground = box(pos=(0,-8,0),size=(50,5,0),color=color.red)
wall = box(pos=(0,-8,0),size=(.25,20*random(),0),color=color.red)

#playerA
abody = box(pos=(-11,-5.25,0),size=(.5,.5,0),color=color.blue)
agun = cylinder(pos=(-11,-5.1,0),axis=(.8,.8,0),radius=(.08),color=color.blue)

#playerB
bbody= box(pos=(11,-5.25,0),size=(.5,.5,0),color=color.yellow)
bgun = cylinder(pos=(11,-5.1,0),axis=(-.8,.8,0),radius=(.08),color=color.yellow)

bulletlist = []

while True:
    rate(1000)
    checks(agun,bgun)
    bulletlistupdate(bulletlist)

欢迎任何和所有帮助!

非常感谢!

4

2 回答 2

2

time您可以使用该模块在 python 中计时

import time

start = time.time()
finish = time.time()
print start # 1386269106.18
print finish # 1386269111.11
print (finish - start) # 4.9276599884

所以当玩家第一次开始按下按钮时,节省时间。然后在玩家停止按下按钮时再次保存时间。这两次之间的差异是玩家按住按钮的秒数。

[编辑]如果您所能做的就是检查是否按下了键,您可以获取主循环内的时间并计算 dt (经过的时间量):

t = time.time()
while True:
    new_t = time.time()
    dt = new_t - t
    t = new_t

    rate(1000)
    checks(agun,bgun, dt)
    bulletlistupdate(bulletlist)

然后将 dt 传递给检查,如果该键被按下,则您知道该键已被按住了dt几秒钟,您可以将其添加到您已按住的运行总时间中。

于 2013-12-05T18:47:22.113 回答
0

对于随机数,您需要输入类似于以下的命令:

    random.randrange(5,31) #this would give you a random range between the numbers 4-30

我不想为你做作业,因为我不认为你要求这样做。我希望这可以帮助你。

很抱歉,这应该是您的正确代码:

    random.randint(7,40)  # this would get you a random integer of 7-40

我为错误信息道歉。

于 2013-12-05T19:05:13.707 回答