Kółko i krzyżyk - WindowsPhone

0

Witam, mam problem logiczny z poniższym kodem. Programuję na Windows Phone prostą aplikację kółko i krzyżyk. Do pewnego momentu działa poprawnie, a później komputer przestaje wykonywać ruchy. Byłbym wdzięczny za wskazanie błędu.

private void CompMove()
        {
            if (button_11.IsEnabled == true)
            middle();
            else if (tablica[0,0] == 0)
            {
                corner();
            }
            else 
            attack_block();
        }






        // blok/atak
        private void attack_block()
        {

            // BLOK !!
                //pierwszy wiersz
                if (tablica[0, 0] == -1 && tablica[0, 1] == -1) { tablica[0, 2] = 1; button_02.Content = "O"; button_02.IsEnabled = false; x++; }
                else if (tablica[0, 1] == -1 && tablica[0, 2] == -1) { tablica[0, 0] = 1; button_00.Content = "O"; button_00.IsEnabled = false; x++; }
                else if (tablica[0, 2] == -1 && tablica[0, 0] == -1) { tablica[0, 1] = 1; button_01.Content = "O"; button_01.IsEnabled = false; x++; }

                //drugi wiersz
                else if (tablica[1, 0] == -1 && tablica[1, 1] == -1) { tablica[1, 2] = 1; button_12.Content = "O"; button_12.IsEnabled = false; x++; }
                else if (tablica[1, 1] == -1 && tablica[1, 2] == -1) { tablica[1, 0] = 1; button_10.Content = "O"; button_10.IsEnabled = false; x++; }
                else if (tablica[1, 2] == -1 && tablica[1, 0] == -1) { tablica[1, 1] = 1; button_11.Content = "O"; button_11.IsEnabled = false; x++; }

                //trzeci wiersz
                else if (tablica[2, 0] == -1 && tablica[2, 1] == -1) { tablica[2, 2] = 1; button_22.Content = "O"; button_22.IsEnabled = false; x++; }
                else if (tablica[2, 1] == -1 && tablica[2, 2] == -1) { tablica[2, 0] = 1; button_20.Content = "O"; button_20.IsEnabled = false; x++; }
                else if (tablica[2, 2] == -1 && tablica[2, 0] == -1) { tablica[2, 1] = 1; button_21.Content = "O"; button_21.IsEnabled = false; x++; }

                //pierwsza kolumna 
                else if (tablica[0, 0] == -1 && tablica[1, 0] == -1) { tablica[2, 0] = 1; button_20.Content = "O"; button_20.IsEnabled = false; x++; }
                else if (tablica[1, 0] == -1 && tablica[2, 0] == -1) { tablica[0, 0] = 1; button_00.Content = "O"; button_00.IsEnabled = false; x++; }
                else if (tablica[2, 0] == -1 && tablica[0, 0] == -1) { tablica[1, 0] = 1; button_10.Content = "O"; button_10.IsEnabled = false; x++; }

                //druga kolumna 
                else if (tablica[0, 1] == -1 && tablica[1, 1] == -1) { tablica[2, 1] = 1; button_21.Content = "O"; button_21.IsEnabled = false; x++; }
                else if (tablica[1, 1] == -1 && tablica[2, 1] == -1) { tablica[0, 1] = 1; button_01.Content = "O"; button_01.IsEnabled = false; x++; }
                else if (tablica[2, 1] == -1 && tablica[0, 1] == -1) { tablica[1, 1] = 1; button_11.Content = "O"; button_11.IsEnabled = false; x++; }

                //trzecia kolumna 
                else if (tablica[0, 2] == -1 && tablica[1, 2] == -1) { tablica[2, 2] = 1; button_22.Content = "O"; button_22.IsEnabled = false; x++; }
                else if (tablica[1, 2] == -1 && tablica[2, 2] == -1) { tablica[0, 2] = 1; button_02.Content = "O"; button_02.IsEnabled = false; x++; }
                else if (tablica[2, 2] == -1 && tablica[0, 2] == -1) { tablica[1, 2] = 1; button_12.Content = "O"; button_12.IsEnabled = false; x++; }
                // ATAK!!
                //pierwszy wiersz
                else if (tablica[0, 0] == 1 && tablica[0, 1] == 1) { tablica[0, 2] = 1; button_02.Content = "O"; button_02.IsEnabled = false; x++; }
                else if (tablica[0, 1] == 1 && tablica[0, 2] == 1) { tablica[0, 0] = 1; button_00.Content = "O"; button_00.IsEnabled = false; x++; }
                else if (tablica[0, 2] == 1 && tablica[0, 0] == 1) { tablica[0, 1] = 1; button_01.Content = "O"; button_01.IsEnabled = false; x++; }

                //drugi wiersz
                else if (tablica[1, 0] == 1 && tablica[1, 1] == 1) { tablica[1, 2] = 1; button_12.Content = "O"; button_12.IsEnabled = false; x++; }
                else if (tablica[1, 1] == 1 && tablica[1, 2] == 1) { tablica[1, 0] = 1; button_10.Content = "O"; button_10.IsEnabled = false; x++; }
                else if (tablica[1, 2] == 1 && tablica[1, 0] == 1) { tablica[1, 1] = 1; button_11.Content = "O"; button_11.IsEnabled = false; x++; }

                //trzeci wiersz
                else if (tablica[2, 0] == 1 && tablica[2, 1] == 1) { tablica[2, 2] = 1; button_22.Content = "O"; button_22.IsEnabled = false; x++; }
                else if (tablica[2, 1] == 1 && tablica[2, 2] == 1) { tablica[2, 0] = 1; button_20.Content = "O"; button_20.IsEnabled = false; x++; }
                else if (tablica[2, 2] == 1 && tablica[2, 0] == 1) { tablica[2, 1] = 1; button_21.Content = "O"; button_21.IsEnabled = false; x++; }

                //pierwsza kolumna 
                else if (tablica[0, 0] == 1 && tablica[1, 0] == 1) { tablica[2, 0] = 1; button_20.Content = "O"; button_20.IsEnabled = false; x++; }
                else if (tablica[1, 0] == 1 && tablica[2, 0] == 1) { tablica[0, 0] = 1; button_00.Content = "O"; button_00.IsEnabled = false; x++; }
                else if (tablica[2, 0] == 1 && tablica[0, 0] == 1) { tablica[1, 0] = 1; button_10.Content = "O"; button_10.IsEnabled = false; x++; }

                //druga kolumna 
                else if (tablica[0, 1] == 1 && tablica[1, 1] == 1) { tablica[2, 1] = 1; button_21.Content = "O"; button_21.IsEnabled = false; x++; }
                else if (tablica[1, 1] == 1 && tablica[2, 1] == 1) { tablica[0, 1] = 1; button_01.Content = "O"; button_01.IsEnabled = false; x++; }
                else if (tablica[2, 1] == 1 && tablica[0, 1] == 1) { tablica[1, 1] = 1; button_11.Content = "O"; button_11.IsEnabled = false; x++; }

                //trzecia kolumna 
                else if (tablica[0, 2] == 1 && tablica[1, 2] == 1) { tablica[2, 2] = 1; button_22.Content = "O"; button_22.IsEnabled = false; x++; }
                else if (tablica[1, 2] == 1 && tablica[2, 2] == 1) { tablica[0, 2] = 1; button_02.Content = "O"; button_02.IsEnabled = false; x++; }
                else if (tablica[2, 2] == 1 && tablica[0, 2] == 1) { tablica[1, 2] = 1; button_12.Content = "O"; button_12.IsEnabled = false; x++; }

                // skos od lewej
                else if (tablica[0, 2] == 1 && tablica[1, 1] == 1) { tablica[2, 0] = 1; button_20.Content = "O"; button_20.IsEnabled = false; x++; }
                else if (tablica[1, 1] == 1 && tablica[2, 0] == 1) { tablica[0, 0] = 1; button_00.Content = "O"; button_00.IsEnabled = false; x++; }
                else if (tablica[2, 0] == 1 && tablica[1, 1] == 1) { tablica[0, 2] = 1; button_02.Content = "O"; button_12.IsEnabled = false; x++; }
                //skos od prawej
                else if (tablica[0, 2] == 1 && tablica[1, 2] == 1) { tablica[2, 2] = 1; button_22.Content = "O"; button_22.IsEnabled = false; x++; }
                else if (tablica[1, 2] == 1 && tablica[2, 2] == 1) { tablica[0, 2] = 1; button_02.Content = "O"; button_02.IsEnabled = false; x++; }
                else if (tablica[2, 2] == 1 && tablica[0, 2] == 1) { tablica[1, 2] = 1; button_12.Content = "O"; button_12.IsEnabled = false; x++; }
            else
            {

                int los1, los2;
                Button[,] tablica1 = new Button[3, 3]
                { { button_00, button_01, button_02 }, { button_10, button_11, button_12 }, { button_20, button_21, button_22 } };
                etykieta:
                Random indeks1 = new Random();
                los1 = indeks1.Next(0, 3);
                los2 = indeks1.Next(0, 3);
                if (tablica1[los1, los2].IsEnabled == true)
                {
                    tablica[los1, los2] = 1;
                    tablica1[los1, los2].Content = "O";
                    tablica1[los1, los2].IsEnabled = false;
                    x++;
                }
                else
                    goto etykieta;
            }
        
         }
         private void middle()
         {
                tablica[1, 1] = 1;
                button_11.Content = "O";
                button_11.IsEnabled = false;
                x++;
        }
        private void corner()
        {
            button_00.Content = "O";
            button_00.IsEnabled = false;
            tablica[0, 0] = 1;
        }
1

Em, ten kod jest beznadziej... słab... nie, beznadziejny.
Napisz taki algorytm, aby sprawdzał się dla dowolnego rozmiaru planszy, a nie tylko 3x3.

Przecież oczy krwawią patrząc na to - nie przepalają Ci się styki w mózgu od obserwowania tych ifów?

0

Jestem początkujący. Nie wiem jak można zapisać algorytm który sprawdza dla dowolnej planszy. Próbowałem jakimiś pętlami ale wszystko na nic :(

0

To że jesteś początkujący nie ma nic do rzeczy, to kwestia myślenia i logiki, a nie znajomości języka.
Rozrysuj sobie na kartce możliwe przypadki, przykładowe plansze, jakieś powiązania, prawidłowości, a zaczniesz rozumieć. Tak do skutku - na tym polega rozwijanie się, a nie na klepaniu kodu na pałę ;)

0

Przecież w zależności od tego jaka jest plansza zmieniają się zasady wygranej. Niestety nie potrafię tego inaczej rozgryźć jeśli chodzi o kod. Jakieś podpowiedzi? :)

0

Napisanie tylu warunków samo w sobie nie jest takie łatwe, zobacz ile razy tam możesz się pomylić, a każdy warunek wypadałoby sprawdzić. Poszukaj może gotowych implementacji gry kółko i krzyżyk w C# i zobacz jak można by to zrobić lepiej. Postaraj się zrozumieć i zastosuj się do tego co znajdziesz :-)

