Jogo da Velha

Publicado por Hunz 01/09/2004

[ Hits: 14.563 ]

Homepage: http://tnegri.com/

Download velha.c




Famoso Jogo da Velha, bem simples.

  



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;
  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) {
  if (player==1) set=1;
  if (player==2) set=2;
  play:
  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;
  else {
    printf("A casa está em uso! Jogue Novamente..\n");
    sleep(2);
    limpa();
    jogo();
    goto play;
  }
}

void main() {
  limpa();
  jogo();
  play(1);
  check();
  if (win == 1 || win == 2) goto end;
  limpa();
  jogo();
  play(2);
  check();
  if (win == 1 || win == 2) goto end;
  limpa();
  jogo();
  play(1);
  check();
  if (win == 1 || win == 2) goto end;
  limpa();
  jogo();
  play(2);
  check();
  if (win == 1 || win == 2) goto end;
  limpa();
  jogo();
  play(1);
  check();
  if (win == 1 || win == 2) goto end;
  limpa();
  jogo();
  play(2);
  check();
  if (win == 1 || win == 2) goto end;
  limpa();
  jogo();
  play(1);
  check();
  if (win == 1 || win == 2) goto end;
  limpa();
  jogo();
  play(2);
  check();
  if (win == 1 || win == 2) goto end;
  limpa();
  jogo();
  play(1);
  check();
  if (win == 1 || win == 2) goto end;
  end:
  limpa();
  jogo();
  if (win == 1 || win == 2) printf("\nJogador %d venceu o jogo!\n",win);
  else printf("\nEmpate!\n");
}  

Scripts recomendados

Parte 5 - Sessão de estudo sobre VETORES

Pilha Sequencial

Conta Bit em C

2 Programinhas em C para conversão de bases

Meu primeiro programa em C (Olá mundo)


  

Comentários
[1] Comentário enviado por nowaki em 01/09/2004 - 16:38h

e com o "famoso" goto.....como um certo cara dizia, "quem usa goto vai para o inferno..."

[2] Comentário enviado por HunZ em 01/09/2004 - 16:49h

É meu primeiro script, não precisava ofender =/

Abraços,
Fiquem com Deus.

[3] Comentário enviado por jllucca em 02/09/2004 - 12:03h

Nao eh ofensa... Todo esses "goto" podem ser trocados por laço de repetiçao como o while ou repeat. Tambem ia falar mal da sua pratica(com goto). Mas, eh isso !

Goto pode ser usado?? Mas, eh claro que sim! Mas, os casos sao rarisimos e tem que ser usados com extremo cuidado!

[4] Comentário enviado por jllucca em 02/09/2004 - 12:06h

Opa, eu falei de repeat... foi mal tava programando em pascal ate agora pouco antes de ler seu codigo...

[5] Comentário enviado por HunZ em 02/09/2004 - 12:25h

Porque tem que se usar o goto com extremo cuidado? To iniciando, gostaria da sua ajuda..

Abraços,
Fiquem com Deus.

[6] Comentário enviado por HunZ em 02/09/2004 - 12:55h

Já arrumei todo o código, vou colocar ele aqui SEM "goto" agora..
Mas, porque o goto é tão perigoso?

Abraços,
Fiquem com Deus.

[7] Comentário enviado por jllucca em 02/09/2004 - 13:44h

Sugiro a leitura de um cara muito bom :)

Programando com uma gramada de mão : http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=1066

E o outro que fala dos goto é "Escrevendo o caos em C" : http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=1135

Ambos artigos considero otimos, talvez voce não entenda tudo deles. Mas, certamente vai entender do porque não utilizar goto como esta no segundo artigo.

[]'s

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

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


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts