Velha Jedi  1.1
Jogo da velha invencível
ia.cpp
Vá para a documentação deste arquivo.
1 
8 #include<cstdlib>
9 #include<string>
10 #include"ia.hpp"
11 #include"ia_util.hpp"
12 #include"../util.hpp"
13 #include"../gui/resultado.hpp"
14 
27 void calcula_jogada(char *t){
28  int i;
29  //Se puder vencer, vence.
30  for(i = 0; i < 9; i++)
31  if(t[i] == '_')
32  if(e_vitoria(t, X, i)){
33  t[i] = 'X';
34  return;
35  }
36  //Impede vitória eminente do adversário.
37  for(i = 0; i < 9; i++)
38  if(t[i] == '_')
39  if(e_vitoria(t, O, i)){
40  t[i] = 'X';
41  return;
42  }
43  //Da preferência em jogar no meio do tabuleiro.
44  if(t[4] == '_'){
45  t[4] = 'X';
46  return;
47  }
48  //Prevenção contra armadilha
49  //Armadilha dos cantos opostos
50  if(t[0] == 'O' && t[8] == 'O' && t[1] == '_'
51  && t[3] == '_' && t[5] == '_' && t[7] == '_'){
52  t[1] = 'X';
53  return;
54  }
55  if(t[2] == 'O' && t[6] == 'O' && t[1] == '_'
56  && t[3] == '_' && t[5] == '_' && t[7] == '_'){
57  t[1] = 'X';
58  return;
59  }
60  //Armadilha canto+lateral
61  if((t[0]+t[1]+t[2] == 269 && t[0]+t[3]+t[6] == 278) && t[0] == '_'){
62  t[0] = 'X';
63  return;
64  }
65  if((t[0]+t[1]+t[2] == 269 && t[2]+t[5]+t[8] == 278) && t[2] == '_'){
66  t[2] = 'X';
67  return;
68  }
69  if((t[2]+t[5]+t[8] == 269 && t[6]+t[7]+t[8] == 278) && t[8] == '_'){
70  t[8] = 'X';
71  return;
72  }//278
73  if((t[6]+t[7]+t[8] == 269 && t[0]+t[3]+t[6] == 278) && t[6] == '_'){
74  t[6] = 'X';
75  return;
76  }
77 
78  if((t[1]+t[3] == 158) && (t[0] == '_') && (t[2] == '_') && (t[6] == '_')){
79  t[0] = 'X';
80  return;
81  }
82  //Tenta criar armadilha.
83  if(t[0] == '_' && t[8] == '_'){
84  if((t[1] == '_' && t[2] == 'X') || (t[3] == '_' && t[6] == 'X')){
85  t[0] = 'X';
86  return;
87  }else{
88  t[8] = 'X';
89  return;
90  }
91  }
92  if(t[2] == '_' && t[6] == '_'){
93  if((t[1] == '_' && t[0] == 'X') || (t[5] == '_' && t[8] == 'X')){
94  t[2] = 'X';
95  return;
96  }else{
97  t[6] = 'X';
98  return;
99  }
100  }
101  if(t[1] == '_' && t[7] == '_'){
102  t[1] = 'X';
103  return;
104  }
105  if(t[3] == '_' && t[5] == '_'){
106  t[3] = 'X';
107  return;
108  }
109  //Joga aleatóriamente
110  while(t[i] != '_')
111  i = rand() % 9;
112  t[i] = 'X';
113  return;
114 }
115 
121 void escolha_do_pc(GtkWidget *widget){
122  GtkWidget *imagem = gtk_image_new_from_file("pics/x.png");
123  gtk_button_set_image(GTK_BUTTON(widget), imagem);
124  gtk_widget_set_name(widget, "X");
125  gtk_widget_set_sensitive(gtk_widget_get_parent(widget), TRUE);
126 }
127 
132 void pc_faz_jogada(GtkWidget **casas){
133  char *tab = converte_widgets_para_chars(casas);
134  char backup[9];
135  std::string(tab).copy(backup,8,0);
136  calcula_jogada(tab);
137  int i;
138  for(i=0;backup[i]==tab[i]; ++i);
139  escolha_do_pc(casas[i]);
140  if(analise_do_tabuleiro(casas, PC))
141  gtk_widget_set_sensitive(gtk_widget_get_parent(casas[0]), FALSE);
142 }
char * converte_widgets_para_chars(GtkWidget **casas)
Definition: util.cpp:20
void escolha_do_pc(GtkWidget *widget)
Definition: ia.cpp:121
int analise_do_tabuleiro(GtkWidget **casas, int vez)
Definition: ia_util.cpp:31
Header para ia_util.cpp.
void calcula_jogada(char *t)
Definition: ia.cpp:27
void pc_faz_jogada(GtkWidget **casas)
Definition: ia.cpp:132
Header para ia.cpp.
int e_vitoria(char *t, int tipo_peca, int i)
Definition: ia_util.cpp:59