我已经得到了很好的工作,但是当速度达到一定的速度时,它希望它保持这种速度而不是增加。代码在一定程度上实现了这一点,但是当我打印出值时,值为270,然后降回到250.我不希望它超过250。当最大速度被击中时,如果它不能保持相同的值,那么这个体面的变量会继续向上移动,或者这是正确的,并且它表现正确它只是看起来对我错了吗?我得到的是,如果物体已达到终止速度,我每次设置为250,那么行进的距离应该更多吗?或者我必须设置不同的代码?就像在那里有一个if语句来说mySpeed = maxSpeed然后只使用certian体面率?嗯,这直接来自一本物理书,所以...... 谢谢你的帮助
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JumpSimR
{
class Program
{
static void Main(string[] args)
{
//non modifiable constants
const double maxSpeed = 250; //terminal velocity
const double g = 32.17; //imeriial unity feet per sec g = dv/dt
//variablbes used for player
double mySpeed; //current spped of person
double myAlt; //altitude of the person
double myDist; //distance travled for jump
double t; //time in simulation
//parachute variables
bool deploy;
bool lCord;
bool rCord;
double alt;
//get the alttitude from user input
Console.WriteLine("Enter Jump Altitued:");
Console.WriteLine("a for 30000 Ft");
Console.WriteLine("b for 25000 Ft");
Console.WriteLine("c for 15000 Ft");
String alt1 = Console.ReadLine();
if (alt1.Equals("a"))
{
alt = 30000;
}
else if (alt1.Equals("b"))
{
alt = 25000;
}
else { alt = 15000; }
Console.WriteLine("The Hight of the jump is " + alt);
myAlt = alt; //assign player alt to jump hight
t = 1;
mySpeed = 0;
deploy = false;
while(myAlt > 0)
{
if (maxSpeed > mySpeed){
mySpeed = g * t;
}
else if (mySpeed >= maxSpeed)
{
mySpeed = maxSpeed;
}
myDist = mySpeed * t; //distace = velocity * time
if (0 > myAlt - myDist) { myAlt = 0; } else { myAlt -= myDist; } //subtract distance travled from starting alt
Console.WriteLine("My Speed: " + mySpeed);
Console.WriteLine("My Distance: " + myDist);
Console.WriteLine("Altitude: " + myAlt);
t++;
}
// keep screen from going away
// when run from VS.NET
Console.ReadLine();
}
}
}
答案 0 :(得分:4)
取出else,你允许它传递一次迭代的最大值:
if (maxSpeed > mySpeed){
mySpeed = g * t;
}
if (mySpeed >= maxSpeed)
{
mySpeed = maxSpeed;
}
答案 1 :(得分:2)
除了最大速度问题,您的距离计算也是错误的。你在我的原始答案中犯了一个相反的错误,你不考虑加速。
myDist = mySpeed * t; //distace = velocity * time
需要更改为
myDist += mySpeed; //Old distance + current time slice's speed;
如果你没有改变加速度你可以使用X t = X 0 + V 0 t +(1/2 )在 2 公式,但由于变化(它从32.17变为0 mySpeed >= maxSpeed
)所以你必须使用每次切片当前速度来总结当前位置。
以下是错误的,它没有考虑加速度变化的终端速度,我将它留在这里虽然这是一个有用的教训
除了有关最高速度的错误,人们发布了一些你的算法是错误的。
职位的公式是 X t = X 0 + V 0 t +(1/2)at 2 和速度公式是v t = v 0 t + a
对于您的游戏,V 0 = 0且X 0 = alt
,因此您的代码可以简化为
while(myAlt > 0)
{
myAlt = alt + .5 * g * t * t; // Starting Velocity was 0 so we left it out.
mySpeed = g * t; // Starting Velocity was 0 so we left it out.
Console.WriteLine("My Speed: " + mySpeed);
Console.WriteLine("My Distance: " + (alt - myAlt));
Console.WriteLine("Altitude: " + myAlt);
t++;
}
P.S。如果没有什么可以处理的话,我发现Debugger.Break()比Console.ReadLine()更有用,可以防止程序关闭。
答案 2 :(得分:1)
在检查它是否小于最大速度后,您正在计算新的mySpeed
- 您应该在之前执行此计算。为了简化代码,您还可以使用Math.Min()
代替if
支票:
mySpeed = g * t;
mySpeed = Math.Min(maxSpeed, mySpeed);