Programowanie gry w kółko i krzyżyk w Visual Basic

click fraud protection

Programowanie gry komputerowe może być najbardziej wymagającym technicznie (i być może najlepiej płatnym) zadaniem, które programista może mieć. Gry na najwyższym poziomie wymagają od programistów i komputerów tego, co najlepsze.

Visual Basic 6 został teraz całkowicie pominięty jako platforma do programowania gier. (Nigdy tak naprawdę nie był. Nawet w „dobrych starych czasach” poważni programiści nigdy nie używaliby języka wysokiego poziomu, takiego jak VB 6, ponieważ po prostu nie można było uzyskać cięcia najwyższa wydajność, której wymaga większość gier.) Ale prosta gra „Tic Tac Toe” to świetne wprowadzenie do programowania, które jest nieco bardziej zaawansowane niż "Witaj świecie!"

To świetne wprowadzenie do wielu podstawowych pojęć programowania, ponieważ łączy techniki, w tym:

  • Sposób użycia tablice. Znaczniki X i O są przechowywane w osobnych tablicach, a całe tablice są przekazywane między funkcjami, aby śledzić postępy w grze.
  • Korzystanie z grafiki na poziomie VB 6: VB 6 nie oferuje wielkich możliwości graficznych, ale gra jest dobrym wprowadzeniem do tego, co jest dostępne. Znaczna część reszty tej serii to badanie, w jaki sposób GDI +, następna generacja grafiki Microsoft, zastępuje grafikę VB 6.
    instagram viewer
  • Korzystanie z obliczeń matematycznych do sterowania programem: Program wykorzystuje sprytne modulo (Mod) i liczbę całkowitą obliczenia podziału za pomocą tablic znaczników z dwóch gier w celu ustalenia, kiedy ma miejsce trzyelementowe „zwycięstwo” wystąpił.

Klasa programowania w tym artykule jest prawdopodobnie nieco za poziom początkowy, ale powinna być dobra dla programistów „średnio zaawansowanych”. Ale zacznijmy od poziomu podstawowego, aby zilustrować niektóre koncepcje i zacząć od samego początku Visual Basic kariera programistyczna. Nawet studenci bardziej zaawansowani niż to mogą uznać, że ustawienie obiektów w odpowiedniej formie jest nieco trudne.

Jak grać w Tic Tac Toe

Jeśli nigdy nie grałeś Kółko i krzyżyk, oto zasady. Dwóch graczy naprzemiennie umieszcza X i OS na polu gry 3 x 3.

Przed rozpoczęciem gry obaj gracze muszą ustalić, kto pójdzie pierwszy i kto oznaczy swoje ruchy, którym symbolem. Po pierwszym ruchu gracze naprzemiennie umieszczają swoje znaki w dowolnej pustej komórce. Celem gry jest bycie pierwszym graczem z trzema znakami w linii poziomej, ukośnej lub pionowej. Jeśli nie ma pustych komórek i żaden z graczy nie ma zwycięskiej kombinacji, gra jest remisem.

Przed rozpoczęciem dowolnego kodowania zawsze warto zmienić nazwy dowolnych używanych komponentów. Kiedy zaczniesz kodowanie, nazwa będzie używana automatycznie przez Visual Basic, więc chcesz, aby była poprawna. Użyjemy nazwy formularza frmTicTacToe zmienimy także podpis na „O kółku i krzyżyku”.

Po ustaleniu formularza użyj kontrolki Przybornik linii, aby narysować siatkę 3 x 3. Kliknij narzędzie linii, a następnie narysuj linię w żądanym miejscu. Musisz w ten sposób utworzyć cztery linie i dostosować ich długość i położenie, aby wyglądały dobrze. Visual Basic ma również kilka wygodnych narzędzi w menu Format, które pomogą. To świetna okazja, aby poćwiczyć z nimi.

Oprócz planszy do gry będziemy potrzebować obiektów dla symboli X i O, które zostaną umieszczone na planszy. Ponieważ w siatce znajduje się dziewięć spacji, utworzymy tablicę obiektów z dziewięcioma spacjami, zwanymi elementami w języku Visual Basic.

Istnieje kilka sposobów na zrobienie wszystkiego w środowisku programistycznym Visual Basic, a tworzenie tablic kontrolnych nie jest wyjątkiem. Prawdopodobnie najłatwiejszym sposobem jest utworzenie pierwszej etykiety (kliknij i narysuj tak jak narzędzie linii), nazwij ją, ustaw wszystkie atrybuty (takie jak Czcionka i ForeColor), a następnie zrób jej kopię. VB 6 zapyta, czy chcesz utworzyć tablicę kontrolną. Użyj nazwy lblPlayGround jako pierwszej etykiety.

