2011-10-21 5 views
1

Conway's Game of Life을 만들고 싶습니다. Java 2d API를 읽었지만 Graphics 클래스는 의 paintComponent에 대한 drawRect()fillRect()에 대한 메소드 만 제공합니다. 즉, 직사각형을 객체로 개별적으로 처리 할 수 ​​없으므로 주변의 객체와 관련하여 어떤 객체가 있는지 확인할 수 있습니다.
사각형을 개별적으로 처리하고 그리드를 동적으로 생성 할 수 있도록 사각형이 어떻게 만들어 지는지 묻고 싶습니다.사각형 격자를 동적으로 생성합니다.

답변

2

모든 속성이 필요한 Sqaure 클래스를 만듭니다. 보드를 나타내는 Square 개체 목록을 만듭니다. JPanel의 그리기 메서드에서 사각형 개체 목록을 반복하면서 각 개체를 속성에 따라 그립니다.

가능한 한 많이 디스플레이 코드를 로직과 분리하십시오. 거의 항상 좋은 아이디어입니다.

+0

어떻게 Square Selectable을 만들 수 있습니까? 내가 만든 사각형 위에'MouseListener' 인터페이스를 구현할 수 있습니까? – prometheuspk

+0

JPanel 위에 MouseListener를 구현하고 클릭의 좌표를 가져오고 해당 좌표가 Square 객체 안에 있는지 확인할 수 있습니다 (렌더링 할 때 Square 객체의 좌표를 설정하는 것이 좋습니다). 그 (것)들, 또는 더 나은 그럼에도 불구하고, 사각을 창조 할 때 협동 조합을 놓은 다음, 그 협동 조합을 사용하여 그들을 표시 할 위치를 선택하십시오.) –

+1

좋은 조언. 게임 라이프 (Life of Game)와 같은 경우, 패널에서 버튼이나 라벨과 같은 구성 요소로 모든 것을 나타내려는 대신 좌표 검사를 통해 선택된 사각형을 파악하는 것이 훨씬 낫습니다. 그것은 더 반응적이고 가볍습니다. model-view-controller 패턴 (일반적으로 MVC로 약칭 됨)을 읽어야합니다. 그리드가 모델이고, 시각화는 마우스 이벤트에 응답하여 뷰와 동시에 컨트롤러입니다. –

1

완전히 다른 해결책을 제안하고 싶습니다. 일반적으로 생성 된 그래픽을 출력 전용으로 처리해야합니다. 즉, 너무 느릴 수 있기 때문에 그래픽에서 상태를 읽지 않으려 고합니다. 2 차원 배열처럼 셀의 상태를 다른 곳에 유지해야합니다. 부울 [] [] 또는 int [] [] 예를 들어. 그러면 셀의 값을 가져 와서 그 셀을 가져 오는 정렬의 "렌더링"방법이 필요합니다.

하지만이 작업을 더 차가운 방법으로 제안하고 싶습니다. 2 차원 배열을 유지하는 대신 BufferedImage가 구성되는 (1 차원) 배열을 사용하십시오. 일반적으로 각 "픽셀"은 해당 배열의 요소입니다. 그런 다음 drawImage를 사용하여 해당 이미지를 그린 다음 해당 이미지를 확대합니다. 이것은 정말 잘 수행 할 수 있습니다. 실시간으로 전체 화면을 그릴 수 있습니다.

BufferedImage에는 여러 가지 방법이 있지만 처음에는 다소 혼란 스럽습니다. 결국에는 어딘가에서 DataBuffer를 찾을 수 있습니다. int []에 대한 액세스 권한이 필요합니다.

그런 다음 셀을 설정하려면 data [y * width + x] = -1; (흰색 셀) 셀을 지우려면 : data [y * width + x] = 0; (검정색 셀) (예 : - 또는 그 반대로 - 또는 다른 색상).

정말 멋질 수 있습니다. 항상 y * width + x를 계산하지 않고 다양한 오프셋 변수를 사용할 수 있으며, 실제로 잘 최적화 할 수 있습니다. 사실, 나는 그렇게 효율적으로 만들 수있는만큼, C++에서 똑같은 프로그램을 만드는 다른 사람보다 실제로 성능이 뛰어날 수 있습니다.

+0

이것이 성능 콘테스트의 일부라면, 심지어 더 효율적인 알고리즘을 제안 할 수도 있습니다. 80 년대에 아미타 (Commodore Amiga)에서 블리터 (Blitter) 칩을 사용하고 라이프 프로그램을 만들었습니다.필자는 정말로 이상한 알고리즘을 생각해 냈습니다.이 알고리즘을 사용하여 실시간 전체 화면 고해상도 게임을 만들었습니다.이 게임은 7MHz 컴퓨터 (0.007GHz)에서 수행되었습니다. 나는 블리터를 모방하고 이것을 다시 할 수 있습니다. 일반적으로 생각할 수있는 것이 아니지만, 놀라운 결과를 낼 수 있습니다. 예를 들어 100xfx에서 5000x5000 셀 어레이 나 그와 같이 우스운 것입니다. – Mike

+0

그리고 GPU가 그걸 채용 할 수 있습니다. 그건 내가 아는 것 이상이다. – Mike

관련 문제