• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kółko i Krzyżyk -> c++ algorytmy komputera

0 głosów
76 wizyt
pytanie zadane 13 stycznia w C i C++ przez pysiek Początkujący (280 p.)

Mam do zrobienia grę w kółko i krzyżyk, większość mam skończoną, jednak potrzebuję oprócz losowego wstawiania znaku przez komputer na planszy, dodać mu inne algorytmy, np. blokowanie ruchu. Czy mógłby mi ktoś pomóc napisać ze dwa dodatkowe algorytmy? Poniżej część kodu (wydaje mi się, że wystarczy jeśli wrzucę strukturę komputera, w której trzeba to zmienić)

struct computer
{
public:
    enum algorithm_type
    {
        ALGORITHM_0,
        ALGORITHM_1
    };
private:
    std::string name;
    char sign;
    char (*board)[MAX_SIZE][MAX_SIZE];
    algorithm_type choosen_algorithm;

    void do_algorithm_0_move(int& return_x, int& return_y)
    {
        int x = 0;
        int y = 0;
        while (true)
        {
            x = rand() % MAX_SIZE;
            y = rand() % MAX_SIZE;

            if ((*board)[y][x] == EMPTY_SIGN)
            {
                (*board)[y][x] = sign;
                return_x = x;
                return_y = y;
                std::cout << "Komputer wykonal ruch na x: " << x << ", y: " << y << std::endl;
                break;
            }
        }
    }

public:
    computer(char(*b)[MAX_SIZE][MAX_SIZE] = nullptr, char s = ' ', const algorithm_type algo_type = algorithm_type::ALGORITHM_0)
    {
        name = "computer";
        choosen_algorithm = algo_type;
        sign = s;
        board = b;
    }

    char get_sign() { return sign; }

    void make_move(int& return_x, int& return_y)
    {
        switch (choosen_algorithm)
        {
        case algorithm_type::ALGORITHM_0:
            {
                do_algorithm_0_move(return_x, return_y);
                break;
            }
        default:
        {
            std::cout << "Blad. Nie ma takiego algorytmu." << std::endl;
            exit(0);
        }
        }
    }
};

 

1 odpowiedź

0 głosów
odpowiedź 13 stycznia przez DragonCoder Pasjonat (17,320 p.)
Zablokowanie ruchu jest mozliwe dopiero gdy gracz wykonal 2 ruchy, bo dopiero wtedy widzisz, gdzie moze ustawic figury w jedej linii. Ale obejscie tak owego sprawdzenia jest proste. Wystarczy narysowac w dolnym lub gornym rogu, pozniej po przeciwnej stronie i na koncu wybrac jeden rog. Komputer wtedy narysuje przeciiwna figure, tak by przerwac jedno polaczenie, ale 2 zostanie mozliwe. Wiadomo, gdy ustawiasz fiury losowo, to moze sie zdarzyc ze zablokujesz ten ruch. Umieszczam tu link i przeczytaj:

https://medium.freecodecamp.org/how-to-make-your-tic-tac-toe-game-unbeatable-by-using-the-minimax-algorithm-9d690bad4b37

 

Tu jest wykorzystanie algorytmu maximin w ttt, oprocz tego link do wikipedii:

https://pl.wikipedia.org/wiki/Algorytm_min-max
komentarz 13 stycznia przez pysiek Początkujący (280 p.)
Generalnie plansza, na której sie poruszam jest nieskonczona, a 5 znakow pionowo/poziomo/na skos wygrywa. Myslalem wiec, by napisac cos, ze jak komputer zauwazy powiedzmy 3 znaki w ktorejs z tych sekwencji to blokuje, tylko nie wiem, jak to ugryzc.
komentarz 13 stycznia przez DragonCoder Pasjonat (17,320 p.)
Naajpierw napisalbym normalna wersje kolka i krzyzyk, a dopiero pozniej wieksza. Zreszta wykorzystujac algorytm maximin, wyjdzie na to samo , tylko ze wiecej elementow do sprawdzenia, kiedy user wygrywa. Skoro plansza jest nie skonczona, tp jest wektorem, ktory powieksza sie co chwile, gdy poda sie dany kord?
komentarz 13 stycznia przez pysiek Początkujący (280 p.)
Ja juz mam wersje kolka i krzyzyk napisana. Po prostu potrzebuje pomocy jak napisac do tego kodu algorytm, w ktorym po np. sekwencji 3 ruchow gracza (obok siebie), komputer bedzie blokowal, oraz jesli tego nie robi, to, ze uklada wlasna sekwencje do wygranej. Jak widzisz, jedyne co mam, to randomowe wykazywanie znaku przez komputer na planszy
komentarz 13 stycznia przez DragonCoder Pasjonat (17,320 p.)
Przy nie skończonej planszy, masz nieskonczenie wiele mozliwosci reakcji gracza, a wiec nieskonczenie wiele mozliwosci wygranych. Jezeli traktujesz plansze jako tablice, to przeszukaj ja w poszuliwaniu 3 takich samych elementow obok siebie i wtedy postaw figure przeciwna w miejscu gdzie teoretycznie powinna byc 4 figura. Czy przeczytales link, ktory wyslalem?

Podobne pytania

0 głosów
2 odpowiedzi 88 wizyt
+1 głos
0 odpowiedzi 361 wizyt
0 głosów
0 odpowiedzi 196 wizyt
pytanie zadane 11 listopada 2016 w C i C++ przez Undisputed Bywalec (2,610 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

60,251 zapytań

105,938 odpowiedzi

220,099 komentarzy

32,460 pasjonatów

Przeglądających: 284
Pasjonatów: 11 Gości: 273

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...