2014-10-07 4 views
1

나는 하노이의 탑승 게임을하기 위해 데이터 구조에 ArrayList의 ArrayList를 사용하고 있습니다. 나는 확실히 사용자가 작은 디스크의 상단에 더 큰 디스크를 이동하려고하지 않는 체크를하고 확인하기 위해 부울 방법을 사용하려고배열 목록에서 실제 정수 값을 얻는 방법

private ArrayList<ArrayList> lists = new ArrayList<ArrayList>(); 
private ArrayList<Integer> peg1 = new ArrayList<Integer>(); 
private ArrayList<Integer> peg2 = new ArrayList<Integer>(); 
private ArrayList<Integer> peg3 = new ArrayList<Integer>(); 


//Constructor 
public TowersOfHanoi() { 

    lists.add(null); 
    lists.add(peg1); 
    lists.add(peg2); 
    lists.add(peg3); 
} 

public ArrayList initializeGame(int n) { 

    for (int i = 0; i < n; i++) { 
     peg1.add(i+1); 
    } 

     return peg1; 
    } 
} 

그러나, 다음과 같이 게임 제작 및 초기화 , 나는 arrayList에 저장된 정수 값을 어떻게 가져올 지 이해하지 못합니다. 정수 값은 디스크의 직경을 측정하는 방법으로 사용됩니다. I.E. 1은 2보다 작습니다. 3보다 작습니다. 이것은 제가 작성한 코드입니다 ... 나는 그저 거기에 저장된 정수의 실제 값이 아니라 인덱스를 얻고 있다고 믿습니다. 실제 값을 얻으려면 어떻게해야합니까?

public boolean isMoveLegal(int moveFrom, int moveTo){ 

    ArrayList<Integer> fromPeg = lists.get(moveFrom); 
    int x = (fromPeg.remove(0)).intValue(); 

    ArrayList<Integer> toPeg = lists.get(moveTo); 
    int y = (toPeg.get(0)).compareTo(x); 

    if(x<y){ 

    System.out.println("illegal move"); 
    } 

    return false; 
} 
+0

당신도 먼저 Javadoc을 살펴나요? –

+0

isMoveLegal() 메소드는 항상 * false *를 반환한다는 것을 알고 계십니까? –

+0

'remove'와'get' 두 값을 인덱스가 아닌리스트에서 반환합니다. 답은 "compareTo"가 그것을 엉망으로 만들기 때문에 목록에서 값으로'y'를 설정하지 않는다고 말합니다. 또한 : (1)'Integer'가 있다면'intValue()'를 쓰지 않고'int'에 할당 할 수 있습니다. (이것을 자동 언 박싱이라고합니다.) (2)'ArrayList '대신'ArrayList >'을 사용하십시오. 절대적으로 필요한 경우를 제외하고 유형 매개 변수 ('Integer')없이 제네릭 형식 (예 :'ArrayList')을 사용하면 안됩니다. – ajb

답변

1

문제를 사용할 수 있어야한다 그것이 퇴각 할 경로 n true : 유일한 return 문은 false입니다.

return x >= y; 

이 줄이 너무 잘못 :

int y = (toPeg.get(0)).compareTo(x); 

오히려 y에 실제 값을 얻는 것보다, 당신이 xy의 비교 결과를 저장하고, 다음과 같이 return 문을 변경해야합니다 어느 아니요 뭔가 당신은 다시 x과 비교해야합니다.

덧붙여서, 당신의 수표 상단에있는 디스크를 제거합니다 (귀하의 코드에서 탑 꼭대기가 위치 0에 해당한다는 것은 명백합니다, 그러나 이것은 확실히 작동 할 수 있습니다).).

remove(0)을 사용하는 대신, 페그의 내용이 비어 있지 않은지 확인한 후에 get(0)을 사용해야합니다.

"보낸 사람"못이 비어 있으면 이동이 잘못되었습니다. "to"페그가 비어 있으면 이동이 유효합니다. 그렇지 않으면 일반 비교 규칙이 적용됩니다 (즉, 더 큰 디스크는 더 작은 디스크의 상단에 놓일 수 없습니다).

public boolean isMoveLegal(int moveFrom, int moveTo){ 
    ArrayList<Integer> toPeg = lists.get(moveTo); 
    if (toPeg.isEmpty()) return true; // You can move anything on an empty peg 
    int y = toPeg.get(0).intValue(); 
    ArrayList<Integer> fromPeg = lists.get(moveFrom); 
    if (fromPeg.isEmpty()) return false; // No disks on the "from" peg 
    int x = fromPeg.get(0).intValue(); 
    if(x>y){ 
     System.out.println("illegal move"); 
     return false; 
    } 
    return true; 
} 
+0

나는 당신이 말하는 것을 이해합니다. 'fromPeg.remove (0)'을'fromPeg.get (0)'으로 변경하고 return 문을 변경했지만, 더 큰 디스크를 더 작은 디스크에 넣을 수 있습니다. –

+0

나는 바보 야. 이 작동합니다. 고맙습니다. –

1

이,

int y = (toPeg.get(0)).compareTo(x); 

isMoveLegal가없는 것입니다

int y = (toPeg.size() > 0) ? toPeg.get(0).intValue() : -1; 

같은 그런 다음 당신은 당신의 코드

if (x > y) { // <-- the reverse of like you were, because the to peg is y. 
+0

'int y = (toPeg.size()> 0)? toPeg.get (0) .intValue() : -1;'이 멍청한 일을 실제로 던지려합니다. –

+0

또한 OP가 디스크를 실제로 이동하지 않는 한 remove()를 호출하면 안됩니다. – Jason

+0

제안 해 주셔서 감사합니다. 이것은 구문 론적 마술처럼 보이지만 유감스럽게도 여전히 작동하지 않습니다. 나는'fromPeg.remove (0) .intValue()'를 사용하여'x'에 저장하고'toPeg.get (0) .intValue()'를 사용하여'y'에 저장하려고 시도했다. 인덱스에 저장된 실제 정수가 아닌 인덱스의 정수 값만 저장한다고 가정하면 올바른 것입니까? 나는 이것이 나의 문제가있는 곳이라고 생각한다. –

1
public boolean isMoveLegal(int moveFrom, int moveTo){ 

    ArrayList<Integer> fromPeg = lists.get(moveFrom); 
    if(fromPeg != null && fromPeg.size() > 0) { 

     int x = fromPeg.get(0).intValue(); 

     ArrayList<Integer> toPeg = lists.get(moveTo); 
     if(toPeg != null) { 

      if(toPeg.size() == 0) { 
       return true; 
      } else { 

       int y = toPeg.get(0).intValue(); 

       if(x<y){ 
        return true; 
       } 
      } 
     } 
    } 

    System.out.println("illegal move"); 

    return false; 
} 
+0

고맙습니다. 나는'toPeg.size() == 0'을'toPeg.isEmpty()'로 대체 할 수 있다고 믿는다. –

관련 문제