Public Class Ukladanka Dim listaPaneliTla As New List(Of Tuple(Of Panel, Integer, Integer)) Dim listaLokalizacji As New List(Of Tuple(Of String, Integer, Integer)) Dim kolorTla As Color = Color.Transparent Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim wielkosc As Integer = 4 'wielkość planszy Panel_glowny.Size = New Size(wielkosc * 50 + 48, wielkosc * 50 + 48) Panel_glowny.Location = New Point((Me.Width - Panel_glowny.Width) / 2, Panel_glowny.Location.Y) For i As Integer = 0 To wielkosc - 1 For j As Integer = 0 To wielkosc - 1 Dim pan2 As New Panel With pan2 .Location = New Point(45 + i * 49, 45 + j * 49) .Size = New Size(10, 10) .BackColor = Color.Black .Name = "panL_" + i.ToString + j.ToString .Cursor = Cursors.Hand AddHandler .Click, AddressOf pan_Click End With listaLokalizacji.Add(Tuple.Create(pan2.Name, i, j)) Panel_glowny.Controls.Add(pan2) ' Umieszcza elemeny na planszy Next Next For i As Integer = 0 To wielkosc For j As Integer = 0 To wielkosc Dim pan As New Panel With pan .Location = New Point(1 + i * 49, 1 + j * 49) .BackColor = kolorTla .Size = New Size(49, 49) .Name = "pan_" + i.ToString + j.ToString .BorderStyle = BorderStyle.FixedSingle End With listaPaneliTla.Add(Tuple.Create(pan, i, j)) Panel_glowny.Controls.Add(pan) ' Umieszcza elemeny na planszy Next Next wybieramy(Pan_wew1, Pan_wew3, Pan_wew2, Pan_wew4) wybieramy(Pan_wew5, Pan_wew7, Pan_wew6, Pan_wew8) End Sub Public Sub pan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim lok1 As Integer Dim lok2 As Integer For i As Integer = 0 To listaLokalizacji.Count - 1 If listaLokalizacji(i).Item1 = DirectCast(sender, Panel).Name Then lok1 = listaLokalizacji(i).Item2 lok2 = listaLokalizacji(i).Item3 Exit For End If Next If sprawdzCzyMozna(lok1, lok2) = True Then koloruj(lok1, lok2) przesuwamy() UsunKoloryWPoblizu(lok1, lok2) sprawdzCzyToKoniecGry() wybieramy(Pan_wew5, Pan_wew6, Pan_wew7, Pan_wew8) End If End Sub Private Sub koloruj(ByVal lok1 As Integer, ByVal lok2 As Integer) If Not Pan_wew1.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 And listaPaneliTla(i).Item3 = lok2 Then listaPaneliTla(i).Item1.BackColor = Pan_wew1.BackColor Exit For End If Next End If If Not Pan_wew3.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 And listaPaneliTla(i).Item3 = lok2 + 1 Then listaPaneliTla(i).Item1.BackColor = Pan_wew3.BackColor Exit For End If Next End If If Not Pan_wew2.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 + 1 And listaPaneliTla(i).Item3 = lok2 Then listaPaneliTla(i).Item1.BackColor = Pan_wew2.BackColor Exit For End If Next End If If Not Pan_wew4.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 + 1 And listaPaneliTla(i).Item3 = lok2 + 1 Then listaPaneliTla(i).Item1.BackColor = Pan_wew4.BackColor Exit For End If Next End If End Sub #Region "wybor rodzaju kwadracikow" Dim random As New Random Private Sub wybieramy(ByRef pan1 As Panel, ByRef pan2 As Panel, ByRef pan3 As Panel, ByRef pan4 As Panel) Dim wybor As Integer = random.Next(0, 4) 'czyści plansze wyświetlającą wybrany element pan1.BackColor = kolorTla pan2.BackColor = kolorTla pan3.BackColor = kolorTla pan4.BackColor = kolorTla 'Dodaje kolory do listy Dim listaKolorow As New List(Of Color) listaKolorow.Add(Color.FromArgb(100, 187, 132)) listaKolorow.Add(Color.FromArgb(94, 193, 235)) listaKolorow.Add(Color.FromArgb(217, 187, 213)) listaKolorow.Add(Color.FromArgb(245, 209, 13)) 'W tej grze są tylko cztery kolory. Grę można utrudnić, dodając dodatkowy kolor 'Każdy kolor może być wybrany tylko raz, dba o to list poniżej: Dim listaWyborowa As New List(Of Boolean) For i As Integer = 0 To 3 listaWyborowa.Add(False) Next 'Po wybraniu, kolor ustawiany jest na tru i nie może być ponownie wybrany If wybor = 0 Then '11 '10 Dim ran As Integer = random.Next(0, 4) pan1.BackColor = listaKolorow(ran) listaWyborowa(ran) = True Do Dim ran2 As Integer = random.Next(0, 4) If listaWyborowa(ran2) = False Then pan2.BackColor = listaKolorow(ran2) listaWyborowa(ran2) = True Exit Do End If Loop Do Dim ran2 As Integer = random.Next(0, 4) If listaWyborowa(ran2) = False Then pan3.BackColor = listaKolorow(ran2) listaWyborowa(ran2) = True Exit Do End If Loop ElseIf wybor = 1 Then '10 '11 Dim ran As Integer = random.Next(0, 4) pan1.BackColor = listaKolorow(ran) listaWyborowa(ran) = True Do Dim ran2 As Integer = random.Next(0, 4) If listaWyborowa(ran2) = False Then pan2.BackColor = listaKolorow(ran2) listaWyborowa(ran2) = True Exit Do End If Loop Do Dim ran2 As Integer = random.Next(0, 4) If listaWyborowa(ran2) = False Then pan4.BackColor = listaKolorow(ran2) listaWyborowa(ran2) = True Exit Do End If Loop ElseIf wybor = 2 Then '01 '11 Dim ran As Integer = random.Next(0, 4) pan2.BackColor = listaKolorow(ran) listaWyborowa(ran) = True Do Dim ran2 As Integer = random.Next(0, 4) If listaWyborowa(ran2) = False Then pan3.BackColor = listaKolorow(ran2) listaWyborowa(ran2) = True Exit Do End If Loop Do Dim ran2 As Integer = random.Next(0, 4) If listaWyborowa(ran2) = False Then pan4.BackColor = listaKolorow(ran2) listaWyborowa(ran2) = True Exit Do End If Loop Else '11 '01 Dim ran As Integer = random.Next(0, 4) pan1.BackColor = listaKolorow(ran) listaWyborowa(ran) = True Do Dim ran2 As Integer = random.Next(0, 4) If listaWyborowa(ran2) = False Then pan3.BackColor = listaKolorow(ran2) listaWyborowa(ran2) = True Exit Do End If Loop Do Dim ran2 As Integer = random.Next(0, 4) If listaWyborowa(ran2) = False Then pan4.BackColor = listaKolorow(ran2) listaWyborowa(ran2) = True Exit Do End If Loop End If End Sub #End Region #Region "Sprawdza czy mozna polozyc obiekt" Private Function sprawdzCzyMozna(ByVal lok1 As Integer, ByVal lok2 As Integer) As Boolean If Not Pan_wew1.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 And listaPaneliTla(i).Item3 = lok2 Then If listaPaneliTla(i).Item1.BackColor = kolorTla Then Exit For Else Return False Exit For End If End If Next End If If Not Pan_wew3.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 And listaPaneliTla(i).Item3 = lok2 + 1 Then If listaPaneliTla(i).Item1.BackColor = kolorTla Then Exit For Else Return False Exit For End If End If Next End If If Not Pan_wew2.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 + 1 And listaPaneliTla(i).Item3 = lok2 Then If listaPaneliTla(i).Item1.BackColor = kolorTla Then Exit For Else Return False Exit For End If End If Next End If If Not Pan_wew4.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 + 1 And listaPaneliTla(i).Item3 = lok2 + 1 Then If listaPaneliTla(i).Item1.BackColor = kolorTla Then Exit For Else Return False Exit For End If End If Next End If Return True End Function #End Region #Region "Sprawdza czy to koniec gry" Private Sub sprawdzCzyToKoniecGry() 'tworzy chwilową listę przechowującą: ' - tak jeśli da się ułożyć elementy ' - nie jeśli nie udało się ułożyć elementu Dim pierwszalistabool As New List(Of Boolean) 'pętra skanująca wszystkie możliwości For i As Integer = 0 To listaLokalizacji.Count - 1 pierwszalistabool.Add(CzyToKoniecGry(listaLokalizacji(i).Item2, listaLokalizacji(i).Item3, Pan_wew1, Pan_wew3, Pan_wew2, Pan_wew4)) Next 'Jeśli nasza lista nie zawiera elementów 'true' nawet jednego, oznacza to, że nie ma gdzie 'położyć naszych elementów i należy zakończyć grę If Not pierwszalistabool.Contains(True) Then Panel_glowny.Enabled = False 'blokada panelu For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item1.BackColor = kolorTla Then listaPaneliTla(i).Item1.BackColor = Color.Black 'zaciemnienie End If Next End If End Sub 'Funkcja identyczna jak ta sprawdzająca możliwość ułożenia Private Function CzyToKoniecGry(ByVal lok1 As Integer, ByVal lok2 As Integer, ByRef pan1 As Panel, ByRef pan2 As Panel, ByRef pan3 As Panel, ByRef pan4 As Panel) As Boolean If Not pan1.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 And listaPaneliTla(i).Item3 = lok2 Then If listaPaneliTla(i).Item1.BackColor = kolorTla Then Exit For Else Return False Exit For End If End If Next End If If Not pan2.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 And listaPaneliTla(i).Item3 = lok2 + 1 Then If listaPaneliTla(i).Item1.BackColor = kolorTla Then Exit For Else Return False Exit For End If End If Next End If If Not pan3.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 + 1 And listaPaneliTla(i).Item3 = lok2 Then If listaPaneliTla(i).Item1.BackColor = kolorTla Then Else Return False Exit For End If End If Next End If If Not pan4.BackColor = kolorTla Then For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 + 1 And listaPaneliTla(i).Item3 = lok2 + 1 Then If listaPaneliTla(i).Item1.BackColor = kolorTla Then Else Return False Exit For End If End If Next End If Return True End Function #End Region #Region "sprawdza czy sa w poblizy takie same kolory" Dim listaDoWyzerowania As New List(Of Panel) Dim punkty As Integer = 0 Private Sub UsunKoloryWPoblizu(ByVal lok1 As Integer, ByVal lok2 As Integer) 'Sprawdza wszystkie ułożone kwadraty po lokalizacji sp(lok1, lok2) sp(lok1 + 1, lok2) sp(lok1, lok2 + 1) sp(lok1 + 1, lok2 + 1) 'Zeruje kwadraty z takim samym tłem For i As Integer = 0 To listaDoWyzerowania.Count - 1 listaDoWyzerowania(i).BackColor = kolorTla Next 'lista wymagana do przydzielenia punktów Dim listaDouporzadkowania As New List(Of Panel) For i As Integer = 0 To listaDoWyzerowania.Count - 1 If Not listaDouporzadkowania.Contains(listaDoWyzerowania(i)) Then listaDouporzadkowania.Add(listaDoWyzerowania(i)) End If Next punkty += listaDouporzadkowania.Count Label_Punkty.Text = punkty.ToString listaDoWyzerowania.Clear() End Sub Private Sub sp(ByVal lok1 As Integer, ByVal lok2 As Integer) Dim zerujTylkoMoj As Boolean = False Dim mojpierwszykolor As Color Dim pane As New Panel 'Dodaje do listy sprawdzany kwadrat (wymagane, ponieważ elementy są sprawdzane z wyłączeniem elementu głównego) For i As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(i).Item2 = lok1 And listaPaneliTla(i).Item3 = lok2 Then mojpierwszykolor = listaPaneliTla(i).Item1.BackColor pane = listaPaneliTla(i).Item1 Exit For End If Next 'sprawdza elementy w pionie If Not mojpierwszykolor = kolorTla Then For i As Integer = lok1 - 1 To lok1 + 1 If Not i < 0 And Not i = lok1 Then For k As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(k).Item2 = i And listaPaneliTla(k).Item3 = lok2 Then If listaPaneliTla(k).Item1.BackColor = mojpierwszykolor Then zerujTylkoMoj = True listaDoWyzerowania.Add(listaPaneliTla(k).Item1) End If End If Next End If Next 'sprawdza elementy w poziomie For i As Integer = lok2 - 1 To lok2 + 1 If Not i < 0 And Not i = lok2 Then For k As Integer = 0 To listaPaneliTla.Count - 1 If listaPaneliTla(k).Item2 = lok1 And listaPaneliTla(k).Item3 = i Then If listaPaneliTla(k).Item1.BackColor = mojpierwszykolor Then zerujTylkoMoj = True listaDoWyzerowania.Add(listaPaneliTla(k).Item1) End If End If Next End If Next 'Jeśli odnajdzie elementy o takim samym kolorze dodaje do listy element glówny If zerujTylkoMoj = True Then listaDoWyzerowania.Add(pane) End If End If End Sub #End Region #Region "przesuwanie paneli" Private Sub przesuwamy() If Pan_wew5.BackColor = kolorTla Then Pan_wew1.BackColor = kolorTla Else Pan_wew1.BackColor = Color.FromArgb(255, Pan_wew5.BackColor) End If If Pan_wew7.BackColor = kolorTla Then Pan_wew3.BackColor = kolorTla Else Pan_wew3.BackColor = Color.FromArgb(255, Pan_wew7.BackColor) End If If Pan_wew6.BackColor = kolorTla Then Pan_wew2.BackColor = kolorTla Else Pan_wew2.BackColor = Color.FromArgb(255, Pan_wew6.BackColor) End If If Pan_wew8.BackColor = kolorTla Then Pan_wew4.BackColor = kolorTla Else Pan_wew4.BackColor = Color.FromArgb(255, Pan_wew8.BackColor) End If End Sub #End Region Private Sub LinkLabel1_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked Process.Start("http://visualmonsters.cba.pl/") End Sub End Class