Aby utworzyć pozostałe osiem elementów siatki, wybierz pierwszy obiekt etykiety, ustaw właściwość Indeks na zero i naciśnij CTRL + C (kopiuj). Teraz możesz nacisnąć CTRL + V (wklej), aby utworzyć kolejny obiekt etykiety. Kiedy kopiujesz takie obiekty, każda kopia odziedziczy wszystkie właściwości oprócz Indeksu od pierwszej. Indeks wzrośnie o jeden dla każdej kopii. Jest to tablica kontrolna, ponieważ wszystkie mają tę samą nazwę, ale różne wartości indeksu.

Jeśli utworzysz tablicę w ten sposób, wszystkie kopie zostaną ułożone jedna na drugiej w lewym górnym rogu formularza. Przeciągnij każdą etykietę do jednej z odtwarzanych pozycji siatki. Upewnij się, że wartości indeksu są sekwencyjne w siatce. Od tego zależy logika programu. Obiekt etykiety o wartości indeksu 0 powinien znajdować się w lewym górnym rogu, a prawa dolna etykieta powinna mieć indeks 8. Jeśli etykiety obejmują siatkę odtwarzania, wybierz każdą etykietę, kliknij prawym przyciskiem myszy i wybierz opcję Wyślij na spód.

Ponieważ istnieje osiem możliwych sposobów wygrania gry, potrzebujemy ośmiu różnych linii, aby pokazać wygraną na planszy gry. Użyjesz tej samej techniki do stworzenia kolejnej tablicy kontrolnej. Najpierw narysuj linię, nazwij ją linWin i ustaw właściwość Index na zero. Następnie użyj techniki kopiuj-wklej, aby utworzyć siedem kolejnych linii. Poniższa ilustracja pokazuje, jak poprawnie ustawić numery indeksów.

Oprócz obiektów z etykietami i liniami potrzebujesz kilku przycisków poleceń, aby zagrać w grę, oraz więcej etykiet, aby zachować wynik. Kroki, aby je utworzyć, nie są tutaj szczegółowo opisane, ale są to obiekty, których potrzebujesz.

Dwa przyciski przedmioty:

  • cmdNewGame
  • cmdResetScore

Obiekt ramki fraPlayFirst zawierający dwa przyciski opcji:

  • optXPlayer
  • optOPlayer

Obiekt ramki fraScoreBoard zawierający sześć etykiet. Tylko lblXScore i lblOScore są zmieniane w kodzie programu.

  • lblX
  • lblXScore
  • lblO
  • lblOScore
  • lblMinus
  • lblColon

Na koniec potrzebny jest także obiekt etykiety lblStartMsg, aby „zamaskować” przycisk cmdNewGame, gdy nie należy go klikać. Nie jest to widoczne na poniższej ilustracji, ponieważ zajmuje to samo miejsce w formularzu co przycisk polecenia. Być może trzeba będzie tymczasowo przesunąć przycisk polecenia, aby narysować tę etykietę na formularzu.

Do tej pory nie przeprowadzono kodowania VB, ale w końcu jesteśmy na to gotowi.

Inicjalizacja

Teraz możesz wreszcie zacząć kodować program. Jeśli jeszcze tego nie zrobiłeś, możesz pobrać kod źródłowy, aby postępować zgodnie z opisem działania programu.

Jedną z pierwszych decyzji projektowych, które należy podjąć, jest śledzenie obecnego „stanu” gry. Innymi słowy, jakie są obecne X i OS na planszy do gry i kto porusza się dalej. Pojęcie „stanu” ma kluczowe znaczenie w wielu programach, w szczególności jest ważne w programowaniu ASP i ASP.NET dla sieci

Można to zrobić na kilka sposobów, więc jest to kluczowy krok w analizie. Jeśli rozwiązujesz ten problem sam, możesz narysować schemat blokowy i wypróbować różne opcje z „scratch paper” przed rozpoczęciem jakiegokolwiek kodowania.

Nasze rozwiązanie wykorzystuje dwa „dwuwymiarowe tablice”, ponieważ pomaga to śledzić „stan”, po prostu zmieniając indeksy tablic w pętlach programu. Stan lewego górnego rogu będzie w elemencie tablicy o indeksie (1, 1), prawy górny róg będzie w (1, 3), prawy dolny w (3,3) i tak dalej. Dwie tablice, które to robią, to:

iXPos (x, y)

i

iOPos (x, y)

Można to zrobić na wiele różnych sposobów, a końcowe rozwiązanie VB.NET z tej serii pokazuje, jak to zrobić za pomocą tylko jednej jednowymiarowej tablicy.

Program do tłumaczenia tych tablic na decyzje wygranych graczy i widoczne wyświetlacze w formularzu znajdują się na następnej stronie.

