作为一项新课程练习,我被要求做一个类似于使用某些要求的汽车功能的“课程”。
该类应使用以下属性:
state (int)
fuel (int)
maxspeed (int)
状态如下:
0 = turned off
1 = stopped
2 = accelerating
3 = not functional
4 = no fuel
我必须创建以下方法:
"accelerate", it should receive a number as speed
"brake"
"crash"
现在,验证如下:
The car can not accelerate if it is turned off (0), not functional (3), or no fuel (4).
It cannot accelerate more than maximum speed.
When there's a crash the car goes not functional (3)
Every time the car accelerates it loses 2 of fuel units
现在,验证可能看起来很简单,但不知怎的,我在验证汽车何时加速时遇到了麻烦。在我的代码中,即使在发生碰撞或没有燃料之后,汽车也会继续加速。它也会在碰撞,关闭或没有燃料后改变状态。
这是我的代码:
private int state;
private int fuel;
private int speed;
public car() // constructor
{
this.state = 1;
this.fuel = 30;
this.speed = 0;
int Maxspeed = 200;
}
public void setState(int state){
switch(state){
case 0:
this.state = 0;
this.speed = 0;
break;
case 1:
this.state = 1;
this.speed = 0;
break;
case 2 :
this.state = 2;
break;
case 3 :
this.state = 3;
this.speed = 0;
break;
case 4 :
this.state = 4;
this.speed = 0;
this.fuel = 0;
break;
}
}
public void accelerate(int v){
if(this.state == 0 || this.state == 3 || this.state == 4){
v = 0;
this.speed = v;
}
if(this.fuel != 0 && this.state != 4 || this.state != 3){
if(v > 200 || this.speed == 200){
if(this.fuel < 30){
this.speed = 200;
this.state = 2;
}
else{
this.speed = 200;
this.state = 2;
this.state -= 2;
}
}
else{
this.speed += v;
this.fuel -= 2;
this.state = 2;
}
}
}
public void Stop(){
while(this.state == 2){
this.speed = 0;
this.state = 1;
}
}
public void Crash(){
if(this.state == 2){
this.state = 3;
this.speed = 0;
}
}
}
此外,没有询问练习,但我怎么能用字符串而不是数字来显示状态呢?
我也被要求通过使用System void main来测试它,但我不完全确定如何建立连接。有什么帮助吗?
答案 0 :(得分:1)
您的主要问题在if (this.fuel != 0 && this.state != 4 || this.state != 3) {
,对我来说就是第52行。看起来您从第46行复制粘贴错误。this.state != 4
将评估为true,除非状态为4. this.state != 3
将评估为true,除非状态为3. this.state != 4 || this.state != 3
将始终评估为真,因为其中一个将永远是真的。也就是(true || anything) == true
。将||
更改为&&
。
接下来,如果您的汽车被给予一个奇数的燃料,它将永远运行。减少燃料的每一行都是2,你正在检查是否fuel != 0
。如果燃油在-1,那么fuel != 0
是正确的,即使你的汽车被认为没有燃料。相反,你想检查燃料是否为正,即fuel > 0
。
最后,第61行您正在更改this.state
而不是this.fuel
。
我建议更改accelerate(v)
,stop()
和crash()
中设置this.state == s
的所有地点,而不是调用setState(s)
,以便setState()
1}}处理副作用变化(如燃料和速度),而不是在这三个地方的每个地方重复相同的功能。
此外,没有询问练习,但我怎么能用字符串而不是数字来显示状态呢?
创建一个根据Car的状态返回String的方法。类似的东西:
public String getStateName() {
switch (state) {
case 0: return "turned off";
case 1: return "stopped";
case 2: return "accelerating";
case 3: return "not functional";
case 4: return "no fuel";
default: return null;
}
}
(请注意,每个case
都会return
一个值,这就是为什么他们在每个案例结束时都不需要break
。)
我也被要求通过使用System void main来测试它,但我不完全确定如何建立连接。有什么帮助吗?
添加方法public static void main(String[] args) { ... }
,它是程序的入口点。创建一个new Car()
变量,然后调用此Car的各种方法,并使用System.out.println(...)
将所需信息打印到控制台。例如:
public static void main(String[] args) {
// make a Car.
Car myCar = new Car();
myCar.printCarStatus();
// turn the car on
myCar.setState(1);
myCar.printCarStatus();
// speed up
myCar.accelerate(20);
myCar.printCarStatus();
// brake
myCar.stop();
myCar.printCarStatus();
// speed up, put the pedal to the metal
myCar.accelerate(1000); // car tops out at 200
myCar.printCarStatus();
// lost control of my car, crash
myCar.crash();
myCar.printCarStatus();
}
public void printCarStatus() {
System.out.println("State: " + this.state);
System.out.println("Fuel: " + this.fuel);
System.out.println("Speed: " + this.speed);
System.out.println(); // prints an empty line so we don't get entries mixed up.
}
但是编写自己的main()
方法,不要只复制我的方法。记住 - 你正在上课学习,所以试试看并尝试。如果您只是复制我的示例并将其粘贴到您的代码中,那么您就是在欺骗自己。祝你好运!