Skip to content

Instantly share code, notes, and snippets.

@oxechicao
Last active September 30, 2018 16:27
Show Gist options
  • Select an option

  • Save oxechicao/d3cacc6949c367239ce35ef69fe2291c to your computer and use it in GitHub Desktop.

Select an option

Save oxechicao/d3cacc6949c367239ce35ef69fe2291c to your computer and use it in GitHub Desktop.
Uma brincadeira utilizada como exemplo em uma tutoria de introdução a programação a jovens que estão inciando nesse universo. A linguagem escolhida foi Java. :)
package com.company;
import java.util.Scanner;
public class Main {
// OBS: comentários em um código podem ser feitos com // (que comenta uma linha) ou usando o /* para abrir e o */ para fechar o escopo do comentário
public static void main (String[] args) {
int jogador = 1;
int linha, coluna;
Scanner leitor = new Scanner(System.in);
int quantidadeLinhasNoTabuleiro = 3;
int quantidadeColunasNoTabuleiro = 3;
int[][] jogo = inicializarJogo(quantidadeLinhasNoTabuleiro, quantidadeColunasNoTabuleiro);
imprimirTabuleiro(jogo);
System.out.println("O tabuleiro possue " + quantidadeLinhasNoTabuleiro + " linhas, e " + quantidadeColunasNoTabuleiro + " colunas.");
do {
System.out.println("Jogador " + jogador + " escolha a LINHA de 1 a " + quantidadeLinhasNoTabuleiro);
linha = leitor.nextInt();
System.out.println("Jogador " + jogador + " escolha a COLUNA de 1 a " + quantidadeColunasNoTabuleiro);
coluna = leitor.nextInt();
/*
Um bom método de deixar um código fácil de ler é usar de uma técnica chamada FAILS FIRST (primeiro o erro).
Que significa que o condicional deve sempre tratar daquilo que não queremos primeiro.
Nesse caso, queremos números dentro que caibam no nosso tabuleiro, a exemplo, entre 1 e 3.
Então, vamos procurar dizer que é errado qualquer número fora das opções.
*/
if (linha < 1 || linha > quantidadeLinhasNoTabuleiro || coluna < 1 || coluna > quantidadeColunasNoTabuleiro) {
System.out.println("Jogador " + jogador + " escolha novamente um número válido. Seu troll.");
continue; // Lembrem-se do continue e do break; Continue faz o laço (loop) passar para próxima interação, não executando as linhas abaixo do continue. O break interrompe o laço e sai fora (vlw flw)
}
/*
Estamos aceitando númeor de 1 a 3.
Mas, lembrem-se que no array (matriz, lista) o primeiro ponto que podemos inserir um dado é no 0.
Então, precisamos tratar do dado inserido reduzindo em 1 (decrementando) para que corresponda com o nosso tabuleiro
*/
linha--;
coluna--;
/*
Agora vamos verificar se alguém já jogoou na opção escolhida;
*/
if (jogo[linha][coluna] != 0) {
System.out.println("Deixe de sacanagem! Alguém já jogou aí, escolha um local onde ninguém tenha jogado.");
continue;
}
jogo[linha][coluna] = jogador;
/*
Aqui usaremos um condicional em uma linha usando o ?
É uma maneira mais bonita de fazer o if else, quando a condição eo resultado são pequenos.
Assim se o jogodor é igual a 1, o jogador vai receber 2. Quando o jogador for igual a 2, o jogador vai receber 1. Trocando assim os jogadores.
*/
jogador = jogador == 1 ? 2 : 1;
imprimirTabuleiro(jogo);
} while (verificarSeOJogoContinua(jogo));
System.out.println("O JOGO SE ACABOOOU-SE.");
}
private static boolean verificarSeOJogoContinua (int[][] jogo) {
/*
Aqui mudei o nome da função para fazer sentido o condicional.
O laço do {} while() vai continuar se o jogo ainda não estiver acabado.
Então, devemos verificar as possibilidades do jogo acabar.
Retonaremos falso (false) quando o jogo acabar, indicando que o jogo não deve continuer.
Logo, retornaremos verdadeiro (true) enquanto o jogo não tiver vencedor.
Lembrando que nosso jogo(3x3), no plano casteriano significa o seguinte.
|
| (0, 2) (1, 2) (2, 2)
| (0, 1) (1, 1) (2, 1)
| (0, 0) (1, 0) (2, 0)
Y +---------------------------
(X, Y) X
[Y][X] na matriz do tabuleiro
Onde, nesse caso,
O X representa a coluna e
o Y representa a linha.
*/
int diagonal1 = 1, diagonal2 = 1; // Elemento neutro da multiplicação é o 1. Exemplo de incializar várias variáveis em uma mesma linha para um mesmo tipo
diagonal1 = diagonal1 * jogo[0][0] * jogo[1][1] * jogo[2][2];
diagonal2 = diagonal2 * jogo[0][2] * jogo[1][1] * jogo[2][0];
if (diagonal1 == 1 || diagonal2 == 1) {
System.out.println("Jogador 1 venceu na diagonal");
return false;
} else if (diagonal1 == 8 || diagonal2 == 8) {
System.out.println("Jogando 2 venceu na diagonal");
return false;
}
for (int variavelTrava = 0; variavelTrava < jogo.length; variavelTrava++) {
int vitoriaEmLinha = 1; // Elemento neutro da multiplicação é o 1
int vitoriaEmColuna = 1; // Elemento neutro da multiplicação é o 1
/*
Vamos andar na nossa matriz utilizando o laço abaixo.
Em um primeiro laço da variávelTrava = 0 acontecerá assim:
Para verificar a linha (0, X):
jogo[0][0] depois jogo[0][1] e depois jogo[0][2]
Para verificar a coluna (Y, 0):
jogo[0][0] depois jogo[1][0] e depois jogo[2][0]
*/
for (int variavelMovel = 0; variavelMovel < jogo[0].length; variavelMovel++) {
/*
Lembrem-se da lógica nesse cado. Vamos travar uma linha e depois uma coluna.
A nossa variável que irá servir para travar será a variavelTrava e a que irá pecorrer será a variavelMovel.
*/
vitoriaEmLinha = vitoriaEmLinha * jogo[variavelTrava][variavelMovel];
vitoriaEmColuna = vitoriaEmColuna * jogo[variavelMovel][variavelTrava];
}
/*
Agora verificamos quem ganhou, se ganhou retornaremos false, para que a condição do laço while não seja verdadeira e saia do loop.
*/
if (vitoriaEmLinha == 1) {
/*
Devemos somar mais 1 pelo menos motivo que subtraimos anteriormente.
Para o usuário, não faz muito sentido linha 0 e coluna 0.
Então fazemos uma mágina para que o usuário não se procupe. "O cliente em primeiro lugar" ou quase isso :D
Nota-se que não usaremos variavelTrava++, porque essa expressão significa variavelTrava = variavelTrava + 1;
E nós não queremos alterar o valor da variavelTrava aqui, isso acontece já na iteração do laço FOR
*/
System.out.println("Jogador 1 ganhou na linha " + (variavelTrava + 1));
return false;
} else if (vitoriaEmLinha == 8) {
System.out.println("Jogador 2 ganhou na linha " + (variavelTrava + 1));
return false;
} else if (vitoriaEmColuna == 1) {
System.out.println("Jogador 1 ganhou na coluna " + (variavelTrava + 1));
return false;
} else if (vitoriaEmColuna == 8) {
System.out.println("Jogador 2 ganhou na coluna " + (variavelTrava + 1));
return false;
}
}
return true; // O JOGO CONTINUA
}
private static void imprimirTabuleiro (int[][] jogo) {
/*
jogo.length é uma função que as listas/matrizes (arrays) possuem.
Ela retorna o tamanho, ou a quantidade de espaços, que podemos usar no array
*/
for (int x = 0; x < jogo.length; x++) {
/*
jogo[0].length é a forma que podemos utilizar para saber o tamanho do nosso segundo nível na matriz.
Assim deixamos nossa função de imprimir genérica, independente do tamanho do nosso tabuleiro.
*/
for (int y = 0; y < jogo[0].length; y++) {
System.out.printf(" %d ", jogo[x][y]);
}
System.out.printf("%n");
}
}
private static int[][] inicializarJogo (int numLinhas, int numColunas) {
int[][] novoJogo = new int[numLinhas][numColunas];
for (int x = 0; x < numColunas; x++) {
for (int y = 0; y < numLinhas; y++) {
novoJogo[y][x] = 0;
}
}
return novoJogo;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment