2011-03-15 10 views
4

Java에 익숙하지 않은 나는 Java Tetris 게임을 만드는 데 유용한 튜토리얼을 발견했다.새로운 객체를 만드는 이유 - Java Tetris 튜토리얼

내가 멘토 또는이 나를 도울 수있는 교사가 필요 없다 - 필자는 연령대에 하나 찾고를 :( 그래서 현재 메신저 자기 학습 자바와 PHP :

어쨌든을 heres 웹 사이트는 내가 발견 http://zetcode.com/tutorials/javagamestutorial/tetris/ 나는 Shape.java 클래스에서 얻을 해달라고 프로그램의

한 가지 방법 : 이미 현재의 조각 FR을 얻을 수 있다면

public Shape rotateLeft() 
{ 
if (pieceShape == Tetrominoes.SquareShape) 
    return this; 

Shape result = new Shape(); 
result.pieceShape = pieceShape; 

for (int i = 0; i < 4; ++i) { 
    result.setX(i, y(i)); 
    result.setY(i, -x(i)); 
} 
return result; 
} 

왜 우리는 새로운 객체 Shape result = new Shape();를 작성해야합니까 변수 pieceShape?

+0

여기서 pieceShape 선언은 무엇입니까? 어쩌면 그것은 코드의 다른 부분입니다 ... – Heisenbug

답변

5

이 튜토리얼에서는 약간의 오해의 소지가있는 것 같습니다. Shape 클래스는 떨어지는 단일 항목을 나타냅니다. Tetrominoesenum인데 어떤 항목이입니다 (즉, "모양"입니다!).

게시 한 코드가 인 새 코드를 만들고 모양을 지정합니다. 그렇지 않은 경우

rotateRight()rotateLeft() 방법은 tryMove() 방법은 이동이 합법적인지 확인하고 무시 할 수 있도록 모양 자체를 수정하지 않는 (예를 들어, 당신은 벽에 항목을 돌려 줄 경우) . tryMove()은 이동이 허용되지 않을 때 이전 값 (이전 Shape 인스턴스 포함)을 유지합니다. rotateLeft()/rotateRight()Shape으로 수정 된 경우 해당 작업을 실행 취소해야하므로 코드가 복잡해집니다. enum 유형은 일반적으로 단수 이름이 지정됩니다 당신이 종종 단일 요소를 참조하기 때문에

  • 내가 (즉, Tetrominoes 클래스 Tetromino를 호출 할 것 : 또한

    ,이 코드 몇 nitpicks이있다 : Tetromino.SquareShape. 내가 콘크리트에 대한 정보, 그 enum에 각 Tetromino의 좌표를 효율적으로 setShape() 방식과 논리의 많은 퍼팅을 추가 할 것

  • .
  • Board 클래스는 로직과 프리젠 테이션을 섞어서 분리해야합니다 (테스트하기가 훨씬 쉬워야합니다).

    예를 들어, Board 클래스는 그래픽 없이도 모든 로직을 구현할 수 있습니다 (즉, java.awt 또는 javax.swing의 항목을 참조하지 않음). 그런 다음 Board 상태를 그리고 사용자와 상호 작용하여 Board 메서드를 호출하는 BoardPanel을 작성합니다.

+0

감사합니다 힙! 이 빠른 답변 !!! 이것은 많이 설명합니다! 감사합니다. 감사합니다. – VisualFire

3

게시 한 메소드는 왼쪽으로 회전 한 모양을 반환합니다. 새 셰이프를 만들지 않은 경우 클래스의 필드이고 다른 모든 곳에서 사용되는 원래 셰이프가 회전되었을 것입니다.

왼쪽으로 돌릴 때 변경되지 않은 사각형 모양의 경우에도 여전히 원래 모양을 반환 할 수 있습니다.

+0

감사합니다 kgiannakakis, 귀하의 대답은 간단하고 직접 지점에 - 왜 내가 2 대답을 확인 캔트 : ( – VisualFire

0

튜토리얼에서 철저하게 보지 않고 내가이 말할 것 : Shape는 개별 항목을 나타내는 보인다 rotateLeft()는 또한 장소에 항목을 회전 확인 될 수 Shape의 인스턴스 방법이 될 수 있기 때문에,하지, 즉 회전 된 복사본을 반환하지만 블록의 현재 모양의 좌표를 변경합니다. 새 항목을 작성하면 기본 방향으로 새 Shape을 작성해야합니다.

0

ShaperotateLeft()에 변경되지 않은 것으로 보입니다. 유효한 이동으로 허용되지 않았기 때문일 수 있습니다. Board에서 TAdapter 클래스는 tryMove()을 호출하고 수용 가능한 경우 현재 Shape (변수 curShape) 만 설정합니다. 이 검사 전에 돌연변이가 발생했다면 유효하지 않을 때 다시 설정해야합니다. 이 메소드의 상태가 변경되지 않았 음을 나타내려면이 메소드의 이름을 rotatedLeftCopy()으로 지정해야합니다. 또는 사전에 점검을 수행해야하며 rotateLeft()Shape을 안전하게 교체 할 수 있습니다.

+0

mutate? 아직 프로가 아닌데 - 나는 아프다고 생각한다. 나는 아직도 당신의 대답을 당신에게 감사해야합니다 :) – VisualFire

+0

mutate에 의해 나는 그것이 단순히 객체의 상태를 바꾸는 것을 의미합니다. 이 경우 X와 Y 변수를 설정하십시오. 불변의 오브젝트를 쓰는 것에 이점이 있습니다 (예를 들어'String'는 불변입니다), 상태를 변경할 수 없습니다. 대신 원하는 변경 사항을 가진 객체의 사본을 반환하는 메소드 (예 :'split()')를 찾을 수 있습니다. 또한 때로는 객체 복사본을 반환하여 사용자가 실수로 반환 한 클래스의 컨트롤 외부에서 내용을 조작하지 못하도록하는 방어 프로그래밍 기법이기도합니다. – WhiteFang34