• 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

VPS Starter Arubacloud
0 głosów
1,161 wizyt
pytanie zadane 13 stycznia 2019 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);
        }
        }
    }
};

 

2 odpowiedzi

0 głosów
odpowiedź 13 stycznia 2019 przez DragonCoder Nałogowiec (36,500 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 2019 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 2019 przez DragonCoder Nałogowiec (36,500 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 2019 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 2019 przez DragonCoder Nałogowiec (36,500 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?
0 głosów
odpowiedź 27 sierpnia 2020 przez mdw Nowicjusz (180 p.)

Można użyć algorytmu min-max, coś takiego jak tu: https://youtu.be/bT2AzWEKmSs

Podobne pytania

+1 głos
0 odpowiedzi 635 wizyt
0 głosów
0 odpowiedzi 1,972 wizyt
pytanie zadane 11 listopada 2016 w C i C++ przez Undisputed Gaduła (3,040 p.)
0 głosów
2 odpowiedzi 472 wizyt
pytanie zadane 10 września 2016 w C i C++ przez Antero00 Gaduła (3,670 p.)

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...