Ir para conteúdo
Fórum Script Brasil
  • 0

8-puzzle em c


trika

Pergunta

Oi galera!Sou nova aqui e meio inexperiente em c/c++.Bom,tenho esse projeto pra fazer: http://docentes.puc-campinas.edu.br/ceatec...hoFinal2008.htm e depois de ler artigos de lógica e tal,a única coisa que consegui fazer foi isso:

#include <iostream.h>

#include <windows.h>

void gotoxy(int lin, int col)

{

HANDLE hOut;

COORD Position;

hOut = GetStdHandle(STD_OUTPUT_HANDLE);

Position.X = col;

Position.Y = lin;

SetConsoleCursorPosition(hOut,Position);

}

void desenha_caixa()

{

cout<<flush;

gotoxy(0,0);

cout<<"Quebra-cabeca"<<flush

gotoxy(4,2);

cout<<"\332\304\304\304\302\304\304\304\302\304\304\304\277"<<flush;

gotoxy(5,2);

cout<<"\263 \263\ \263 \263"<<flush;

gotoxy(6,2);

cout<<"\303\304\304\304\305\304\304\304\305\304\304\304\264"<<flush;

gotoxy(7,2);

cout<<"\263\ \263\ \263\ \263"<<flush;

gotoxy(8,2);

cout<<"\303\304\304\304\305\304\304\304\305\304\304\304\264"<<flush;

gotoxy(9,2);

cout<<"\263\ \263\ \263\ \263"<<flush;

gotoxy(10,2);

cout<<"\300\304\304\304\301\304\304\304\301\304\304\304\331"<<flush;

}

void coloca_val(char mat[][3])

{

int i,j,c,l;

for ( i=1,l=5;i<4;i++,l+=2)

for (j=1,c=4;j<4;j++,c+=4)

gotoxy (l,c);

printf ("%c",mat[j]);

}

int verifica (char tentativa[][3],char objetivo[][3])

{

int i,j;

for (i=1;i<=3;i++)

for (j=1;j<=3;j++)

if (tentativa[j]!=objetivo[j])

return 0;

else

return 1;

}

void move (char tenta[][3])

{ char valor;

int i,j,c,l;

cout<<"Valor a ser movido:"<<flush;

valor= getch();

/*if valor=='1'

num=valor-49

else if valor=='2'

num=valor-50

else if valor=='3'

num=valor-51

else if valor=='4'

num=valor-52

else if valor=='5'

num=valor-53

else if valor=='6'

num=valor-54

else if valor=='7'

num=valor-55

else if valor=='8'

num=valor-56;

for ( i=1,l=5;i<4;i++,l+=2)

for (j=1,c=4;j<4;j++,c+=4)

if tenta[i-1][j-1]==0||tenta[i-3][j-3]==0||tenta[i+1][j+1]==0||tenta[i+3][j+3]==0*/

}

void main()

{

char certa[3][3]=

{

{1,2,3},

{4,5,6},

{7,8, }

};

char err[3][3]=

{

{4,1,3},

{7,2,5},

{ ,8,6}

};

printf ("Para sair digite S");

{

verifica (err,certa);

while 0

{

desenha_caixa();

coloca_val(err);

move(err);

}

}

}

uma vergonha,mas fazer o q?!Tem como alguém me dar umqa ajudinha??bj

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0
Guest --Guilherme --

bah!!

Tenho que fazer um desses também, mas não comecei ainda.

Estou pesquisando por enquanto e já vendo q vou encontrara dificuldades, hehe..

Se tiver alguma coisa para compartilhar??

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Como não entro aqui faz um tempo, só ví seu tópico hoje. Não sei se ainda está em tempo, espero que tenha conseguido resolver.

De qualquer modo, dei uma completada no código, estou com muito sono e está muito tardepara explicar os acrécimos, mas dei uma leve comentada no código.

#include <iostream>
  using std::cout;
#include <windows.h> 


// Não sei porque a próxima linha deu certo no Dev-C++, juro que não sei, descobri por acaso.
extern "C" { int getch(void); }

void gotoxy(int lin, int col)
{
  HANDLE hOut;
  COORD Position;
  hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  Position.X = col; 
  Position.Y = lin; 
  SetConsoleCursorPosition(hOut,Position);
}

