Dzisiaj pokażę wam jak zrobić prostą grę, będzie to gra w kółko i krzyżyk. Użyje do tego Sharpa.
Sharp jest programem bardzo podobnym do Visual studio. Wybieramy „Nowe rozwiązanie”
Teraz wystarczy wypełnić wolne pola:
Teraz pokaże się nam pulpit prawie taki jak w visual studio.
Jeśli nie mieliśmy nigdy do czynienia z Sharpem warto sobie pootwierać okienka i popatrzeć co gdzie jest. Aby podejrzeć efekt wizualny należy wybrać „Wzór” a zestaw elementów otwieramy w „Narzędzia”
Z zestawu narzędzi wybieramy Label i przeciągamy je na naszą formę, te elementy będą nas informowały czyja jest w tym momencie kolej:
Teraz znajdujemy w Narzędziach „Panel” i dodajemy do naszej formy, do panelu wrzucamy „tableLayoutPanel” wszystko razem powinno wyglądać jak na zdjęciu poniżej
dodajemy do niego wiersz i kolumnę aby powstały kwadraty 3X3
Wyśrodkujmy ją ładnie i rozciągnijmy. Teraz do każdej komórki należy przeciągnąć „label” i ponazywać je:
l11,l12,l13,l21,l22,l23,l31,l32,l33, tak jak na obrazku
Teraz zmieniamy im BorderStyle na FixedSingle aby nasz label miał otoczkę.
Ostatecznie powinno to wyglądać tak:
Zmieniamy wielkość liter aby nasze kółko bądź krzyżyk było lepiej widoczne:
Teraz krzyżyki i kółka będą dobrze widoczne na ekranie. Teraz musimy dodać przycisk rozpoczynający grę a label1 ustawiamy tekst „Zaczyna:” Tekst dla label2 zostawiamy bez zmian. Ostatecznie wygląda to tak:
Zaczynamy kodowanie. Najpierw najlepiej ustalić sobie plan. Plan naszej gry wygląda tak:
1. przyciskamy przycisk „start”.
2. algorytm losuje kto będzie zaczynał i wyświetli to w label2.
3. przyciskając pole, wybrany label zmienia tekst z „” na „X” albo „O”.
4. Odpowiednia konfiguracja kończy grę i wyświetla komunikat o wygraniu kółka, krzyżyka albo o passie.
5. Po wygranej pola są blokowane a grę możemy zacząć od nowa przyciskając „start”.
Na początek ustawiamy Enabled naszego Panel1 na false aby nikt nie mógł rozpocząć gry przed wciśnięciem start:
1 2 3 4 |
Public Sub New() Me.InitializeComponent() panel1.Enabled= false End Sub |
Program musi wiedzieć czyja jest w danym momencie kolej więc na początku musimy sobie zadeklarować publiczną zmienną typu boolean
1 2 |
Dim parzysty As New Boolean Dim suma As New integer ''przyda się później |
zmienna ta będzie się zmieniać co da nam możliwość stawiania raz kółka raz krzyżyka w zależności od tego czy będzie to true albo false.
Po zadeklarowaniu zmiennej „parzysty” będzie trzeba jeszcze wyzerować wszystkie pola i w przypadku gdy zechcemy pograć jeszcze raz odblokować panel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Sub Button1Click(sender As Object, e As EventArgs) ''Odblokowuje nasz panel w przypadku ponownej rozgrywki panel1.Enabled= True ''Losuje kto będzie zaczynał gre Dim zaczyna As New Random() Dim zacz As Integer = zaczyna.Next(0,2) If zacz = 0 Then parzysty = True label1.Text = "krzyżyk" Else parzysty = False label1.Text = "kółko" End If ''Zerujemy pola przed kolejną grą l11.Text="" l12.Text="" l13.Text="" l21.Text="" l22.Text="" l23.Text="" l31.Text="" l32.Text="" l33.Text="" ''zerujemy sumę (wyjaśnie to później) suma =0 End Sub |
Wracamy teraz do naszego wzoru, musimy zrobić odwołanie do każdego naszego labela w formie tak aby po jego naciśnięciu pojawiał nam się krzyżyk albo kółko. W tym celu wracamy do „Wzoru”:
1. Wybieramy lewym przyciskiem myszki label
2. wybieramy we właściwościach „Zdarzenie”
3. Odnajdujemy Akcja -> „Click” i przyciskamy na puste pole obok, co spowoduje przeniesienie nas do kodu i zrobienie nowego odnośnika do zdarzenia.
Czynność tą powtarzamy dla każdego naszego labela do uzyskania czegoś takiego:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Sub L11Click(sender As Object, e As EventArgs) End Sub Sub L12Click(sender As Object, e As EventArgs) End Sub Sub L13Click(sender As Object, e As EventArgs) End Sub Sub L21Click(sender As Object, e As EventArgs) End Sub Sub L22Click(sender As Object, e As EventArgs) End Sub Sub L23Click(sender As Object, e As EventArgs) End Sub Sub L31Click(sender As Object, e As EventArgs) End Sub Sub L32Click(sender As Object, e As EventArgs) End Sub Sub L33Click(sender As Object, e As EventArgs) End Sub |
Teraz stworzymy funkcje która przy kliknięciu na label będzie sprawdzała czy label jest już wybrany a jeśli nie jest to wprowadzi do niego odpowiedni tekst.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Private Function kolkoczykrzyzyk(ByVal lab As System.Object) If lab.text ="" then If parzysty = True Then lab.Text = "X" parzysty = False Else lab.Text = "O" parzysty = True End If Else MsgBox("pole jest zajęte") End If End Function |
zmienną w naszej funkcji jest „lab” aby sprawić aby funkcja działała należy nasze odwołania do zdarzenia „Click” wypełnić odpowiednim odwołaniem do funkcji:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Sub L11Click(sender As Object, e As EventArgs) kolkoczykrzyzyk(l11) End Sub Sub L12Click(sender As Object, e As EventArgs) kolkoczykrzyzyk(l12) End Sub Sub L13Click(sender As Object, e As EventArgs) kolkoczykrzyzyk(l13) End Sub Sub L21Click(sender As Object, e As EventArgs) kolkoczykrzyzyk(l21) End Sub Sub L22Click(sender As Object, e As EventArgs) kolkoczykrzyzyk(l22) End Sub Sub L23Click(sender As Object, e As EventArgs) kolkoczykrzyzyk(l23) End Sub Sub L31Click(sender As Object, e As EventArgs) kolkoczykrzyzyk(l31) End Sub Sub L32Click(sender As Object, e As EventArgs) kolkoczykrzyzyk(l32) End Sub Sub L33Click(sender As Object, e As EventArgs) kolkoczykrzyzyk(l33) End Sub |
Dobra czyli można już rozpocząć, zacząć od nowa grę i wstawiać kółka i krzyżyki. Teraz wystarczy stworzyć funkcje która po każdym kliknięciu będzie sprawdzała czy ktoś może nie wygrał czy może nie ma już gdzie stawiać znaczników. Najtrudniejszy był do zrobienia pass czyli sytuacja gdy nikt nie wygrywa. W tym programie wymyśliłem to tak. Zadeklarowałem sobie zmienną publiczną integer i nazwałem ją suma. Po każdym kliknięciu kółka czy też krzyżyka do sumy dodawało się 1 i w momencie gdy nikt nie wygrał a suma równała się 9 gra kończyła się remisem. Podstawa takiej funkcji wygląda tak:
1 2 3 4 5 6 7 |
Private Function wygrana(ByVal znaczek As String) If znaczek="X" Then suma +=1 Else If znaczek ="O" suma +=1 End If End Function |
A nasza funkcja kolkoczykrzyzyk zmieni się o dodanie do niej funkcji wygrana:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Private Function kolkoczykrzyzyk(ByVal lab As System.Object) If lab.text ="" then If parzysty = True Then lab.Text = "X" parzysty = False wygrana("X") ''dodane Else lab.Text = "O" parzysty = True wygrana("O") ''dodana End If Else MsgBox("pole jest zajęte") end if End Function |
Czyli teraz mamy tak, po kliknięciu na label uruchamiana jest funkcja „kolkoczykrzyzyk” która najpierw sprawdza czy komórka jest pusta, jeśli tak to za pomocą zmiennej parzysta określa jaki znacznik powinien być w komórce następnie zmienia parametr „parzysta” i na końcu uruchamia funkcje która w zależności od znacznika dodaje jeden do sumy i sprawdza wygrana i stopuje grę gdy suma osiągnie 9. Jest 8 sytuacji w których wygrywa „X” i w których wygrywa „O” trzeba je wszystkie rozpisać w więc dla krzyżyka będzie to wyglądało tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
If l11.text+l12.Text+l13.Text="XXX" Then suma -=1 System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False Else If l21.text+l22.Text+l23.Text="XXX" Then suma -=1 System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False else If l31.text+l32.Text+l33.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 else If l11.text+l22.Text+l33.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 else If l13.text+l22.Text+l31.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 else If l11.text+l21.Text+l31.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 else If l12.text+l22.Text+l32.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 else If l13.text+l23.Text+l33.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 Else If suma=9 Then System.Windows.Forms.MessageBox.Show("pass") panel1.Enabled= False End If |
Na pewno wielu z was zastanowi się po co ten element „suma -=1” zastosowałem go tutaj ponieważ kod jest realizowany od góry w dół, sytuacja wygrany może zdarzyć się tylko raz ale może zdarzyć się sytuacja w której ktoś wygrywa i zapełnione są wszystkie pola a więc funkcja pokaże komunikat o wygranej i o pasie, nie zdarzy się tak gdy suma nie osiągnie 9 i element ten będzie sprawdzany na samym końcu. Ostatecznie wygląda to tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
Private Function wygrana(ByVal znaczek As String) If znaczek="X" Then suma +=1 If l11.text+l12.Text+l13.Text="XXX" Then suma -=1 System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False Else If l21.text+l22.Text+l23.Text="XXX" Then suma -=1 System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False else If l31.text+l32.Text+l33.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 else If l11.text+l22.Text+l33.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 else If l13.text+l22.Text+l31.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 else If l11.text+l21.Text+l31.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 else If l12.text+l22.Text+l32.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 else If l13.text+l23.Text+l33.Text="XXX" Then System.Windows.Forms.MessageBox.Show("wygrał krzyżyk") panel1.Enabled= False suma -=1 Else If suma=9 Then System.Windows.Forms.MessageBox.Show("pass") panel1.Enabled= False End If Else If znaczek ="O" suma +=1 If l11.text+l12.Text+l13.Text="OOO" Then System.Windows.Forms.MessageBox.Show("wygrał KÓŁKO") panel1.Enabled= False suma -=1 else If l21.text+l22.Text+l23.Text="OOO" Then System.Windows.Forms.MessageBox.Show("wygrał KÓŁKO") panel1.Enabled= False suma -=1 else If l31.text+l32.Text+l33.Text="OOO" Then System.Windows.Forms.MessageBox.Show("wygrał KÓŁKO") panel1.Enabled= False suma -=1 else If l11.text+l22.Text+l33.Text="OOO" Then System.Windows.Forms.MessageBox.Show("wygrał KÓŁKO") panel1.Enabled= False suma -=1 else If l13.text+l22.Text+l31.Text="OOO" Then System.Windows.Forms.MessageBox.Show("wygrał KÓŁKO") panel1.Enabled= False suma -=1 else If l11.text+l21.Text+l31.Text="OOO" Then System.Windows.Forms.MessageBox.Show("wygrał KÓŁKO") panel1.Enabled= False suma -=1 else If l12.text+l22.Text+l32.Text="OOO" Then System.Windows.Forms.MessageBox.Show("wygrał KÓŁKO") panel1.Enabled= False suma -=1 else If l13.text+l23.Text+l33.Text="OOO" Then System.Windows.Forms.MessageBox.Show("wygrał KÓŁKO") panel1.Enabled= False suma -=1 Else If suma=9 Then System.Windows.Forms.MessageBox.Show("pass") panel1.Enabled= False End If End If End Function |
Jak działa program można zobaczyć tutaj:
pobrać program można stąd: kolko_i_krzyzyk
pełen kod gry jest tutaj: kod_gry
Dziękuje wszystkim za uwagę, pozdrawiam. Mam nadzieje, że komuś się przyda.