Piszę algorytm Min-Max do gry Skoczki. Liczba graczy: 2, 3, 4. Podczas analizy ruchów potrzeba:
- funkcji oceniającej
- funkcji, która znajdzie wszystkie możliwe ruchy
- roboczej planszy, gdzie będą zapisywane kolejne posunięcia
- struktur danych do drzew
- funkcji, która zwróci następnego gracza i listy graczy *players[4]
Mam dużą klasę Game (warstwę logiki), a węzły drzewa ruchów przechowam w klasie MinMax.
Funkcję znajdującą możliwe ruchy (2) mam w klasie Game, ponieważ przydaje się ona także do podpowiadania ruchów człowiekowi. Będzie wywoływana dla każdego węzła w drzewie i - uwaga - szukać możliwe ruchy na planszy roboczej! Pozostaje skopiować metodę do klasy MinMax (można do tej samej pętli wrzucić ocenę ruchu) albo uczynić klasę Game bazową dla MinMax.
Kolejna rzecz - plansza robocza - gdyby każdy wierzchołek drzewa miał osobną tablicę int[10][10], policzmy:
64 bity * 100 pól * 28 dozwolonych ruchów (4 graczy * 1 poziom zagłębienia) = 800 KB * 28618271 = 472 MB
Na to nie można pozwolić. Przecież programy szachowe analizują dla poziomu zagłębienia 10 i więcej, a tam dozwolonych ruchów jest pełno.
Więcej mogą zająć struktury danych niż sama plansza int[10][10]. 28 dozwolonych ruchów dla pozycji startowej przy 15 pionkach. Chcę zoptymalizować czas procesora i użycie pamięci, bo w przypadku MinMax wszystko musi wykonać się jak najszybciej i bez dużego obciążenia. Zapytacie, dlaczego int, a nie char. Procesor szybciej poradzi sobie z typem int (takim, jaka jest wielkość rejestrów).
Załóżmy, że potężna klasa Game jest bazową dla MinMax. Ma bardzo dużo metod, ale mało własności - tablicę int[10][10], listę wskaźników graczy players[4], wskaźnik na aktualnego gracza, stan gry i może coś jeszcze dojdzie. Czy podczas kopiowania obiektu wykonują się osobne kopie metod w pamięci komputera, czy tylko własności? Czy bez konstruktora kopiującego wszystko skopiuje się dokładnie tak jak w oryginale? Na pewno wywołanie samych konstruktorów jest czasochłonne.
Jeśli mamy: class MinMax : public Game - co zrobić, aby po utworzeniu obiektu MinMax nie wywołał się domyślny instruktor dla Game, lecz kopiujący?
Drugie wyjście to skopiowanie części metod do klasy MinMax i konieczność przekazania wielu danych.
Trzecia - kopiować tylko planszę int[10][10], a wszystkie obliczenia wykonywać w jednej instancji klasy Game. Utworzyć metody z dodatkowym parametrem, które będą liczyć nie na polach klasy Game, lecz na danych podanych poprzez argumenty.
Jak do tego podejść?