0

No właśnie szperając w sieci natykam się na tego typu rozwiązania. Wiem, że tyle warunków sprawia trudność w czytaniu i są naprawdę brzydkie i prostackie, ale nic innego mi nie przychodzi do głowy. Jak pomyślę jak można np. jednym algorytmem sprawdzić wszystkie 8 możliwości wstawienia przez komputer znaku i przy znalezieniu odpowiedniej możliwości, wstawić swój znak.

0

By czytało się lepiej:

//pierwszy wiersz
                if (tablica[0, 0] == -1 && tablica[0, 1] == -1) { tablica[0, 2] = 1; button_02.Content = "O"; button_02.IsEnabled = false; x++; }
                else if (tablica[0, 1] == -1 && tablica[0, 2] == -1) { tablica[0, 0] = 1; button_00.Content = "O"; button_00.IsEnabled = false; x++; }
                else if (tablica[0, 2] == -1 && tablica[0, 0] == -1) { tablica[0, 1] = 1; button_01.Content = "O"; button_01.IsEnabled = false; x++; }

Co ja tu widzę:

  • Przelatujesz po wszystkich tablica[0,coś] i sprawdzasz, czy dwa z nich (albo: wszystkie oprócz jednego) zawierają -1. Wówczas temu trzeciemu przypisujesz 1. Umiesz napisać metodę, która to zrobi dla tablica[0]? A oprócz tablica[0] jeszcze dla kolejnych wierszy? A oprócz wierszy jeszcze dla kolumn?
  • Ponadto przyciskowi o indeksie takim samym, jak to pole, któremu wpisujesz 1, ustawiasz Content="O" i IsEnabled=false. Masz tablicę z przyciskami indeksowanymi w dwóch wymiarach, dlaczego by z niej nie skorzystać w tej metodzie z poprzedniego punktu?
    Ponadto:
  • Nie wiem, co oznaczają w tablicy wartości -1,0 i 1. Można je zapakować w stałe albo typ wyliczeniowy, o nazwach coś mówiących.
  • Nie rozumiem przeznaczenia wyrażenia x++. Nazywanie zmiennej "x" dla czegoś innego niż współrzędnej to kiepski pomysł.
  • corner() i middle() robią to samo, tylko dla różnych indeksów. Można te działania zapakować w metodę, która dostaje w parametrach indeks. Nawiasem mówiąc, ustawiają 1 w pewnym elemencie tablicy, a przyciskowi o takim samym indeksie ustawiają Content="O" i IsEnabled=false... Czy ja już to gdzieś pisałam?
  • Goto czytelniej zastąpić pętlą do while. Czy muszę dodawać, co się dzieje w tym ifie w etykiecie?
0

Kółko i krzyżyk jest świetnym przykładem, gdzie możesz zastosować algorytm min-max (minimax) ;)

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