Kółko i krzyżyk z komputerem

0

Witam
Napisałem kółko i krzyżyk, rozgrywka z komputerem, który może i myśli :)
Gra działa, wygrać jest trudno, nawet nie powinno to być możliwe.
Napisana w visual basicu, standardowa forma i dziesięć przycisków, dziewięć jako pola i jeden przycisk start.
Od razu zaznaczam, że jestem samoukiem, cudow tam nie ma ale liczę na konstruktywną krytykę, bo to zawsze się przyda
Kod pod adresem http://pastebin.com/W6DpWAsT

3

Mógłbyś zrobić dla mnie minimalną modyfikację? :)

  1. Niech plansza będzie NxM z rozmiarem zadanym przez użytkownika przy uruchomieniu. Powiedzmy w zakresie do 10000
  2. Niech liczba graczy będzie P zadana przy uruchomieniu. Powiedzmy w zakresie do 128 żeby nie było problemów z symbolami
  3. Niech wygrywa K identycznych symboli w linii/skosie etc, oczywiście K zadane przy uruchomieniu i mniejsze od N i M.
1

Czy mi się wydaje, czy komputer wybiera pole losowo (przy okazji Randomize() nie powinieneś wywoływać za każdym razem gdy losujesz tylko raz na początku gry). Do tego świetnie nadaje się algorytm oparty na drzewie decyzyjnym.

Piszesz w Visual Basic.NET? Fajnie, ale proponuję pobawić się C# ;)

1

To ze działa i komputer zaciekle walczy to jedno... Ale sposób rozwiązania to drugie...

  1. Podziel wszystko na osobne klasy. Plansza jest klasą, gracz jest abstrakcją, komputer jest klasą, gracz jako człowiek jest klasą itd itd.
  2. Te IFy bardzo łatwo możesz zredukować stosując wzorzec projektowy Stan.
  3. Metody powinny wykonywać TYLKO 1 zadanie. Jeśli metoda wykonuje 2 zadania (np sprawdza czy pole jest zajęte a potem jeśli nie to stawia tam jakiś znak) to rozdziel to na 2 metody... Będzie dużo czytelniej... Widząc takie drzewko:
 ElseIf MoveCount = 1 And Fields(4).Text = CROSS Then
            Randomize()
            Do
                tmpField = Int(Rnd() * 9)
                If Fields(tmpField).Text = EMPTY Then
                    Select Case tmpField
                        Case 0, 2, 6, 8
                            ComputerHit(tmpField)
                            OK = True
                    End Select
                End If
            Loop Until OK

Odechciewa się dalej czytać bo nie wiadomo co jest od czego.
4. Nie powinieneś używać cyfr na stałe zadeklarowanych jak tutaj:

tmpField = Int(Rnd() * 9)

wartość 9 wynika jak mniemam z siatki 3x3. Zamiast tego zrób lepiej jakąś stałą którą na początku gry będziesz pobierał od gracza. Możesz nawet na początku sam w programie zadeklarować że jest to 9. W momencie np rozbudowy programu (to co zaproponował @Shalom) podstawiasz sobie pod tą stałą np 16 i grasz na siatce 4x4. A tak będziesz musiał wszystko ręcznie poprawiać.
5. Nie wiem na ile w VisualBasicu można stosować canvas (czy coś tam w ogóle takiego jest) ale podejście z buttonami jest ogólnie słabe. Jeśli będziesz chciał np zmienić tło, poprawić kształt przycisków, lub zrobić inne fikuśne rzeczy to nic nie zrobisz. Wydaje mi się że lepsze byłoby jakieś płótno do rysowania i wyłapywać tylko MouseEvent ze współrzędną kliknięcia.

Ale żeby nie było że wszystko źle to duży plus za ENUMa ;) Widziałem już takie rzeczy na intach zrobione :o
Co do składni to się nie wypowiem bo nie piszę w VB.

0

@MaciMac WTF? Co w mojej wypowiedzi jest złośliwe? Poprosiłeś o ocenę kodu. Jednak nauczony doświadczeniem uważam że lepiej kiedy sam odkryjesz problemy ze swoim kodem. Nie trudno byłoby mi napisać że źle jest XYZ. Tylko że wtedy możesz się z tym zgodzić lub też nie. Jeśli jednak sam dojdziesz do tego że jednak twój kod nie jest dobry, wtedy dopiero się czegoś nauczysz.
Modyfikacje które zaproponowałem nie wymagają ani większej wiedzy o dziedzinie problemu, ani żadnych konstrukcji językowych których byś nie znał. Wymagają jedynie sensownego użycia warunków, pętli, tablic i zmiennych -> a to już pokazałeś że znasz.

0

@MaciMac @Shalom dobrze pisze. Moim pierwszym programem nieszkolnym z gui w okienkach ect też było kółko i krzyżyk (pod AmigaOS) , nawet przewidywał chyba jeden albo 2 ruchy do przodu, no ale kod sobie zostawiłem, żeby sobie patrzeć, jak dużo człowiek się od tamtego czasu nauczył :) Aczkolwiek, jak sobie napisałem, tez cieszyłem się jak dziecko :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1