Potrzebujesz także kilku zmiennych globalnych w następujący sposób. Zauważ, że są one zawarte w kodzie Ogólne i Deklaracje formularza. To czyni ich „poziom modułu” zmienne, do których można odwoływać się w dowolnym miejscu kodu dla tego formularza. Aby uzyskać więcej informacji na ten temat, zobacz Zrozumienie zakresu zmiennych w pomocy Visual Basic.

Istnieją dwa obszary, w których zmienne są inicjowane w naszym programie. Najpierw inicjowanych jest kilka zmiennych podczas ładowania formularza frmTicTacToe.

Private Sub Form_Load ()

Po drugie, przed każdą nową grą wszystkie zmienne, które należy zresetować do wartości początkowych, są przypisywane w podprogramie inicjalizacji.

Sub InitPlayGround ()

Zauważ, że inicjalizacja ładowania formularza wywołuje również inicjalizację placu zabaw.

Jedną z kluczowych umiejętności programisty jest umiejętność korzystania z narzędzi do debugowania w celu zrozumienia działania kodu. Możesz użyć tego programu, aby wypróbować:

  • Przechodzenie przez kod za pomocą klawisza F8
  • Ustawianie zegarka na kluczowych zmiennych, takich jak sPlaySign lub iMove
    Ustalanie punktu przerwania i sprawdzanie wartości zmiennych. Na przykład w wewnętrznej pętli inicjalizacji:
lblPlayGround ((i - 1) * 3 + j - 1) .Caption = ""

Pamiętaj, że ten program wyraźnie pokazuje, dlaczego dobrą praktyką programistyczną jest przechowywanie danych w tablicach, gdy tylko jest to możliwe. Jeśli nie masz tablic w tym programie, musisz napisać kod podobny do tego:

Line0.Visible = False
Wiersz 1. Widoczny = Fałsz
Line2.Visible = False
Line3.Visible = False
Line4.Visible = False
Line5.Visible = False
Line6.Visible = False
Line7.Visible = False

zamiast tego:

Dla i = 0 do 7
linWin (i) .Visible = False
Dalej ja

Robienie ruchu

Jeśli jakakolwiek część systemu może być uważana za „serce”, jest to podprogram lblPlayGround_Click. Ten podprogram jest wywoływany za każdym razem, gdy gracz kliknie siatkę gry. (Kliknięcia muszą znajdować się w jednym z dziewięciu elementów lblPlayGround.) Zauważ, że ten podprogram ma argument: (Index As Integer). Większość innych „podprogramów zdarzeń”, takich jak cmdNewGame_Click (), nie ma takiej możliwości. Indeks wskazuje, który obiekt etykiety został kliknięty. Na przykład indeks zawiera wartość zero dla lewego górnego rogu siatki i wartość osiem dla prawego dolnego rogu.

Po tym, jak gracz kliknie kwadrat na siatce gry, przycisk polecenia, aby rozpocząć inną grę, cmdNewGame, zostaje „włączony”, dzięki czemu staje się widoczny. Stan tego przycisku polecenia pełni podwójną funkcję, ponieważ jest on również używany jako logiczna zmienna decyzyjna w dalszej części programu. Używanie wartości właściwości jako zmiennej decyzyjnej jest zwykle odradzane, ponieważ jeśli kiedykolwiek zajdzie konieczność zmiany programu (powiedzmy na przykład, aby wykonać przycisk polecenia cmdNewGame widoczny cały czas), program niespodziewanie przestanie działać, ponieważ możesz nie pamiętać, że jest on również używany jako część programu logika. Z tego powodu zawsze dobrze jest przeszukiwać kod programu i sprawdzać użycie wszystkiego, co zmienisz podczas konserwacji programu, nawet wartości właściwości. Ten program narusza zasadę częściowo po to, aby to podkreślić, a częściowo dlatego, że jest to stosunkowo prosty fragment kodu, w którym łatwiej jest zobaczyć, co się dzieje, i uniknąć problemów później.

Wybór gracza na pole gry jest przetwarzany przez wywołanie podprogramu GamePlay z indeksem jako argumentem.

Przetwarzanie ruchu

Najpierw sprawdź, czy kliknięto niezajęty kwadrat.

Jeśli lblPlayGround (xo_Move) .Caption = "" To

Gdy upewnimy się, że jest to legalny ruch, licznik ruchów (iMove) jest zwiększany. Następne dwie linie są bardzo interesujące, ponieważ tłumaczą współrzędne z jednowymiarowego Jeśli tablica komponentów lblPlayGround do indeksów dwuwymiarowych, których można użyć w iXPos lub iOPos. Podział modów i liczb całkowitych („odwrotny ukośnik”) to operacje matematyczne, których nie używasz na co dzień, ale oto świetny przykład pokazujący, jak mogą być bardzo przydatne.

Jeśli lblPlayGround (xo_Move) .Caption = "" To
iMove = iMove + 1
x = Int (xo_Move / 3) + 1
y = (xo_Move Mod 3) + 1

Wartość xo_Move 0 zostanie przetłumaczona na (1, 1), 1 na (1, 2)... 3 do (2, 1)... 8 do (3, 3).

Wartość w sPlaySign, zmiennej o zasięgu modułu, śledzi, który gracz wykonał ruch. Po zaktualizowaniu tablic ruchów elementy etykiety w siatce odtwarzania można zaktualizować za pomocą odpowiedniego znaku.

Jeśli sPlaySign = "O" To
iOPos (x, y) = 1
iWin = CheckWin (iOPos ())
Jeszcze
iXPos (x, y) = 1
iWin = CheckWin (iXPos ())
End If
lblPlayGround (xo_Move) .Caption = sPlaySign

Na przykład, gdy odtwarzacz X kliknie lewy górny róg siatki, zmienne będą miały następujące wartości:

Ekran użytkownika pokazuje tylko X w lewym górnym polu, podczas gdy iXPos ma 1 w lewym górnym polu i 0 we wszystkich pozostałych. IOPos ma 0 w każdym polu.

Wartości zmieniają się, gdy gracz O kliknie środkowy kwadrat siatki. Teraz iOPos pokazuje 1 w środkowym polu, podczas gdy ekran użytkownika pokazuje X w lewym górnym rogu i O w środkowym polu. IXPos pokazuje tylko 1 w lewym górnym rogu, z 0 we wszystkich pozostałych polach.

Teraz, gdy wiesz, gdzie kliknął gracz i który gracz kliknął (używając wartości w sPlaySign), wszystko, co musisz zrobić, to dowiedzieć się, czy ktoś wygrał grę i dowiedzieć się, jak to pokazać w pokaz.

Znalezienie zwycięzcy

Po każdym ruchu funkcja CheckWin sprawdza zwycięską kombinację. CheckWin działa poprzez dodanie każdego wiersza, każdej kolumny i każdej przekątnej. Śledzenie kroków przez CheckWin za pomocą funkcji debugowania Visual Basic może być bardzo pouczające. Znalezienie wygranej jest sprawą najpierw, sprawdzenie, czy w każdym z poszczególnych czeków w zmiennej iScore znaleziono trzy 1, a następnie zwracanie unikalnej wartości „podpisu” w Checkwin, która jest używana jako indeks tablicy do zmiany właściwości Visible jednego elementu w linWin tablica komponentów. Jeśli nie ma zwycięzcy, CheckWin będzie zawierać wartość -1. Jeśli pojawi się zwycięzca, wyświetlacz zostanie zaktualizowany, tabela wyników zostanie zmieniona, wyświetlony zostanie komunikat gratulacyjny i gra zostanie wznowiona.

Przyjrzyjmy się szczegółowo jednej z kontroli, aby zobaczyć, jak to działa. Pozostałe są podobne.

„Sprawdź rzędy pod kątem 3
Dla i = 1 do 3
iScore = 0
CheckWin = CheckWin + 1
Dla j = 1 do 3
iScore = iScore + iPos (i, j)
Następny j
Jeśli iScore = 3 to
Wyjdź z funkcji
End If
Dalej ja

Pierwszą rzeczą, którą należy zauważyć, jest to, że pierwszy licznik indeksu i odlicza wiersze, podczas gdy drugi j liczy się w kolumnach. Zewnętrzna pętla, po prostu przesuwa się z jednego rzędu do drugiego. Wewnętrzna pętla zlicza jedynki w bieżącym rzędzie. Jeśli są trzy, masz zwycięzcę.

Zauważ, że śledzisz również całkowitą liczbę kwadratów testowanych w zmiennej CheckWin, która jest wartością przekazywaną z powrotem po zakończeniu tej funkcji. Każda zwycięska kombinacja zakończy się unikalną wartością w CheckWin od 0 do 7, która służy do wyboru jednego z elementów w tablicy komponentów linWin (). To sprawia, że ​​kolejność kodu w funkcji CheckWin jest również ważna! Jeśli przeniosłeś jeden z bloków kod pętli (jak ten powyżej), niewłaściwa linia zostanie narysowana na planszy gry, gdy ktoś wygra. Wypróbuj i przekonaj się!

Szczegóły wykończenia

Jedynym jeszcze nie omówionym kodem jest podprogram dla nowej gry i podprogram, który zresetuje wynik. Reszta logiki w systemie sprawia, że ​​tworzenie ich jest dość łatwe. Aby rozpocząć nową grę, wystarczy wywołać procedurę InitPlayGround. Dla wygody graczy, ponieważ przycisk można kliknąć w środku gry, przed kontynuacją należy poprosić o potwierdzenie. Pytasz również o potwierdzenie przed ponownym uruchomieniem tablicy wyników.

instagram story viewer