A máquina nao perdoa (jogo da velha em c -arquivo correto, agora)
Publicado por Marcos Melo 24/02/2005
[ Hits: 18.732 ]
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;
}
Script de caixa eletrônico em C
O que são e como utilizar structs
Papagaiando o XFCE com temas e recursos
WhatsApp com Chamadas no Linux via Waydroid
XFCE - quase um Gnome ou Plasma mas muito mais leve
LXQT - funcional para máquinas pererecas e usuários menos exigentes
Instalando o COSMIC DE no Gentoo (systemd)
Centralizar Logo com Transparência via ImageMagick
Removendo entradas de boot UEFI "fantasmas" via terminal
Atualizações de Segurança Automáticas no Debian
Como cortar as partes de um vídeo com passagens de áudio em branco
Ajudante para criar dicas e artigos no VOL (0)
Midia de instalação LM-21.3 não inicializa [RESOLVIDO] (15)
Reunir material [RESOLVIDO] (4)
Uma pergunta bem simples mas não achei resposta (ainda) [RESOLVIDO] (4)









