Implementacja uogólnionej wersji gry Kółko i Krzyżyk (tzw. m,n,k-game) w C++17 z graficznym interfejsem SFML 3 oraz sztuczną inteligencją opartą na algorytmie Minimax z cięciami alfa-beta i funkcją heurystyczną.
Projekt zrealizowany na przedmiot Projektowanie i Analiza Algorytmów (Politechnika Wrocławska, Informatyczne Systemy Automatyki).
-
Konfigurowalna plansza — dowolny rozmiar
$n \times n$ (od 3×3 do 15×15) oraz dowolna liczba znaków$k$ wymaganych do wygranej - Dwa tryby gry — Gracz vs Gracz oraz Gracz vs SI
-
Sztuczna inteligencja:
- algorytm Minimax z cięciami alfa-beta
- funkcja heurystyczna oceniająca pozycję na dużych planszach (analiza sekwencji w 4 kierunkach)
- natychmiastowe wykrywanie wygranych i blokowanie zagrożeń przeciwnika
- automatyczny dobór głębokości przeszukiwania i strategii generowania ruchów w zależności od rozmiaru planszy
- obliczenia SI w osobnym wątku (
std::async) — interfejs nie zamraża się podczas "myślenia" AI
-
Graficzny interfejs (SFML 3):
- menu konfiguracyjne (rozmiar planszy, liczba znaków do wygranej, tryb gry, wybór strony)
- panel boczny z informacją o turze/wyniku
- przycisk restartu gry
- C++17
- SFML 3 — okno, grafika, obsługa zdarzeń
- Visual Studio (projekt rozwijany pod Windows, kompilator MSVC)
.
├── main.cpp punkt wejścia, inicjalizacja menu i okna gry
├── MenuWindow.h / .cpp ekran konfiguracyjny gry
└── game/
├── Types.h podstawowe typy: Cell, GameResult, Move, GameConfig
├── Board.h / .cpp reprezentacja planszy
├── Rules.h / .cpp sprawdzanie warunków wygranej/remisu
├── MoveGenerator.h / .cpp generowanie ruchów (wszystkie pola / sąsiedztwo)
├── GameState.h / .cpp stan gry, historia ruchów, cofanie ruchów
├── AI.h / .cpp Minimax, alfa-beta, heurystyka
└── GameWindow.h / .cpp pętla gry, rysowanie planszy i panelu, obsługa kliknięć
Projekt rozdziela logikę gry od warstwy graficznej:
- Logika gry (
Board,Rules,GameState,MoveGenerator,AI) — czysty C++17 bez żadnych zależności zewnętrznych. Można testować i uruchamiać niezależnie od SFML (np. w konsoli). - Warstwa graficzna (
GameWindow,MenuWindow) — korzysta z logiki gry wyłącznie przez publiczne API (GameState,AI), nie ingerując w jej wewnętrzną implementację.
SI przeszukuje drzewo możliwych stanów gry, zakładając optymalną grę obu stron. Cięcia alfa-beta eliminują gałęzie drzewa niemające wpływu na ostateczną decyzję, redukując złożoność z
Na planszach większych niż 5×5 pełne przeszukanie drzewa do końca gry jest niewykonalne obliczeniowo. Gdy Minimax osiągnie limit głębokości, pozycja oceniana jest heurystycznie na podstawie długości i "otwartości" sekwencji obu graczy w czterech kierunkach (poziomo, pionowo, dwa skosy).
Dla małych plansz (
- Visual Studio 2022 (lub kompatybilny kompilator wspierający C++17)
- SFML 3.x (instalacja przez NuGet lub ręczna konfiguracja ścieżek w ustawieniach projektu)
- Sklonuj repozytorium
- Zainstaluj SFML 3 (przez NuGet: Manage NuGet Packages → wyszukaj
SFML) - Skopiuj plik czcionki (np.
arial.ttf) do folderuassets/w katalogu projektu oraz w katalogu wynikowym (x64/Debug/) - Zbuduj i uruchom projekt w Visual Studio
github.com/Czarko-exe — Informatyczne Systemy Automatyki, Politechnika Wrocławska