Witam.Mam problem z grą w kółko i krzyżyk 5x5. Czy jest ktoś w stanie pomóc mi z implementacją algorytmu alfa-beta? Dla minmax ma za dużą złożoność obliczeniową więc muszę to jakoś przerobić.
#include <stdio.h>
#include <stdbool.h>
//rysujZnak
char gridChar(int i)
{
switch (i)
{
case -1:
return 'X';
case 0:
return ' ';
case 1:
return 'O';
}
}
//zasady gry
void zasadyGry()
{
puts("ZASADY GRY W KOLKO I KRZYZYK 5 X 5:\n""Twoim oczom ukaze sie plansza z dostepnymi ruchami w grze. ""Twoj ruch w grze uzalezniony jest od numeru pola ktore wybierzesz.\n ""DOSTEPNE RUCHY:\n\n"" 0 | 1 | 2 | 3 | 4\n""----+----+----+----+---\n"" 5 | 6 | 7 | 8 | 9\n""----+----+----+----+---\n"" 10 | 11 | 12 | 13 | 14\n""----+----+----+----+---\n"" 15 | 16 | 17 | 18 | 19\n""----+----+----+----+---\n"" 20 | 21 | 22 | 23 | 24\n\n""POWODZENIA!\n"
);
}
//plansza
void draw(int b[25])
{
printf(" %c | %c | %c | %c | %c\n", gridChar(b[0]), gridChar(b[1]), gridChar(b[2]), gridChar(b[3]), gridChar(b[4]));
printf("---+---+---+---+---\n");
printf(" %c | %c | %c | %c | %c\n", gridChar(b[5]), gridChar(b[6]), gridChar(b[7]), gridChar(b[8]), gridChar(b[9]));
printf("---+---+---+---+---\n");
printf(" %c | %c | %c | %c | %c\n", gridChar(b[10]), gridChar(b[11]), gridChar(b[12]), gridChar(b[13]), gridChar(b[14]));
printf("---+---+---+---+---\n");
printf(" %c | %c | %c | %c | %c\n", gridChar(b[15]), gridChar(b[16]), gridChar(b[17]), gridChar(b[18]), gridChar(b[19]));
printf("---+---+---+---+---\n");
printf(" %c | %c | %c | %c | %c\n", gridChar(b[20]), gridChar(b[21]), gridChar(b[22]), gridChar(b[23]), gridChar(b[24]));
}
//Wszystkie mozliwosci wygrania przez gracza, gdy przegrywa funkcja zwraca 0
int win(const int board[25])
{
unsigned wins[12][5] = { {0,1,2,3,4},{4,9,14,19,24},{20,21,22,23,24},{0,5,10,15,20},{0,6,12,18,24},
{4,8,12,16,20},{1,6,11,16,21},{2,7,12,17,22},{3,8,13,18,23},{5,6,7,8,9},{10,11,12,13,14},{15,16,17,18,19} };
for (int i = 0; i < 12; ++i)
{
if (board[wins[i][0]] != 0 &&
board[wins[i][0]] == board[wins[i][1]] &&
board[wins[i][0]] == board[wins[i][2]] &&
board[wins[i][0]] == board[wins[i][3]] &&
board[wins[i][0]] == board[wins[i][4]])
return board[wins[i][2]];
}
return 0;
}
//Tu jest problem
int minimax(int board[25], int player,int alpha,int beta)
{
int winner = win(board);
if (winner != 0)
{
return winner * player;
}
int move = -1;
int score = -2;
for (int i = 0; i < 25; ++i)
{
//kolej gracza
if (board[i] == 0)
{
board[i] = player;
int thisScore = -minimax(board, player * -1);
if (thisScore > score)
{
score = thisScore;
move = i;
}
board[i] = 0;
}
}
if (move == -1) return 0;
return score;
}
void computerMove(int board[25])
{
int move = -1;
int score = -2;
for (int i = 0; i < 25; ++i)
{
if (board[i] == 0)
{
board[i] = 1;
int tempScore = -minimax(board, -1);
board[i] = 0;
if (tempScore > score)
{
score = tempScore;
move = i;
}
}
}
board[move] = 1;
}
void playerMove(int board[25])
{
int move = 0;
do
{
printf("\nTwoj ruch ([0...24]): ");
scanf("%d", &move);
printf("\n");
if (board[move] != 0)
{
printf("Pole ktore wybierasz jest zajete! Wybierz dostepne pole.\n");
}
} while (move >= 25 || move < 0 || board[move] != 0);
board[move] = -1;
}
int main()
{
zasadyGry();
int board[25] = {0};
printf("Komputer: O, Ty: X\nWybierz,czy chcesz zaczac pierwszy(1) czy drugi(2)? ");
int player = 0;
scanf("%d\n", &player);
for (unsigned turn = 0; turn < 25 && win(board) == 0; ++turn)
{
if ((turn + player) % 2 == 0)
{
computerMove(board);
}
else
{
draw(board);
playerMove(board);
}
}
switch (win(board))
{
case 0:
printf("REMIS!\n");
break;
case 1:
draw(board);
printf("PRZEGRALES!\n");
break;
case -1:
printf("WYGRALES!\n");
break;
}
}