Gra Kółko Krzyżyk

0

Witam, stworzyłem grę kółko krzyżyk na zaliczenie z infy i wszystko okej tylko chciałbym żeby
program wykreślał mi wygraną. (i jeśli jakoś się da żeby uniemożliwił po wykreśleniu dalsze ruchy)

W załączniku kod.
Z góry dzięki.

1

Stary, ten kod jest tragiczny. Podepnij wszystkie pola pod jeden event, i identyfikuj który został kliknięty przez przesyłany sender. Po każdym kliknięciu sprawdzaj czy ktoś nie wygrał. Jeśli tak to rysuj linię i zablokuj wykonanie rysowania przez odpowiednią flagę.

0

Ale ja jestem tępy z programowania. Możesz to wytłumaczyć jak najprościej?
Mniej więcej krok po kroku?

1

Naiwny i brzydki, ale za to zwięzły kod.
To dalej NIE jest najlepszy sposób (nie chciało mi się rozpisywać metody CheckWinner żeby działała dla dowolnej planszy), ale mniej więcej tak mógłby wyglądać minimalistyczny projekt kółka i krzyżyka.

Gdyby do tego poważnie podejść to powinieneś stworzyć klasę Board przechowującą pola, a następnie przejechać to jakimś wzorcem typu MVC - tak żeby okno było odpowiedzialne tylko za rysowanie planszy.

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            CreateBoard();
        }

        Button[,] buttons;

        void CreateBoard()
        {
            const int BoardSize = 3;
            const int BtnSize = 50;

            buttons = new Button[BoardSize, BoardSize];
            bool player = false;
            for(int x = 0; x < BoardSize; x++)
                for (int y = 0; y < BoardSize; y++)
                {
                    Button btn = new Button();
                    buttons[x, y] = btn;
                    btn.Click += (sender, e) =>
                    {
                        if (btn.Text != "") { return; }
                        btn.Text = player ? "O" : "X";
                        player = !player;
                        CheckWinner();
                    };
                    btn.Location = new Point(x * BtnSize, y * BtnSize);
                    btn.Size = new Size(BtnSize, BtnSize);
                    this.Controls.Add(btn);
                }
        }

        void CheckWinner()
        {
            // zadanie na dzisiaj - zrobić z tego jakąś ładną pętlę zamiast 
            // bruteforcować wszystkie kombinacje...
            // dobra, i tak wiem że tego nie zrobisz.

            List<Button[]> permutations = new List<Button[]>
            {
                new Button[] { buttons[0,0], buttons[0,1], buttons[0,2] },
                new Button[] { buttons[1,0], buttons[1,1], buttons[1,2] },
                new Button[] { buttons[2,0], buttons[2,1], buttons[2,2] },
                new Button[] { buttons[0,0], buttons[1,0], buttons[2,0] },
                new Button[] { buttons[0,1], buttons[1,1], buttons[2,1] },
                new Button[] { buttons[0,2], buttons[1,2], buttons[2,2] },
                new Button[] { buttons[0,0], buttons[1,1], buttons[2,2] },
                new Button[] { buttons[2,0], buttons[1,1], buttons[0,2] },
            };

            foreach (var perm in permutations)
            {
                string currPl = perm[0].Text;
                if (currPl != "" && perm.All((x)=>x.Text == currPl))
                {
                    foreach (var btn in perm)
                    { btn.ForeColor = Color.Red; btn.BackColor = Color.Black; }

                    MessageBox.Show(currPl + " wygrał"); Close();
                }
            }
        }
    }

Jest też pewnie brzydsze od twojej wersji, jeśli Ci zależy to możesz zmienić tekst na obrazki (te i podobne zmiany są w obecnym stanie banalne).

0

Myślałem, że bardziej w stosunku do tego mojego kodu jakieś rozwiązanie podpowiecie no ale spróbuje zrobić tym co napisałeś.

2

Z twoim kodem jest ten problem że jest, wybacz, straszny. Jeśli chcesz to sensownie zaimplementować, kontrolki muszą być przynajmniej dynamicznie tworzone i obsługiwane za pomocą zdarzeń.

0

kurde próbowałem to co napisałeś zmienić na PictureBoxy i coś mi nie idzie.. :/

muszę formatkę nową stworzyć? czy mogę ten kod pod moją dopasować?

1
sebolBons napisał(a):

kurde próbowałem to co napisałeś zmienić na PictureBoxy i coś mi nie idzie.. :/

muszę formatkę nową stworzyć? czy mogę ten kod pod moją dopasować?

Co tutaj dostosowywać? Zamieniasz tworzenie Buttonów na picturebox-y i kod jest zmieniony.

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