Prosta gra: kółko i krzyżyk (SharpDevelop)

Dzisiaj pokażę wam jak zrobić prostą grę, będzie to gra w kółko i krzyżyk. Użyje do tego Sharpa.

kik16Sharp jest programem bardzo podobnym do Visual studio. Wybieramy  „Nowe rozwiązanie”

kik1Teraz wystarczy wypełnić wolne pola:

kik2Teraz pokaże się nam pulpit prawie taki jak w visual studio.

kik3Jeś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”

kik4Z 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:

kik5

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

kik6

dodajemy do niego wiersz i kolumnę aby powstały kwadraty 3X3

kik7

kik8

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

kik10

Teraz zmieniamy im BorderStyle na FixedSingle aby nasz label miał otoczkę.

kik9

Ostatecznie powinno to wyglądać tak:

kik11

Zmieniamy wielkość liter aby nasze kółko bądź krzyżyk było lepiej widoczne:

kik14

kik15

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:

kik16

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:

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

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:

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”:

kik18

 

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:

        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.

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:

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:

	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:

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:

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:

	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:

http://youtu.be/olObSvVBQl8

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.

 

Permalink do tego artykułu: https://visualmonsters.cba.pl/prosta-gra-kolko-i-krzyzyk-sharpdevelop/

Dodaj komentarz

Twój adres email nie będzie publikowany.