Pular para o conteúdo

Jogo da Velha

Famoso Jogo da Velha, bem simples.
Hunz HunZ
Hits: 14.972 Categoria: C/C++ Subcategoria: Introdução
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

Famoso Jogo da Velha, bem simples.
Download velha.c Enviar nova versão

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] == '\0') 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");
}  

Encontrando letras em frases

Busca e ordenação de números

Funções de comparação de String

Tabuada em C

Escrevendo um arquivo Unicode em C#

#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.
#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

Entre na sua conta para comentar.