Ono to není ani moc složité, jenom to chce trochu potrápit hlavičku: Nám jde o to, aby se ke každému penízku Vaše potvora mohla prokousat. Což tedy ty penízky umisťovat stejně? Udělám si hrací pole (obvodové a vnitřní zdi) tak, jak jste zvyklý umístím hráče a sám se postavím na stejné pole, jako je on. (modré potvory ještě nechám v klidu). No a teď se podívám na políčko, které mám po levé ruce, a pokud je toto políčko volné, umístím na něj puntík, postavím na něj brášku a řeknu mu, ať dělá úplně totéž, co já. Dále se o brášku nestarám a kouknu se na políčko přede mnou a opět - je-li tam pusto a prázdno, dám další puntík a pošlu na něj dalšího brášku se stejnými instrukcemi. Sám se stejným způsobem ještě zajímám o políčko vpravo ode mne a nakonec to za zády. Tím mám padla. No a každý z mých brášků dělá na "svém" políčku totéž, co jsem před chvílí dělal já, a umístí další bodíky a další brášky.... A až všichni bráškové zkontrolují všechna 4 svá sousední políčka, je pohádky konec a máme vystaráno, protože na všech políčkách, na která je možno jakkoliv dojít z výchozí pozice máme ťumplíky, no a pokud se vám při stavění zdi stane ten malér, že nějakou část pole uzavřete, vůbec to nevadí - vnitřní políčka budou bez penízků (pouze nezapomeňte počítat s tím, že nyní nemáte plný počet bodíků v každém kole při vyhodnocování skóre). No a v řeči VB tato "složitost" vypadá nesmírně jednoduše:
Sub vykreslitBody()
' vykreslíme body všude tam, kde není zeď a přitom je pole přístupné
' výchozí poloha bude na souřadnicích, na kterých je umístěn hráč [hrac.X,hrac.Y]
prozkoumejOkoli(hrac.X, hrac.Y)
' po provedeném průzkumu body vykreslím
For x As Integer = 1 To 15
For y As Integer = 1 To 15
If pole(x, y) = obsazeni.bod Then
g.DrawImage(ImageList1.Images(9), x * 35, y * 35)
End If
Next
Next
End Sub
Private Sub prozkoumejOkoli(ByVal X As Integer, ByVal Y As Integer)
' rekurzivní funkce, která jako vstup obdrží bod hracího pole, jehož okolí má prozkoumat
' prozkoumáme nejprve políčko vlevo od stávající pozice
' pokud je pole vlevo od aktuální pozice prázdné,
' pak na ně umístím bod a zkusím opětovným voláním stejné funkce
' prozkoumat jeho okolí
If pole(X - 1, Y) = obsazeni.volno Then pole(X - 1, Y) = obsazeni.bod : prozkoumejOkoli(X - 1, Y)
' totéž udělám pro políčko nad aktuální pozicí...
If pole(X, Y - 1) = obsazeni.volno Then pole(X, Y - 1) = obsazeni.bod : prozkoumejOkoli(X, Y - 1)
' ...a vpravo od ní...
If pole(X + 1, Y) = obsazeni.volno Then pole(X + 1, Y) = obsazeni.bod : prozkoumejOkoli(X + 1, Y)
' ... a ještě dole
If pole(X, Y + 1) = obsazeni.volno Then pole(X, Y + 1) = obsazeni.bod : prozkoumejOkoli(X, Y + 1)
End Sub
No a pokud se Vám, tak jako mně, po několika pokusech o "rozdání" puntíků na hrací pole stane, že Vám hra "zamrzne", je to tím, že nemáte ošetřenu ještě jednu drobnost a totiž stav, kdy si kolem hráče nastavíte natěsno zdi ze všech 4 stran, takže se chudák hned od začátku nemůže ani hnout.:o(
|