min-max kolko i krzyzyk na planszy 5x5

0

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'));
}

0

tablice w C indeksuje się jak informatyk, czyli od 0 do n-1!
To co napisałeś(aś) ma jedną dużą wadę! Do jednego stanu gry można dojść więcej niż na jeden sposób, czyli niektóre pozycje niepotrzebnie analizujesz wielokrotnie, co przy 25 ruchach daję bardzo DUŻO kombinacji.

Zawijaj wiersze, takie długie linie i to z instrukcjami warunkowymi, pętlami itp, prowadzą do zagmatwania kodu.

0
a.cpp:35:6: note: use '==' to turn this assignment into an equality comparison
if (n=5)
     ^
     ==
a.cpp:162:1: error: C++ requires a type specifier for all declarations
main()
^~~~
0

..dzięki, no już chyba wiem co zrobic! postaram się ograniczyć liczbę przeszukiwanych możliwych rozwiązań..

0

może warto się też zastanowić nad ograniczeniem głębokości analizy (ile ruchów do przodu sprawdzać).

1 użytkowników online, w tym zalogowanych: 0, gości: 1