가능한하지만 매우 비효율적 인 방법 :
- 쉽게 이해하여 표현 전환. 회색 셀을 0으로하고 흰색 셀을 1로 지정하십시오.
플레이어가 국경으로 돌아 왔을 때 영역 식별. 게임 필드의 임시 사본을 만드십시오. 크기가 계산되기 시작합니다. (복사 된 필드에서 모든 값을 변경해야합니다!)
여기에서 재귀 적 접근을 시도 할 수 있습니다. "1"셀을 선택하고 카운터 변수에 1을 더하십시오. 셀을 0으로 바꾸고 인접한 셀을 살펴보십시오. 값이 "1"인 모든 셀을 재귀 적으로 분기합니다.
당신이 AREA 중 하나에서 시작하여 "벽"으로 영역을 채우기 시작하면서 채운 필드 수를 기억하십시오. 국경에서 벗어나기 때문에 지역 경계를 벗어나지 않고 이웃들에게 진전하여 포함 된 모든 지역을 공격해야합니다.
영역이 "완료되었습니다"(모든 필드가 0으로 설정되고 모든 재귀 분기가 반환 됨) 카운터 변수는 영역의 크기를 나타냅니다.이전 단계의 영역을 반복하여 계산할 때 빨간색 볼을 확인할 수도 있습니다.
다음 영역으로 이동하려면 1을 누르기 전까지 전체 필드를 반복해서 반복하고 이전 단계를 반복하십시오.
전체 필드를 반복하고 1을 찾지 못하면 모든 영역을 평가하고 완료됩니다. , 정말 효과가 경고했다,하지만 난 복잡한 코너의 경우에 실행하지 않고 지금 더 나은 방법을 생각할 수 없기 때문에
... 해명에 대한
UPDATE에 코멘트보기 참조 용으로이 대답. 한 지역의 순환 세포 평가
의사 코드 :
int areaSize = 0;
//find the first starter cell to detect first area
Cell starter = findCellWithValue1();
//if starter is null, no cell with value 1 has been found
if(starter != null) {
//feed the starter cell into the recursive function
areaSize = evaluateCell(starter);
}
int evaluateCell(Cell selected) {
//counter variable to accumulate branched values
int counter = 1;
//set this cell to 0 to not hit it again when evaluating neighbours
selected.setValue(0);
//check neighbour to the left
Cell neighbour = getCellAt(selected.getX()-1, selected.getY());
if(neighbour.getValue()==1) {
counter += evaluateCell(neighbour);
}
//check neighbour to the right
neighbour = getCellAt(selected.getX()+1, selected.getY());
if(neighbour.getValue()==1) {
counter += evaluateCell(neighbour);
}
//check top neighbour
neighbour = getCellAt(selected.getX(), selected.getY()+1);
if(neighbour.getValue()==1) {
counter += evaluateCell(neighbour);
}
//check bottom neighbour
neighbour = getCellAt(selected.getX(), selected.getY()-1);
if(neighbour.getValue()==1) {
counter += evaluateCell(neighbour);
}
//return accumulated size
return counter;
}
이 궁극적으로 불필요한 검사 꽤 많이 수행하지만 거대한를 가질 계획이 아니라면 나는 그들이 너무 비싸 생각하지 않는다 운동장.
영역의 최종 크기는 areaSize 변수의 내용입니다.
문제가있는 코드를 알려주십시오. – K3N
특정 라인이나 무언가에 문제가있는 것은 아닙니다. 어떤 접근 방식을 사용해야할지 모르겠습니다. 그리고 현재 코드는 500 개 이상의 라인에 있으므로, 아마 그것을 게시하는 것은별로 유용하지 않을 것입니다. – trainoasis
게임에 대해 더 잘 설명해 주시겠습니까? 그래서 플레이어는 이동하면서 어떻게 든 장벽을 만들 수 있습니까? – markE