A máquina nao perdoa (jogo da velha em c -arquivo correto, agora)
Publicado por Marcos Melo 24/02/2005
[ Hits: 18.623 ]
Demorou, mas consegui fazer a máquina analisar o jogo satisfatoriamente.
O programa, Às vezes, "se distrai", mas na maoir parte do tempo joga corretamente.
eu já havia postado esse programa antes, mas cometi um erro no upload, e postei o arquivo de outro cara, que eu havia baixado. Era um jogo da velha, tambem, mas diferente do meu.
#include <stdio.h>
int jogarx = 0;
int jogary = 0;
struct jogada {
int x;
int y;
long jogador;
};
struct jogo {
int casa[3][3];
int valor[3][3];
} pou;
long contador = 0;
main()
{
int pontos_maq = 0;
int pontos_hom = 0;
long decr = 1024;
int falso;
int x, y;
struct jogada teste;
struct jogada *pega = &teste;
int verifica;
int jogador = -1;
int primeiro = -1;
pega->jogador = 0;
pega->x = 0;
pega->y = 0;
while (1 > 0) {
verifica = ver_se_ganhou(pou, 0);
if (verifica == (1))
pontos_maq++;
if (verifica == -1)
pontos_hom++;
primeiro = primeiro * (-1);
jogador = primeiro;
for (x = 0; x < 3; x++)
for (y = 0; y < 3; y++)
pou.casa[x][y] = 0;
while (ver_se_ganhou(pou, 0) == 0 && empate(pou) == 0) {
imprime(pou, 0);
printf("---\n");
if (jogador == 1) {
// printf("maquina\n");
escolhe(pou, 0, decr);
x = jogarx;
y = jogary;
pou.casa[x][y] = 1;
imprime(pou, 0);
sleep(1);
jogador = (-1);
} else {
falso = 0;
while (falso == 0) {
printf("maquina: %i\nhomem: %i\n",
pontos_maq, pontos_hom);
printf("faça sua jogada:");
scanf("%1d%1d", &x, &y);
if (pou.casa[x][y] == 0)
falso = 1;
}
printf("x: %i y: %i\n", x, y);
pou.casa[x][y] = -1;
imprime(pou, 0);
jogador = 1;
}
}
}
printf("asfdas");
}
int
empate(struct jogo tab)
{
int x, y;
for (x = 0; x < 3; x++) {
for (y = 0; y < 3; y++) {
if (tab.casa[x][y] == 0) {
return (0);
}
}
}
return (1);
}
//struct jogo
//zerar()
//{
// int x, y;
// struct jogo tab;
// for (x = 0; x < 3; x++)
// for (y = 0; y < 3; y++)
// tab.casa[x][y] = 0;
// return tab;
//}
escolhe(struct jogo tabula, int decr)
{
int dee = 2000;
struct jogo tabe = tabula;
struct jogada maior;
long valor = 0;
int x, y;
maior.jogador=-123456789;
for (x = 0; x < 3; x++) {
for (y = 0; y < 3; y++) {
if (tabe.casa[x][y] == 0) {
if (contador == 0) {
}
contador = 0;
rodar(tabe, x, y, 1, 2000, 3);
valor = contador;
// printf
// ("(valor %i)\t(contador %i)\t(%i,%i)\t(maior:%i)",
// valor, contador, x, y, maior.jogador);
if (valor >= maior.jogador) {
maior.jogador = valor;
jogarx = x;
jogary = y;
// printf("\t(%i,%i)", jogarx, jogary);
}
// putchar('\n');
}
}
}
}
rodar(struct jogo tabula, int x, int y, int player, int decr, int rr)
{
int valor = 0;
struct jogo tab = tabula;
int resultado;
int ddd = decr;
int a, b;
tab.casa[x][y] = player;
player = player * (-1);
resultado = ver_se_ganhou(tab, ddd);
if (ddd > 0) {
ddd = (ddd - 1000);
}
if (resultado != 0)
return resultado;
for (a = 0; a < 3; a++) {
for (b = 0; b < 3; b++) {
if (tab.casa[a][b] == 0) {
rodar(tab, a, b, player, ddd, 2);
}
}
}
return valor;
}
imprime(struct jogo taba, double valor)
{
struct jogo tab = taba;
int x, y;
system("clear");
printf(" 0 1 2\n");
// printf(" _____\n");
for (x = 0; x < 3; x++) {
putchar(x + '0');
putchar('|');
for (y = 0; y < 3; y++) {
int aa;
switch (tab.casa[y][x]) {
case -1:
aa = 'X';
break;
case 1:
aa = 'O';
break;
case 0:
aa = ' ';
break;
}
putchar(aa);
putchar('|');
}
printf("\n");
}
printf(" ---\n");
printf("contador: %i\n", contador);
if (ver_se_ganhou(tab, 9) != 0) {
}
}
int
ver_se_ganhou(struct jogo tab, long decr)
{
/*ver vertical */
int x, y;
int casinha;
for (x = 0; x < 3; x++) {
casinha = tab.casa[x][0];
for (y = 0; casinha != 0 && tab.casa[x][y] == casinha; y++)
if (y == 2) {
contador += casinha;
contador = contador + (casinha * decr);
return casinha;
}
}
/* ver horiaontal*/
for (y = 0; y < 3; y++) {
casinha = tab.casa[0][y];
for (x = 0; casinha != 0 && tab.casa[x][y] == casinha; x++)
if (x == 2) {
contador += casinha;
contador = contador + (casinha * decr);
return casinha;
}
}
/*ver primeira diagonal*/
if (tab.casa[0][0] != 0 && (tab.casa[0][0] == tab.casa[1][1])
&& (tab.casa[1][1] == tab.casa[2][2])) {
contador += tab.casa[0][0];
contador = contador + (tab.casa[0][0] * decr);
return tab.casa[0][0];
}
/*ver segunda diagonal*/
if (tab.casa[2][0] != 0 && (tab.casa[2][0] == tab.casa[1][1])
&& (tab.casa[1][1] == tab.casa[0][2])) {
contador += tab.casa[2][0];
contador = contador + (tab.casa[0][0] * decr);
return tab.casa[2][0];
}
return 0;
}
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)
Instalação não está resolvendo as dependencias (2)
Captação de áudio no zorin linux começa a diminuir com o tempo (5)
Alternativas ao Multilogin para gerenciamento de múltiplas contas/prof... (0)









