Jogo da Velha (corrigido)

Publicado por Hunz 02/09/2004

[ Hits: 20.051 ]

Homepage: http://tnegri.com/

Download velha.c




O velha.c corrigido..
* Sem o uso de "goto" agora.. :)
* Com o uso do "for" para economizar várias linhas de código repetitivo :)
* Adicionei uma função que mostra se um número é divisivel por outro (retirada de um script aqui no site do VOL). Função usada para determinar de quem é a vez de jogar.

Abraços,
Fiquem com Deus;

  



Esconder código-fonte

/* *****************************************
  AUTOR: Thiago ( hunz )
  EMAIL / MSN: tn_negri@hotmail.com
  ESPAÇO VOL: www.vivaolinux.com.br/~hunz
***************************************** */

#include <stdio.h>
#include <stdlib.h>

char set;
int linha=0,coluna=0,win,casa[3][3];

void draw(int x, int y) {
  if (casa[x][y] == '{FONTE}') printf(" ");
  if (casa[x][y] == 1) printf("X");
  if (casa[x][y] == 2) printf("O");
}

void limpa() {
  printf("\e[H\e[2J");
}

void jogo() {
  printf("  1   2   3\n");
  printf("1 ");
  draw(0,0);
  printf(" | ");
  draw(0,1);
  printf(" | ");
  draw(0,2);
  printf("\n ---+---+---\n2 ");
  draw(1,0);
  printf(" | ");
  draw(1,1);
  printf(" | ");
  draw(1,2);
  printf("\n ---+---+---\n3 ");
  draw(2,0);
  printf(" | ");
  draw(2,1);
  printf(" | ");
  draw(2,2);
}

void check() {
  int i=0;
  for (i=0;i<3;i++) { /* Horizontal */
    if (casa[i][0] == casa[i][1] && casa[i][0] == casa[i][2]) {
      if (casa[i][0] == 1) win=1;
      if (casa[i][0] == 2) win=2;
    }
  }
  for (i=0;i<3;i++) { /* Vertical */
    if (casa[0][i] == casa[1][i] && casa[0][i] == casa[2][i]) {
      if (casa[0][i] == 1) win=1;
      if (casa[0][i] == 2) win=2;
    }
  }
  if (casa[0][0] == casa[1][1] && casa[0][0] == casa[2][2]) { /* Diagonal Cima->Baixo*/
    if (casa[0][0] == 1) win=1;
    if (casa[0][0] == 2) win=2;
  }
  if (casa[0][2] == casa[1][1] && casa[0][2] == casa[2][0]) { /* Diagonal Baixo->Cima */
    if (casa[0][2] == 1) win=1;
    if (casa[0][2] == 2) win=2;
  }
}

void play(int player) {
  int i=0;
  if (player==1) set=1;
  if (player==2) set=2;
  play:
  while (i==0) {
    linha=0;
    coluna=0;
    while (linha<1 || linha>3) {
      printf("\nJogador %d. Escolha a Linha (1,2,3): ",set);
      scanf("%d",&linha);
      getchar();
    }
    while (coluna<1 || coluna>3) {
      printf("\nJogador %d. Escolha a Coluna (1,2,3): ",set);
      scanf("%d",&coluna);
      getchar();
    }
    linha--;
    coluna--;
    if (casa[linha][coluna] != 1 && casa[linha][coluna] != 2) {
      casa[linha][coluna]=set;
      i=1;
    }
    else {
      printf("A casa está em uso! Jogue Novamente..\n");
      sleep(2);
      limpa();
      jogo();
    }
  }
}

char divi(int a, int b) {
  return (!(a%b));
}

void main() {
  int i=0;
  for (i=0;i<9;i++) {
    limpa();
    jogo();
    if(!divi(i,2)) play(2);
    else play(1);
    check();
    if (win == 1 || win == 2) i=10;
  }
  limpa();
  jogo();
  if (win == 1 || win == 2) printf("\nJogador %d venceu o jogo!\n",win);
  else printf("\nEmpate!\n");
}  

Scripts recomendados

Texto colorido em C para Linux

Ordenação de vetor pelo método Bubblesort

Calculadora simples em C

Gerador de tabuada 1.0

Raiz quadrada aproximada


  

Comentários
[1] Comentário enviado por jllucca em 02/09/2004 - 13:49h

Opa,

apenas para titulo de complemento. A função:

char divi(int a, int b) {
return (!(a%b));
}

Poderia ser substituida pela "fmod"(da math.h). Assim, chamariamos a função do mesmo modo.

Sobre a parte retirada seria bom se tu deixase uns comentarios retirado do site tal, feito por fulano. Citar o autor, seja qual for, é excelente e dá credibilidade pra pessoa.

[]'s

[2] Comentário enviado por HunZ em 03/09/2004 - 13:07h

Não conhecia essa função, valew pela dica :)
Desculpa não ter citado o autor do script, eu esqueci mesmo, desculpe..

Aqui está o script da função "divi" que eu usei:
http://www.vivaolinux.com.br/scripts/verScript.php?codigo=325

Abraços,
Fiquem com Deus.

[3] Comentário enviado por celito.junior em 29/11/2004 - 13:11h

Ei kra, blz??

O que significa o codigo :

--------------------------
printf("\e[H\e[2J");
--------------------------

que esta no teu script ??

Acho que nao funcionou no meu compilador porque ele apenas escreveu
[H[2J
na tela.
Se vc puder me ajudar seria de muito util.
Flw.

[4] Comentário enviado por hunz em 29/11/2004 - 13:15h

Esse código é usado para limpar a tela, como o system("clear");
Se você preferir, pode substituir essa linha por:
system("clear");

Abraços,
Fiquem com Deus.

[5] Comentário enviado por jochan em 14/12/2005 - 14:36h

Muito legal, vai me ajudar bastente no meu projeto de C++ ... =)

[6] Comentário enviado por zicoico em 06/10/2007 - 03:30h

--------------------------
printf("\e[H\e[2J");
--------------------------
É uma sequências escape ANSI para limpar o ecrã e tanto pode funcionar em Linux como em Windows.

Alguns links relacionados:
http://support.microsoft.com/kb/67195/pt
http://br.geocities.com/conexaopcpc/dos_help/ansi_sys.htm

Cumprimentos,
Zico

[7] Comentário enviado por LucianoAlexandre em 14/03/2012 - 14:09h

para que serve a função "fmod"(da math.h).


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts