Public Class Form1 Dim kolorTla As Color = Color.Transparent 'kolor tła gry Dim obrazekBledu As Bitmap = My.Resources.blad Dim Obrazek As Bitmap = My.Resources.obrazek Dim ListaKwadratow As New List(Of Panel) 'Lista, przechowuje wygenerowane kwadraciki Dim punktyDoZdobycia As Integer 'Określa ilość punktów jaką można zdobyć Dim iloscelementowUsuwanych As Integer 'Zasady gry wymagają aby razem z błędnym kwadratem znikały kwadraty odsłonięte Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'Określamy wielkość planszy do gry Dim wielkoscPlanszy As Integer = 3 'Tworzy przezroczysty kolor dla obrazka (usuwa biały kolor) Obrazek.MakeTransparent(Color.White) obrazekBledu.MakeTransparent(Color.White) 'Tworzy panel w którym będą zawieszone nasze małe kwadraty Dim panel_gry As New Panel 'Wielkość naszego małego kwadratu, szerokość i wysokość Dim wielkoscKwadratu As Integer = 100 'Pętla dobiera wielkość kwadratów jeśli nie mieszczą się na planszy gry If 50 * wielkoscPlanszy + 5 > Panel_glowny.Width Then wielkoscKwadratu = (Panel_glowny.Width - 5) / wielkoscPlanszy End If If wielkoscKwadratu * wielkoscPlanszy + 5 > Panel_glowny.Height Then wielkoscKwadratu = (Panel_glowny.Height - 5) / wielkoscPlanszy End If 'Generuje wielkość i lokalizację głównego panelu zawierającego małe kwadraty panel_gry.Size = New Size(wielkoscPlanszy * wielkoscKwadratu + 1, wielkoscPlanszy * wielkoscKwadratu + 1) panel_gry.Location = New Point((Panel_glowny.Width - panel_gry.Width) / 2, (Panel_glowny.Height - panel_gry.Height) / 2) 'Generuje zestaw małych kwadratów i wyświetla go na planszy For k As Integer = 0 To wielkoscPlanszy - 1 For d As Integer = 0 To wielkoscPlanszy - 1 Dim panelPodstawowy As New Panel With panelPodstawowy .Location = New Point(1 + k * wielkoscKwadratu, 1 + d * wielkoscKwadratu) .BackColor = kolorTla .BackgroundImageLayout = ImageLayout.Stretch .Cursor = Cursors.Hand .Size = New Size(wielkoscKwadratu, wielkoscKwadratu) .BorderStyle = BorderStyle.FixedSingle End With AddHandler panelPodstawowy.Click, AddressOf pan_Click ListaKwadratow.Add(panelPodstawowy) panel_gry.Controls.Add(panelPodstawowy) Next Next Panel_glowny.Controls.Add(panel_gry) 'Określamy, ile można zdobyć maksymalnie punktów punktyDoZdobycia = wielkoscPlanszy * 10 Label4.Text = punktyDoZdobycia 'Losuje nasze obrazki losowanieZnaczkow(Math.Floor((wielkoscPlanszy ^ 2) / 2)) 'Jeśli klikniemy na zły kwadracik, razem z nim zniknie 'iloscelementowUsuwanych' znaczków odkrytych iloscelementowUsuwanych = 2 'Blokuje możliwość kliknięcia na kwadracik w momencie wykonywania instrukcji kontrolerKlikniecia = True End Sub Dim ran As New Random Dim listaboolean As New List(Of Boolean) Private Sub losowanieZnaczkow(ByVal iloscPoprawnychPol As Integer) For i As Integer = 0 To ListaKwadratow.Count - 1 listaboolean.Add(False) Next Dim iloscznaczkow As Integer = 0 'Pętla uruchamiana jest do momętu wybrania odpowiedniej liczby 'losowych elementów bez powtórzeń (iloscznaczkow) Do Dim mojawylosowanawartosc = ran.Next(0, listaboolean.Count) If listaboolean(mojawylosowanawartosc) = False Then listaboolean(mojawylosowanawartosc) = True iloscznaczkow += 1 End If If iloscznaczkow = iloscPoprawnychPol Then Exit Do End If Loop 'Wyświetla ilość wybranych elementów Label2.Text = "0/" + iloscPoprawnychPol.ToString End Sub Dim panelWybrany As Panel Private WithEvents Timer1 As New Timer With {.Interval = 200} Private WithEvents Timer2 As New Timer With {.Interval = 1000} Dim kontrolerKlikniecia As Boolean = False Dim listaZlapanychObrazkow As New List(Of Panel) Public Sub pan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) If kontrolerKlikniecia = True Then 'blokuje grę, jeśli kwadraty są odsłonięte 'rozpoczyna grę If Not Timer2.Enabled = True Then Timer2.Start() End If panelWybrany = DirectCast(sender, Panel) 'przechowuje wybrany przez nas panel w zmiennej Dim indeX As Integer = ListaKwadratow.IndexOf(DirectCast(sender, Panel)) 'wyszukuje indeks panelu w liście 'Jeśli w liście "listaboolean" pod indeksem naszego kwadratu kruje się true (nasz poprawny obrazek) wtedy If listaboolean(indeX) = True Then 'Obrazek poprawny 'wyświetla obrazek DirectCast(sender, Panel).BackColor = Color.FromArgb(30, Color.LimeGreen) DirectCast(sender, Panel).BackgroundImage = Obrazek DirectCast(sender, Panel).Enabled = False 'dodaje nasz panel do listy odkrytych paneli listaZlapanychObrazkow.Add(DirectCast(sender, Panel)) 'wyświetla ilość zdobytych punktów Label2.Text = listaZlapanychObrazkow.Count.ToString + "/" + Math.Floor(ListaKwadratow.Count / 2).ToString 'Kończy grę, jeśli odkryliśmy już wszystkie obrazki If listaZlapanychObrazkow.Count = Math.Floor(ListaKwadratow.Count / 2) Then For i As Integer = 0 To ListaKwadratow.Count - 1 ListaKwadratow(i).BackColor = Color.FromArgb(100, Color.LimeGreen) ListaKwadratow(i).Enabled = False If listaboolean(i) = True Then ListaKwadratow(i).BackgroundImage = Obrazek Else ListaKwadratow(i).BackgroundImage = obrazekBledu End If kontrolerKlikniecia = False Timer2.Stop() Next Else kontrolerKlikniecia = True End If Else 'obrazek niepoprawny DirectCast(sender, Panel).BackColor = Color.FromArgb(30, Color.Red) DirectCast(sender, Panel).BackgroundImage = obrazekBledu kontrolerKlikniecia = False Timer1.Start() End If End If End Sub Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick 'zmniejsza punkty do zdobycia o jeden punktyDoZdobycia -= 1 'wyświetla te punkty w labelu na formie Label4.Text = punktyDoZdobycia.ToString 'kończy grę, jeśli nie ma już żadnych punktów do zdobycia If punktyDoZdobycia <= 0 Then 'pętla odkrywa wszystkie pola, podświetlając je na czerwono For i As Integer = 0 To ListaKwadratow.Count - 1 If listaboolean(i) = True Then ListaKwadratow(i).BackgroundImage = Obrazek Else ListaKwadratow(i).BackgroundImage = obrazekBledu End If ListaKwadratow(i).BackColor = Color.FromArgb(255, Color.Tomato) Next 'blokuje plansze kontrolerKlikniecia = False 'wyłącza timer Timer2.Stop() End If End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 'zatrzymuje timer Timer1.Stop() 'usówa obrazek z klikniętego panelu panelWybrany.BackgroundImage = Nothing panelWybrany.BackColor = kolorTla 'jeśli ilość elementów w złapanym obrazku jest większa od ilości elementów do usunięcia If listaZlapanychObrazkow.Count > iloscelementowUsuwanych Then Dim ilosc As Integer = 0 For i As Integer = 0 To iloscelementowUsuwanych - 1 'Wybierze losowy element Dim randomWybor As Integer = ran.Next(0, listaZlapanychObrazkow.Count) 'usunie jego obrazek listaZlapanychObrazkow(randomWybor).BackgroundImage = Nothing listaZlapanychObrazkow(randomWybor).BackColor = kolorTla 'usunie go z listy złapanych obrazków listaZlapanychObrazkow.RemoveAt(randomWybor) Next Else 'Jeśli obrazków jest mniej to usunie je wszystkie If Not listaZlapanychObrazkow.Count = 0 Then 'chyba, że lista jest pusta i nie ma co usuwać For i As Integer = listaZlapanychObrazkow.Count - 1 To 0 Step -1 'usuwa jego obrazek listaZlapanychObrazkow(i).BackgroundImage = Nothing listaZlapanychObrazkow(i).BackColor = kolorTla 'wywala z listy listaZlapanychObrazkow.RemoveAt(i) Next End If End If For i As Integer = 0 To ListaKwadratow.Count - 1 ListaKwadratow(i).Enabled = True Next 'aktualizuje ilość elementów do wyszukania Label2.Text = listaZlapanychObrazkow.Count.ToString + "/" + Math.Floor(ListaKwadratow.Count / 2).ToString 'odblokowuje kliknięcie kontrolerKlikniecia = True End Sub End Class