zaczne od tego, że chciałem przerobić kolko i krzyzyk oparte na min-max na plansze 5x5 (5 w rzędzie wygrywa)..
nie mam pojecia dlaczego analogicznie postepujac do kolko i krzyzyk 3x3, przy planszy 5x5 min-max dla komputera jakby sie gubil, albo liczy.. albo cos jeszcze innego, w kazdym razie nie ma oczekiwanego efektu.. cos czytalem o alpha-beta, ale jakos nie chcialbym wszystkiego znowu przerabiac pod kolejny algorytm... dlatego moja prosba jakby ktos rzucil okiem na kod ii mogl mi wskazac ewentualny blad, albo koniecznosc innego rozwiazani..
pozdrawiam
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <time.h>
using namespace std;
//-------------------------------------- RYSOWANIE PLANSZY
void plansza(char t[], int n)
{
for(int i = 1; i <= n*n; i++)
{
cout <<" "<<t[i]<<" ";
if(i % n*n)cout<<"|";
else if(i!=n*n)
{
cout<<endl;
for(int j=0;j<n-1;j++)
{
cout <<"---+";
}
cout<<"---"<<endl;
}
else cout<<endl;
}
}
//------------------------------------- SPRAWDZENIE WYGRANEJ GRACZA
bool wygrana(char t[], char g, bool cisza, int n)
{
bool test;
int count=0;
test = false;
if (n=5)
{
if(t[1]==g&&t[2]==g&&t[3]==g&&t[4]==g&&t[5]==g) test=true;
if(t[6]==g&&t[7]==g&&t[8]==g&&t[9]==g&&t[10]==g) test=true;
if(t[11]==g&&t[12]==g&&t[13]==g&&t[14]==g&&t[15]==g) test=true;
if(t[16]==g&&t[17]==g&&t[18]==g&&t[19]==g&&t[20]==g) test=true;
if(t[21]==g&&t[22]==g&&t[23]==g&&t[24]==g&&t[25]==g) test=true;
if(t[1]==g&&t[6]==g&&t[11]==g&&t[16]==g&&t[21]==g) test=true;
if(t[2]==g&&t[7]==g&&t[12]==g&&t[17]==g&&t[22]==g) test=true;
if(t[3]==g&&t[8]==g&&t[13]==g&&t[18]==g&&t[23]==g) test=true;
if(t[4]==g&&t[9]==g&&t[14]==g&&t[19]==g&&t[24]==g) test=true;
if(t[5]==g&&t[10]==g&&t[15]==g&&t[20]==g&&t[25]==g) test=true;
if(t[1]==g&&t[7]==g&&t[13]==g&&t[19]==g&&t[25]==g) test=true;
}
if(test)
{
if(!cisza)
{
system("cls");
cout << "\n wygrywa "<<g<<"!\n";
plansza(t,n);
}
return true;
}
return false;
}
//------------------------------------------------- SPRAWDZA CZY SĄ PUSTE POLA
bool remis(char t[], bool cisza,int n)
{
for(int i = 1; i <=(n*n); i++) if(t[i] == ' ') return false;
if(!cisza)
{
system("cls");
cout << "\n remis!\n\n";
plansza(t,n);
}
return true;
}
bool czy_puste(char t[], int n)
{
for(int i = 1; i <=(n*n); i++) if(t[i] != ' ') return false;
return true;
}
//-------------------------------------------------- ALGORYTM MIN-MAX
int minimax(char t[], char gracz,int n)
{
int m, mmx;
if(wygrana(t,gracz,true,n)) if(gracz == 'X') return 10; else return -10;
if(remis(t,true,n)) return 0;
if (gracz=='X') gracz='O';
else gracz='X';
if (gracz=='O') mmx=26;
else mmx=-26;
for(int i = 1; i<=25; i++)
{
if(t[i] == ' ')
{
t[i] = gracz;
m = minimax(t,gracz,n);
t[i] =' ';
if(((gracz == 'O') && (m < mmx)) || ((gracz == 'X') && (m > mmx))) mmx = m;
}
}
return mmx;}
//------------------------------------ GENEROWANIE RUCHU DLA KOMPUTERA
int komputer(char t[],int n)
{
int ruch, i, m, mmx;
mmx = -26;
for(i = 1; i <= 9; i++)
if(t[i] == ' ')
{
t[i] = 'X';
m = minimax(t,'X',n);
t[i] = ' ';
if(m > mmx)
{
mmx = m;
ruch = i;
}
}
return ruch;
}
//------------------------------------ FUNKCJA RUCHU GRACZA
void ruch(char t[], char &gracz, int n)
{
int r;
if(gracz == 'O')
{
system("cls");
cout <<endl<<"wybierz pole:"<<endl;
plansza(t,n);
cin >> r;
}
else
{
if (czy_puste(t,n))
{
srand ( time(NULL) );
/* generate secret number: */
r = rand() % n*n + 1;
}
else r = komputer(t,n);
system("cls");
plansza(t,n);
}
if((r >= 1) && (r <=(n*n)) && (t[r] ==' ')) t[r] = gracz;
else ruch(t,gracz,n);
if (gracz == 'O') gracz='X';
else gracz='O';
}
// ============================================MAIN
main()
{
char gracz,wybor,kto;
int n;
do
{
system("cls");
cout<<"Podaj wymiary planszy [5-10]:"<<endl;
cin>>n;
char t[n*n+1];
for (int i=1;i<=n*n;i++) t[i]=' ';
cout<<"Kto ma zaczac?"<<endl<<"-komputer [k]"<<endl<<"-gracz[g]"<<endl;
cin>>kto;
if(kto=='g') gracz = 'O';
else gracz='X';
while(!wygrana(t,'X',false,n) && !wygrana(t,'O',false,n) && !remis(t,false,n)) ruch(t,gracz,n);
cout << "Czy chcesz sprobowac jeszcze raz?"<<endl<<"-tak [t]"<<endl;
cin >> wybor;
} while((wybor == 'T') || (wybor == 't'));
}