forked from Aisthetic/GoGame
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsolver.c
More file actions
110 lines (105 loc) · 4.11 KB
/
Copy pathsolver.c
File metadata and controls
110 lines (105 loc) · 4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "grid.h"
#include "game.h"
#include "logic.h"
#include "solver.h"
#include <stdio.h>
#include <stdlib.h>
void play(){
int chosenX=-1;
int chosenY=-1;
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
if(grid[j][i]=='A'){
printf("Found target(%d,%d),checking if can be bullied..",i,j);
if(SlotInGrid(i-1,j)&&SlotFree(i-1,j)){putToken(i,j+1);return;}
else if(SlotInGrid(i,j-1)&&SlotFree(i,j-1)) {putToken(i+1,j);return;}
else if(SlotInGrid(i+1,j)&&SlotFree(i+1,j)) {putToken(i+2,j+1);return;}
else if(SlotInGrid(i,j+1)&&SlotFree(i,j+1)) {putToken(i+1,j+2);return;}
}
}
}
if(hasToPass)return;
getAllTeams();
int teamsLen=0;
//On récup la longueur du tableau
for(int i=0;i<81;i++){
if(allTeams[i].MembersCount=-1){
teamsLen = i;
break;
}
}
//On parcourt toutes les teams
for(int i=0;i<teamsLen;i++){
if(allTeams[i].Members[0].side == 'A' && 1)//Ennemy or ally on applique cette methode car dans le cas d'un allié ça va le sortir d'une
//situation de mort et dans le cas d'un ennemie ça va le capturer
{
int teamLiberty=0;
int freeGuyX;
int freeGuyY;
for(int j = 0; j < allTeams[i].MembersCount; j++){//Pour définir la libérté de la team
printf("checking capture for token (%d,%d) \n",allTeams[i].Members[j].X,allTeams[i].Members[j].Y);
Team allies;
Team ennemies;
allies = allTeams[i].Members[j].surroundingAllies(&allTeams[i].Members[j]);
ennemies = allTeams[i].Members[j].surroundingEnnemies(&allTeams[i].Members[j]);
int liberty=4;
liberty = liberty - allies.MembersCount;
liberty = liberty - ennemies.MembersCount;
//Pour les tokens aux limites
if(allTeams[i].Members[j].X==0 || allTeams[i].Members[j].X==8) liberty = liberty-1;
if(allTeams[i].Members[j].Y==0 || allTeams[i].Members[j].Y==8) liberty = liberty-1;
printf("token's liberty degree is %d \n",liberty);
if(liberty>teamLiberty){
teamLiberty=liberty;
freeGuyX = allTeams[i].Members[j].X;
freeGuyY = allTeams[i].Members[j].Y;
}
}
if(teamLiberty==1){//si la team peut être capturée , on cherche la pos pour la capturer;
if(SlotInGrid(freeGuyX-1,freeGuyY)&&grid[freeGuyY][freeGuyX-1]==' '){
chosenX = freeGuyX-1;
chosenY = freeGuyY;
}
if(SlotInGrid(freeGuyX+1,freeGuyY)&&grid[freeGuyY][freeGuyX+1]==' '){
chosenX = freeGuyX+1;
chosenY = freeGuyY;
}
if(SlotInGrid(freeGuyX,freeGuyY-1)&&grid[freeGuyY-1][freeGuyX]==' '){
chosenX = freeGuyX;
chosenY = freeGuyY-1;
}
if(SlotInGrid(freeGuyX,freeGuyY+1)&&grid[freeGuyY+1][freeGuyX]==' '){
chosenX = freeGuyX;
chosenY = freeGuyY+1;
}
}
}
}
}
/*
Description: fonction pour trouver toutes les teams de la grille
Params: none
Return: tableau
*/
void getAllTeams(){
hasToPass = 1;
int teamsCount = 0;
printf("The solver is thinking.. \n");
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++){
int teamRegistred=0;
for(int k=0;k<teamsCount;k++){
printf("check for (%d,%d),teamsCount %d.. \n",i,j,teamsCount);
if(sameTeam(tGrid[i][j],allTeams[i].Members[0]))
teamRegistred=1;
}
if(!teamRegistred && grid[j][i] != ' '){
allTeams[teamsCount] = tGrid[i][j].team;
teamsCount++;
}
}
}
//On met -1 sur le memberCount de la derniere team pour marquer la fin du tableau
allTeams[teamsCount].MembersCount = -1;
}