Udělejte si třídu a každé políčko reprezentujte jako instanci té třídy. U každého políčka si zapamatujete pozici a stav a dáte tam metodu GetNeighbours (sousední políčka), která bude vracet kolekci sousedních políček. Předpokládám, že Fields je pole, kde máte uložená jednotlivá políčka a řádky máte zarovnané doleva (tzn. na prvním řádku je jedno políčko, na druhém dvě, na N-tém je jich obsazených prvních N). Pak se sousedi hledají celkem jednoduše.
Public Class GameField
'souřadnice X
Public Property X As Integer
'souřadnice Y
Public Property Y As Integer
'pole políček (řádky jsou zarovnané doleva)
Public Property Fields(,) As GameField
'vrací sousední políčka
Public Function GetNeighbours() As List(Of GameField)
Dim neighbours As New List(Of GameField)
'horní sousedi
If Y > 0 Then
If X < Y Then neighbours.Add(fields(X, Y - 1))
If X + 1 < Y Then neighbours.Add(fields(X + 1, Y - 1))
End If
'sousedi ve stejném řádku
If X > 0 Then neighbours.Add(fields(X - 1, Y))
If X < Y Then neighbours.Add(fields(X + 1, Y))
'dolní sousedi
If Y < RowCount - 1 Then
neighbours.Add(fields(X, Y + 1))
neighbours.Add(fields(X + 1, Y + 1))
End If
Return neighbours
End Function
End Class
S tímhle arzenálem si pak můžete snadno napsat funkci, která bude hledat cesty - tzn. nějaká varianta prohledávání do šířky. Vytvoříte si například frontu Queue(Of GameField) a do ní nacpete libovolné políčko. Zjistíte jeho sousedy a pokud náleží danému hráči, přidáte je taky do fronty a do seznamu. Pak vždycky z fronty vytáhnete jeden prvek a jeho sousedy opět přidáte do fronty a do svého seznamu (ale pozor, jen takové sousedy, které jste ještě nezpracoval). Jakmile se do fronty už nic přidat nedá, našel jste skupinu políček, která je souvislá. Pokud sahá na všechny tři strany, máte vyhráno. Pokud má hráč víc skupin, které spolu nesousedí, spustíte tenhle algoritmus znovu, začnete s libovolným políčkem, které jste ještě nezpracoval. Hledejte na Internetu - algoritmus se jmenuje něco jako "hledání komponent souvislosti".
|