2013-04-29 53 views
0

我想創建一個模擬機器人功能的代碼。轉動和移動等。我感覺好像我以各種錯誤的方式來處理這個問題......當我寫這篇文章時,我認爲我理解了它的要旨,如果構造函數中的方向是這樣的,那麼如果它轉向新的方向就是這樣。我測試了這一點,當然,我最終得到了一些真正不正確的結果。我絕對相信我實際上並沒有爲我的對象使用這些函數。我可以得到關於如何使用這種代碼的提示嗎?改變點的方向

import java.awt.Point; 
public class Robot 
{ 
private int x; 
private int y; 
private int d; 
private int p; 
public static final int NORTH = 0; 
public static final int SOUTH = 1; 
public static final int EAST = 2; 
public static final int WEST = 3; 

/** 
* Constructor for objects of class Robot 
* @param theX the x coordinate 
* @param theY the y coordinate 
* @param theDirection the direction the robot is facing 
*/ 
public Robot(int theX, int theY, int theDirection) 
{ 
    x = theX; 
    y = theY; 
    d = theDirection; 
} 

public void turnLeft() 
{ 
    if(d == NORTH) { 
     d = WEST; 
    } 
    if(d == WEST) { 
     d = SOUTH; 
    } 
    if(d == SOUTH) { 
     d = EAST; 
    } 
    if(d == EAST) { 
     d = NORTH; 
    } 
} 



public String getDirection() 
{ 
    if(d == NORTH) { 
     return "N"; 
    } 
    if(d == SOUTH) { 
     return "S"; 
    } 
    if(d == WEST) { 
     return "W"; 
    } 
    if(d == EAST) { 
     return "E"; 
    } 
    return ""; 
} 
} 

測試

Robot rob = new Robot(20, 20, Robot.SOUTH); 
rob.turnLeft; 
System.out.println(rob.getDirection); 

這回當我想起它實際上應該返回E.

+0

你turnLeft()被混合p和d。 – Aquillo 2013-04-29 07:54:38

+0

對不起,這是我的代碼,然後我解決了我的問題,然後我就編輯它! – Michael 2013-04-29 07:55:15

+0

等不是方向? – Michael 2013-04-29 07:56:59

回答

0

什麼是p VAR您使用? 您當前的方向是存儲在d

... 
d = theDirection; 
... 

你應該與這一個嘗試:

public void turnLeft() 
{ 
    if(d == NORTH) { 
     d = WEST; 
    } 
    if(d == WEST) { 
     d = SOUTH; 
    } 
    if(d == SOUTH) { 
     d = EAST; 
    } 
    if(d == EAST) { 
     d = NORTH; 
    } 
} 

編輯: 只是爲了澄清。

你寫的東西像

if(p == SOUTH) { 
     d = EAST; 
    } 

所以你檢查是否p是南部和不d

你沒有在任何地方使用p所以它永遠不會是南方,這就是爲什麼你的turnLeft()方法絕對沒有什麼!

+0

在p變種是我的代碼另一部分,我有返回在該機器人的所在。我想我只是搞砸我的代碼......,而錯誤添加對有一點..哦,親愛的 – Michael 2013-04-29 08:06:14

+0

是的,我想你已經在你的'getDirecti搞砸了,因爲on()'你做得對! – StepTNT 2013-04-29 08:10:09

+0

謝謝!有了這些信息,我現在就可以完成其餘的代碼! :) – Michael 2013-04-29 08:13:42

1

你需要別的如果。當您左轉時,您爲d指定一個新值,它與以下if語句的條件相匹配。

+0

我明白了,你不能只擁有完整的if語句! – Michael 2013-04-29 08:11:51

+0

@Michael你可以。但想一想:1)d是北,所以你輸入第一個「if」的括號。你把它設置爲西方。第二)d是West,所以你在第二個'if'中輸入括號。你把它設置爲南方。 (..) 等等。這就是米奇想說的。 – Aquillo 2013-04-29 08:38:22

1

您的turnLeft方法不太正確。
下面的代碼使用if

public void turnLeft() { 
    if (d == NORTH) { 
     d = WEST; 
    } else if (d == WEST) { 
     d = SOUTH; 
    } else if (d == SOUTH) { 
     d = EAST; 
    } else if (d == EAST) { 
     d = NORTH; 
    } 
} 

這裏的使用switch..case

public void turnLeft() { 

    switch (d) { 
    case NORTH: d = WEST; break; 
    case WEST: d = SOUTH; break; 
    case SOUTH: d = EAST; break; 
    case EAST: d = NORTH; break; 
    } 
} 
+0

亞歷山大是正確的,在OP的情況下(沒有別的),你會輸入每個'if',因爲你覆蓋了測試值。 – Aquillo 2013-04-29 08:36:38

0

1的代碼)你真的應該清理您的p和d的東西;)我建議叫d「方向「

2nd)你應該重新排列你的int常量順時針順序的方向。所以你可以將你的turnLeft()方法減少爲一行代碼。測試你應該使用JUnit

public static final int NORTH = 0; 
public static final int EAST = 1; 
public static final int SOUTH = 2; 
public static final int WEST = 3; 

3):

@Test 
public void turnLeft() { 
    Robot rob = new Robot(20, 20, Robot.SOUTH); 
    rob.turnLeft; 
    assertEquals("E", rob.getDirection); 
    rob.turnLeft; 
    assertEquals("N", rob.getDirection); 
    rob.turnLeft; 
    assertEquals("W", rob.getDirection); 
    rob.turnLeft; 
    assertEquals("S", rob.getDirection); 
} 
+0

順時針順序? :O – Michael 2013-04-29 08:10:45

+0

@Michael:編輯我的答案 – 2013-04-29 08:12:02

0
public void turnLeft() 
{ 
    if(d == NORTH) { 
     d = WEST; 
    } 
    else if(d == WEST) { 
     d = SOUTH; 
    } 
    else if(d == SOUTH) { 
     d = EAST; 
    } 
    else if(d == EAST) { 
     d = NORTH; 
    } 
} 

因爲如果d == NORTH,然後d將成爲WEST你可以命令他們這樣。

而且在未來,如果,d的確會d==WEST,並將成爲SOUTH

,並在一天結束時,d將再次NORTH

1

枚舉

public enum Direction { 
    private String name; 
    private String indicator; 

    public Direction(String name, String indicator) { 
     this.name = name; 
     this.indicator= indicator; 
    } 

    // getters 

    NORTH("North", "N"), 
    EAST("East", "E"), 
    SOUTH("South", "S"), 
    WEST("West", "W"); 
} 

接下來,你可以很容易地做到這一點:

turnLeft() { 
    switch (d) { 
     case Direction.NORTH: return Direction.WEST; 
     case Direction.WEST: return Direction.SOUTH; 
     case Direction.SOUTH: return Direction.EAST; 
     case Direction.EAST: return Direction.NORTH; 
    } 
} 

getDirection() { 
    return d.getIndicator(); 
} 

這樣你就可以擺脫四個靜態的int(NORTHWESTEASTSOUTH)和變化int d分成Direction d。我真的會推薦使用這個enum。只是爲了安全。

+0

你應該事實上,d的類型必須改爲'Direction' - 爲了完整性 – 2013-04-29 08:36:39

+0

@MarcoForberg:也許你在我的編輯之前閱讀我的答案。我做了一個小小的編輯,我已經記下了它。 – Aquillo 2013-04-29 08:39:35

+0

yes看起來像我只是那 – 2013-04-29 08:41:38