void desenha_caixa()
{
  cout.flush();
  gotoxy(0,0);
  cout<<"Quebra-cabeca";cout.flush();
  gotoxy(4,2);
  cout<<"\332\304\304\304\302\304\304\304\302\304\304\304\277";cout.flush();
  gotoxy(5,2);
  cout<<"\263   \263   \263   \263";cout.flush();
  gotoxy(6,2);
  cout<<"\303\304\304\304\305\304\304\304\305\304\304\304\264";cout.flush();
  gotoxy(7,2);
  cout<<"\263   \263   \263   \263";cout.flush();
  gotoxy(8,2);
  cout<<"\303\304\304\304\305\304\304\304\305\304\304\304\264";cout.flush();
  gotoxy(9,2);
  cout<<"\263   \263   \263   \263";cout.flush();
  gotoxy(10,2);
  cout<<"\300\304\304\304\301\304\304\304\301\304\304\304\331";cout.flush();
}

void coloca_val(char mat[][3])
{
  for (int l = 0; l < 3; l++)
    for (int c = 0; c < 3; c++) {
      gotoxy (5+l*2,4+4*c);
      printf ("%c",mat[l][c]);
    }
}

int verifica (char tentativa[][3],char objetivo[][3])
{
  int i,j;
  for (i=0;i<3;i++)
    for (j=0;j<3;j++)
      if (tentativa[i][j]!=objetivo[i][j])
      return 0;

    return 1;
}

/* Função que procura a posição do numero requisitado na matriz, 
  retorna false se não encontrou, se encontrou copia os valores 
  para col e lin*/
bool procura_numero(char puzzle[][3], char val, int &col, int &lin)
{
  for (col = 0; col < 3; col++)
    for (lin = 0; lin < 3; lin++)
      if (puzzle[col][lin] == val)
        return true;

  return false;
}

bool move (char tenta[][3])
{
  char valor;
  int i,j,c,l,;

  gotoxy(11,1);
  cout<<"\nValor a ser movido:";cout.flush();
  valor = getch();
  if (valor == 's' || valor == 'S')          // 's' ou 'S' sai do programa.
    exit(0);
  if ((valor < '0') && (valor > '9'))        // Se a entrada for inválida não faz nada
    return 0;

  if (!(procura_numero(tenta, valor, c, l))) // Passa c e l por referência
    return false;

  if ((c < 2) && (tenta[c + 1][l] == ' ')) { // Checa se pode ir para frente.
    tenta[c + 1][l] = tenta[c][l];
    tenta[c][l] = ' ';
    return true;
  }

  if ((c > 0) && (tenta[c - 1][l] == ' ')) { // Checa se pode ir para trás.
    tenta[c - 1][l] = tenta[c][l];
    tenta[c][l] = ' ';
    return true;
  }

  if ((l > 0) && (tenta[c][l - 1] == ' ')) { // Checa se pode ir para cima.
    tenta[c][l - 1] = tenta[c][l];
    tenta[c][l] = ' ';
    return true;
  }

  if ((l < 2) && (tenta[c][l + 1] == ' ')) { // Checa se pode ir para baixo.
    tenta[c][l + 1] = tenta[c][l];
    tenta[c][l] = ' ';
    return true;
  }

  return false; // Se o movimento for inválido não faz nada.
}


int main()
{
  char certa[3][3]= { { '1', '2', '3' }, 
                      { '4', '5', '6' }, 
                      { '7', '8', ' ' } };  // Espaço para facilitar a saída

  char err[3][3]= { { '4', '1', '3' }, 
                    { '7', '2', '5' }, 
                    { '8', '6', ' ' } };    // ... O mesmo aqui

  printf ("Para sair digite S");

  while (!verifica (err,certa)) {
    desenha_caixa();
    coloca_val(err);
    move(err);
  }
  gotoxy(12,5);
  cout<<"Parabens!\n";cout.flush();

  return 0;
}
Detalhe: A linha extern "C" { int getch(void); } funcionou por mero acaso, estava criando uma versão de getch em Assembly porque o Dev-C++ não possui uma. Eu criei a função e exportei, mas esqueci de compilar com o arquivo objeto da função e funcionou :wacko: , daí descobri que não precisa dela. Não entendi... [EDITADO] De quaquer jeito, se você precisar de uma versão de getch, essa foi a que fiz:
int getch(void)
{
  char chkkbstatus[5] = {0xB4, 0x00, 0xCD, 0x16, 0xC3 },
      (*funcptr)(void) = reinterpret_cast<char(*)(void)>(reinterpret_cast<int>(chkkbstatus));
  return ((*funcptr)());
}

Dá erro na execução se compilado no Dev-C++, mas no DJGPP funciona bem.

Até mais!

Editado por == Douplus ==
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...