AI do gry kółko krzyżyk.

0

Chciałbym się poradzić Was w dwóch sprawach. Po pierwsze prosiłbym o ocenę tego kodu, czy nie jest zbyt chaotyczny i czy nie ma w nim żadnych błędów wynikających z mojej strony. A drugie pytanie, chciałbym się podardzić Was w sprawie sztucznej inteligencji dotyczącej gry w kółko krzyżyk komputera...

Opis:
Kółko krzyżyk, to w tym przypadku gra między komputerem, a użytkownikiem.
Chciałbym aby komputer na ocenie ruchów potrafił wybrać najlepszą pozycje...
Prosił bym o jakieś przykładowe akrtykóły albo projekty.

#include <iostream>
using namespace std;

void plansza ( char tablica[], int rozmiar ){
	system("cls");
	for ( int i=0 ; i<rozmiar ; i++ ){
		cout << tablica[i];
		if ( ((i+1) % 3) == 0 ) cout << endl;
	}
}	

void tablica_default ( char tablica[], int rozmiar ){
	for ( int i=0 ; i<rozmiar ; i++ ){
		tablica[i]='-';
	}	
	plansza ( tablica, rozmiar );
}

void ruch ( int gracz, int wybor, char plansza[], int &player ){
	if ( gracz==1 ){
		plansza[wybor-1]='x';
		player++;
	}
	if ( gracz==2 ){
		plansza[wybor-1]='o';
		player--;
	}
}

int wybor ( char plansza[] ){							
	bool pole=true;										
	int wybor;
	while ( pole != false ){
		cout << "Wybor: "; cin >> wybor;
		if ( plansza[wybor-1] != '-' ) pole = true;
		else pole = false;
	}
	return wybor;
}

int sedzia ( char plansza[], int rozmiar ){
	for ( int i=0 ; i<rozmiar;  i++ ){
		if (i%3==0 && plansza[i]=='x' && plansza[i+1]=='x' && plansza[i+2]=='x') return 1;  
		if ( i<3 && plansza[i]=='x' && plansza[i+3]=='x' && plansza[i+6]=='x' ) return 1; 
		if ( ( i==0 && plansza[i]=='x' && plansza[i+4]=='x' && plansza [i+8]=='x' ) ||
                  ( i==2 && plansza[i]=='x' && plansza[i+2]=='x' && plansza[i+4]=='x' ) ) return 1; 
		if (i%3==0 && plansza[i]=='o' && plansza[i+1]=='o' && plansza[i+2]=='o') return 2; 
		if ( i<3 && plansza[i]=='o' && plansza[i+3]=='o' && plansza[i+6]=='o' ) return 2; 
		if ( ( i==0 && plansza[i]=='o' && plansza[i+4]=='o' && plansza [i+8]=='o' ) ||
                  ( i==2 && plansza[i]=='o' && plansza[i+2]=='o' && plansza[i+4]=='o' ) ) return 2; 
	}
	return 0;
}
		
int main(){
	int rozmiar = 9, player=1, krok=0;
	char tablica[rozmiar];
	tablica_default( tablica, rozmiar ); 
	do{
		krok++;
		ruch ( player, wybor( tablica ), tablica, player );
		plansza ( tablica, rozmiar );
	}while ( ( sedzia ( tablica, rozmiar ) == 0 ) && (krok <=8) );
	system("cls");
	cout << "\n\n**** Gracz: " << sedzia( tablica, rozmiar ) << " wygrywa rozgrywke, GRATULACJE ****\n\n\n\n";
	system("pause");
} 
0
  1. Zamiast typu char w tablicy powinieneś zdefiniowac typ wyliczeniowy.
enum AreaField {
    Empty,
    Cross,
    Wheel
};
  1. Zamiast jednowymiarowej tablicy powinienes uzyc dwuwymiarowej tablicy, a najlepiej gotowy szablon macierzy.
static const int area_row_count = 3;
static const int area_column_count = 3;
static const int area_item_count = area_row_count * area_column_count;

typedef AreaField Area[area_row_count][area_column_count];
  1. system("cls"); jest nieprzenośną konstrukcją. Dlatego twój kod nawali na linuksie.
inline void clear_screen()
{
#ifdef linux
    ::system( "clear" );
#else
    ::system( "cls" );
#endif
}
  1. Zamiast:
void tablica_default ( char tablica[], int rozmiar ){
        for ( int i=0 ; i<rozmiar ; i++ ){
                tablica[i]='-';
        }
        plansza ( tablica, rozmiar );
}

Lepiej powołać się na gotowe funkcje:

inline void init(Area area)
{
    std::fill( area, area + area_item_count, Empty );
}
  1. Skoro masz zmienną to odliczania to lepiej byłby użyć for zamiast do..while
do{
        krok++;
        ruch ( player, wybor( tablica ), tablica, player );
        plansza ( tablica, rozmiar );
}while ( ( sedzia ( tablica, rozmiar ) == 0 ) && (krok <=8) );

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