Skip to content

Commit 070834b

Browse files
committed
AI com programação semi-completa. Funções e dificuldades criadas, precisa de reparos, modo fácil precisa verificar se a casa já está marcada mais eficientemente, modo normal precisa ser consertada (agindo de forma estranha). Modo impossível não foi testado ainda, mas provavvelmente está funcionando, já que o código só foi portado e não escrito por mim. Algorítimo minimax foi fornecido pelo site Geek for Geeks em c++
1 parent d07093f commit 070834b

File tree

6 files changed

+201
-94
lines changed

6 files changed

+201
-94
lines changed

Jogo da Velha/Jogo da Velha.c

Lines changed: 65 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#define _CRT_SECURE_NO_WARNINGS
2+
#include "Jogo da Velha.h"
3+
#include "ai.h"
4+
#include "minimax.h"
25
#include <stdio.h>
36
#include <stdlib.h>
47
#include <string.h>
5-
#include "Jogo da Velha.h"
6-
#include "ai.h"
78

89
/*verifica se alguém venceu e retorna um array[3]
910
caso verdade, retorna {1, W, C},
@@ -123,17 +124,9 @@ int* winVerifyer(int grid[3][3])
123124
e retorna as 3 posições, ou menos*/
124125
int** freeCells(int grid[3][3])
125126
{
126-
static int freePositions[4][2];
127+
static int freePositions[4][2] = { 0 };
127128
int count1;
128129

129-
freePositions[3][0] = -1;
130-
freePositions[3][1] = -1;
131-
freePositions[2][0] = -1;
132-
freePositions[2][1] = -1;
133-
freePositions[1][0] = -1;
134-
freePositions[1][1] = -1;
135-
freePositions[0][0] = -1;
136-
freePositions[0][1] = -1;
137130
count1 = 0;
138131

139132
for (int i = 0; i < 3; i++)
@@ -158,16 +151,16 @@ int** freeCells(int grid[3][3])
158151
}
159152
}
160153
}
161-
if (freePositions[2][0] == -1 && freePositions[2][1] == -1 && freePositions[1][0] == -1 && freePositions[1][1] == -1 && freePositions[0][0] == -1 && freePositions[0][1] == -1)
154+
if (freePositions[2][0] == 0 && freePositions[2][1] == 0 && freePositions[1][0] == 0 && freePositions[1][1] == 0 && freePositions[0][0] == 0 && freePositions[0][1] == 0)
162155
{
163-
freePositions[3][0] = 0;
164-
freePositions[3][1] = 0;
165-
freePositions[2][0] = 0;
166-
freePositions[2][1] = 0;
167-
freePositions[1][0] = 0;
168-
freePositions[1][1] = 0;
169-
freePositions[0][0] = 0;
170-
freePositions[0][1] = 0;
156+
freePositions[3][0] = 3;
157+
freePositions[3][1] = 3;
158+
freePositions[2][0] = 3;
159+
freePositions[2][1] = 3;
160+
freePositions[1][0] = 3;
161+
freePositions[1][1] = 3;
162+
freePositions[0][0] = 3;
163+
freePositions[0][1] = 3;
171164
}
172165
return freePositions;
173166
}
@@ -709,7 +702,7 @@ int main(int argc, char* argv[])
709702
if (grid[playCoordinates[0]][playCoordinates[1]] != 0)
710703
{
711704
printf("\nEssa casa já foi marcada!\n");
712-
system("pause");
705+
if (getchar() != NULL);
713706
continue;
714707
}
715708
if (player == 1)
@@ -727,6 +720,14 @@ int main(int argc, char* argv[])
727720
memcpy(freeCellsReturn, freeCells(grid), sizeof(freeCellsReturn));
728721
if (freeCellsReturn[0][0] != -1)
729722
{
723+
if (freeCellsReturn[0][0] = 3)
724+
{
725+
gridPrinter(gridTiedReturner(grid, 1), 2);
726+
printf("\nDeu velha...\n");
727+
tie = 1;
728+
break;
729+
}
730+
730731
if (tieVerifyer(grid, player, insertionPreference) == 1)
731732
{
732733
memcpy(grid, gridTiedReturner(grid, 1), sizeof(grid));
@@ -746,6 +747,11 @@ int main(int argc, char* argv[])
746747

747748
if (player == 1)
748749
{
750+
int difficulty;
751+
printf("Selecione sua dificuldade: 1- Fácil, 2- Normal, 3- Impossível\n");
752+
if (scanf(" %i", &difficulty) == 1);
753+
difficulty--;
754+
aiStart(grid, -symbolPreference);
749755
while (keepPlaying != 'n' && keepPlaying != 'N')
750756
{
751757
for (int i = 0; i < 3; i++)
@@ -763,44 +769,62 @@ int main(int argc, char* argv[])
763769
while (win == 0 && tie == 0)
764770
{
765771
printf("\033[2J"); //funciona como system("clear") ou system("cls");
766-
gridPrinter(grid, 2);
767772
if (player == 3)
768773
player = 1;
769-
printf("Jogue, Jogador %i\n", player);
770-
if (insertionPreference == 1)
771-
{
772-
if (scanf("%i", &playPosition) == 1);
773-
memcpy(playCoordinates, convertToCoordinate(playPosition), sizeof(playCoordinates));
774-
}
775-
if (insertionPreference == 2)
776-
{
777-
if (scanf("%i %i", &playCoordinates[0], &playCoordinates[1]) == 2);
778-
playCoordinates[0]--;
779-
playCoordinates[1]--;
780-
}
781-
if (playCoordinates[0] < 0 || playCoordinates[1] < 0)
782-
break;
783-
if (grid[playCoordinates[0]][playCoordinates[1]] != 0)
774+
if (player == 1)
784775
{
785-
printf("\nEssa casa já foi marcada!\n");
786-
system("pause");
787-
continue;
776+
gridPrinter(grid, 2);
777+
printf("Jogue, Jogador!\n");
778+
if (insertionPreference == 1)
779+
{
780+
if (scanf("%i", &playPosition) == 1);
781+
memcpy(playCoordinates, convertToCoordinate(playPosition), sizeof(playCoordinates));
782+
}
783+
if (insertionPreference == 2)
784+
{
785+
if (scanf("%i %i", &playCoordinates[0], &playCoordinates[1]) == 2);
786+
playCoordinates[0]--;
787+
playCoordinates[1]--;
788+
}
789+
if (playCoordinates[0] < 0 || playCoordinates[1] < 0)
790+
break;
791+
if (grid[playCoordinates[0]][playCoordinates[1]] != 0)
792+
{
793+
printf("\nEssa casa já foi marcada!\n");
794+
if (getchar() != NULL);
795+
continue;
796+
}
788797
}
789798
if (player == 1)
790799
grid[playCoordinates[0]][playCoordinates[1]] = symbolPreference;
791800
if (player == 2)
801+
{
802+
memcpy(playCoordinates, aiPlay(grid, difficulty), sizeof(playCoordinates));
792803
grid[playCoordinates[0]][playCoordinates[1]] = -symbolPreference;
804+
}
805+
793806
if ((winVerifyer(grid))[0] == 1)
794807
{
795808
gridPrinter(grid, 5);
796-
printf("\nJogador %i venceu!", player);
809+
if (player == 1)
810+
printf("\nVocê venceu!");
811+
if (player == 2)
812+
printf("\nVocê Perdeu!\n");
797813
win = 1;
798814
break;
799815
}
800816
player++;
801817
memcpy(freeCellsReturn, freeCells(grid), sizeof(freeCellsReturn));
802818
if (freeCellsReturn[0][0] != -1)
803819
{
820+
if (freeCellsReturn[0][0] == 3)
821+
{
822+
gridPrinter(grid, 2);
823+
printf("\nDeu velha...\n");
824+
tie = 1;
825+
break;
826+
}
827+
804828
if (tieVerifyer(grid, player, insertionPreference) == 1)
805829
{
806830
memcpy(grid, gridTiedReturner(grid, 1), sizeof(grid));

Jogo da Velha/Jogo da Velha.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ int* winVerifyer(int grid[3][3]);
1515

1616
/*verifica se há até 3 casas livres
1717
e retorna as 3 posições, ou menos*/
18-
int** freeCells(int grid[3][3]);
18+
extern int** freeCells(int grid[3][3]);
1919

2020
/*retem a gridCopy usada na tieVerifyer
2121
para passá-la para a main*/
@@ -27,7 +27,7 @@ caso não, retorna 0*/
2727
int tieVerifyer(int grid[3][3], int player, int insertionPreference);
2828

2929
//converte o posicionamento de 1 a 9 por coordenadas
30-
int* convertToCoordinate(int position);
30+
extern int* convertToCoordinate(int position);
3131

3232
//converte as coordenadas da grade para coordenadas da
3333
//super grade

0 commit comments

Comments
 (0)