스위프트 3 및 Xcode에서 작업하고 있습니다.스위프트에서 매우 느린 지뢰 찾기 재귀 알고리즘
기본적으로 지뢰 찾기 도구 인 iOS 게임을 만들지 만 사각형이 아니라 육각형이므로 각 육각형의 주변에는 최대 6 개의 지뢰가있을 수 있습니다.
플레이어가 육각형에 닿으면 폭탄이 아니라면 "계시"라는 재귀 함수가 호출됩니다. - 하나 이상의 광산이 주변에 있고 터치 된 경우 육각형은 여전히 숨겨져 있습니다 (숨겨진 의미로는 광산인지 아닌지를 알 수 없음). 육각형을 나타냅니다. & 주변 광산 레이블의 수를 설정하고 기능을 중지하십시오. - 주변에 광산이 없으면 근처에 각각 숨겨진 육각형. 계시 기능을 호출하십시오.
그래서 여기 내 코드의 모습입니다 :
class Hexagon: SKShapeNode
{
var mine: Bool
var hide: Bool
var proximityMines: Int
init(mine: Bool = false, proximityMines: Int = 0, hide: Bool = true)
{
self.mine = mine // if it's a mine
self.proximityMines = proximityMines // number of surrounding mines (that I calculated using a function after I generated the level)
self.hide = hide // if the hexagon is still hidden
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
func reveal(hexagon: Hexagon)
{
if hexagon.proximityMines == 0 && hexagon.hide == true // if there are no mines in the surrounding
{
hexagon.hide = false // we update the value of this hexagon
setNumberLabel(hexagon: hexagon) // we set the .proximityMines number as a label (here 0)
for proxyHexagon in proximityHexagons(hexagon: hexagon) // for each surrounding hexagon ...
{
if proxyHexagon.hide == true // ... that is still hidden
{
reveal(hexagon: proxyHexagon) // we call this function again
}
}
}
else if hexagon.proximityMines != 0 && hexagon.hide == true // else if there are mines in the surrounding
{
hexagon.hide = false // update
setNumberLabel(hexagon: hexagon) // set label
}
}
proximityHexagons(hexagon: Hexagon)
함수는 주어진 육각형의 모든 주변 육각형을 포함하는 배열을 반환합니다.
그래서 알고리즘을 반복해서 확인했는데 실제로 좋은 알고리즘이라고 생각합니다.
사실 나는 0 또는 매우 적은 양의 광산으로 수준을 만들고 육각형을 클릭하면 재귀 함수가 모든 빈 육각형을 업데이트하는 데 2 초 정도 걸립니다. 내지도에는 260 개의 육각형이 포함되어 있으며 reveal()
의 전화 번호를 디버깅했으며 거의 같은 금액입니다.
왜 그렇게 많은 시간이 소요됩니까? iPhone 6이이 정도의 작업을 처리 할 수 없다고 생각합니다! 에뮬레이터가 아닌 내 iPhone에서 시험해 보았습니다. 의견이 있으십니까?
당신은 모든 주변 육각형에 모든 육각형에 그것을 반복적으로 호출합니다. 저는 전문가는 아니지만 O (N * N!)라고 생각합니다. 어쩌면 O (N^N)? 그리고 매번 육각형을 검사하고 있습니다. 덮개가있는 육각형은 덮개가 벗겨 질 때마다 꺼내서 검사해야합니다. –
지도의 각 육각형에 대해 reveal()이 한 번만 호출되는 경우 알고리즘이 정상인 것처럼 보입니다. 아마도 동기 호출 또는 그와 유사한 번호 레이블 차단 설정으로 인해 UI 관련 속도가 느려지는 것일까 요? 또한 proximityHexagons() 함수의 소요 시간을 확인하십시오. 한 가지 아이디어는 hide == true 인 육각형 만 반환하는 hiddenProximityHexagons() 함수를 작성하는 것입니다. 또한 함수 참조 번호 – samgak
@twiz_에서 객체 참조 또는 새로 생성 된 객체를 반환하는지 확인하십시오. 아니요. 함수가 육각형보다 정확하게 동일한 시간을 호출하므로 문제가 없었습니다. – Drakalex