diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..38a0523 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +jogo-do-oito-do-estagiario-gpt \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0080b5a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..24b10e5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/jogo-oito/src/main/java/chat/gpt/JogoDosOito.java b/jogo-oito/src/main/java/chat/gpt/JogoDosOito.java index e51dd08..86f3586 100644 --- a/jogo-oito/src/main/java/chat/gpt/JogoDosOito.java +++ b/jogo-oito/src/main/java/chat/gpt/JogoDosOito.java @@ -1,158 +1,16 @@ package chat.gpt; -import java.awt.Font; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JOptionPane; - -public class JogoDosOito extends JFrame implements KeyListener { - - private int[][] tabuleiro = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 0 } }; - private JButton[][] botoes = new JButton[3][3]; - private JButton botaoReiniciar; - - public JogoDosOito() { - super("Jogo dos Oito"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setSize(300, 300); - setLayout(new GridLayout(4, 3)); - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - JButton botao = new JButton(); - botao.setFont(new Font("Arial", Font.BOLD, 36)); - botoes[i][j] = botao; - add(botao); - } - } - - botaoReiniciar = new JButton("Reiniciar"); - botaoReiniciar.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - reiniciarJogo(); - } - }); - add(new JLabel("")); - add(botaoReiniciar); - add(new JLabel("")); - - addKeyListener(this); - setFocusable(true); - atualizarTabuleiro(); - setVisible(true); - } - - public void keyPressed(KeyEvent e) { - int keyCode = e.getKeyCode(); - switch (keyCode) { - case KeyEvent.VK_UP: - mover(1, 0); - break; - case KeyEvent.VK_DOWN: - mover(-1, 0); - break; - case KeyEvent.VK_LEFT: - mover(0, 1); - break; - case KeyEvent.VK_RIGHT: - mover(0, -1); - break; - } - } - - public void keyTyped(KeyEvent e) { - } - - public void keyReleased(KeyEvent e) { - } - - private void mover(int linha, int coluna) { - int linhaVazia = -1; - int colunaVazia = -1; - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - if (tabuleiro[i][j] == 0) { - linhaVazia = i; - colunaVazia = j; - } - } - } - int novaLinha = linhaVazia + linha; - int novaColuna = colunaVazia + coluna; - if (novaLinha < 0 || novaLinha > 2 || novaColuna < 0 || novaColuna > 2) { - // movimento inválido - return; - } - tabuleiro[linhaVazia][colunaVazia] = tabuleiro[novaLinha][novaColuna]; - tabuleiro[novaLinha][novaColuna] = 0; - atualizarTabuleiro(); - if (jogoConcluido()) { - JOptionPane.showMessageDialog(this, "Parabéns, você venceu!"); - reiniciarJogo(); - } - } - - public static void main(String[] args) { - new JogoDosOito(); - } - - private boolean jogoConcluido() { - int count = 1; - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - if (tabuleiro[i][j] != count % 9) { - return false; - } - count++; - } - } - return true; - } - - private boolean movimentarPeca(int linha, int coluna) { - if (linha > 0 && tabuleiro[linha - 1][coluna] == 0) { - tabuleiro[linha - 1][coluna] = tabuleiro[linha][coluna]; - tabuleiro[linha][coluna] = 0; - return true; - } else if (linha < 2 && tabuleiro[linha + 1][coluna] == 0) { - tabuleiro[linha + 1][coluna] = tabuleiro[linha][coluna]; - tabuleiro[linha][coluna] = 0; - return true; - } else if (coluna > 0 && tabuleiro[linha][coluna - 1] == 0) { - tabuleiro[linha][coluna - 1] = tabuleiro[linha][coluna]; - tabuleiro[linha][coluna] = 0; - return true; - } else if (coluna < 2 && tabuleiro[linha][coluna + 1] == 0) { - tabuleiro[linha][coluna + 1] = tabuleiro[linha][coluna]; - tabuleiro[linha][coluna] = 0; - return true; - } - return false; - } - - private void atualizarTabuleiro() { - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - JButton botao = botoes[i][j]; - int valor = tabuleiro[i][j]; - if (valor == 0) { - botao.setText(""); - } else { - botao.setText(String.valueOf(valor)); - } - } - } - } - - private void reiniciarJogo() { - tabuleiro = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 0 } }; - atualizarTabuleiro(); - } -} +import chat.gpt.controller.GameController; +import chat.gpt.model.GameModel; +import chat.gpt.view.GameView; + +public class JogoDosOito { + public static void main(String[] args) { + // Cria instancia do GameView + GameView view = new GameView(); + // Cria instancia do GameModel e passa view como parametro + GameModel model = new GameModel(view); + // Cria instancia do GameController passando model e view como parametro + GameController controller = new GameController(model, view); + } +} \ No newline at end of file diff --git a/jogo-oito/src/main/java/chat/gpt/controller/GameController.java b/jogo-oito/src/main/java/chat/gpt/controller/GameController.java new file mode 100644 index 0000000..5d27274 --- /dev/null +++ b/jogo-oito/src/main/java/chat/gpt/controller/GameController.java @@ -0,0 +1,131 @@ +package chat.gpt.controller; + +import java.awt.event.*; +import javax.swing.*; + +import chat.gpt.model.GameModel; +import chat.gpt.view.GameView; + +public class GameController implements KeyListener, ActionListener, MouseListener { + + private GameModel model; + private GameView view; + + // Construtor responsável por iniciar e configurar o controller do jogo + public GameController(GameModel model, GameView view) { + this.model = model; + this.view = view; + + // Adiciona ouvinte de eventos do teclado + this.view.addKeyListener(this); + // Adiciona view do botão de reiniciar e o metodo adiciona o proprio controlador como ouvinte + this.view.getBotaoReiniciar().addActionListener(this); + + // Captura eventos do mouse nos botões individuais e responda + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + JButton button = this.view.getBotoes(i, j); + button.addMouseListener(this); + } + } + + // Atualiza a exibição do jogo + this.atualizarView(); + } + + // Metodo que lida com ações de click reiniciando + @Override + public void actionPerformed(ActionEvent e) { + // Chama o metodo reiniciar quando clicado + this.model.reiniciar(); + // Atualiza a interface após clicado + this.atualizarView(); + } + + // Metodo que é chamado quando as teclas (Setas) do teclado é pressionada + @Override + public void keyPressed(KeyEvent e) { + int keyCode = e.getKeyCode(); + + switch (keyCode) { + // Case obtém a tecla pressionada + case KeyEvent.VK_UP: + // Com base na tecla pressionada realiza a ação de mover, do metodo mover + this.model.mover(1, 0); + break; + case KeyEvent.VK_DOWN: + this.model.mover(-1, 0); + break; + case KeyEvent.VK_LEFT: + this.model.mover(0, 1); + break; + case KeyEvent.VK_RIGHT: + this.model.mover(0, -1); + break; + } + this.atualizarView(); + } + + + @Override + public void keyTyped(KeyEvent e) { + // Sem ações + } + + @Override + public void keyReleased(KeyEvent e) { + // Sem ações + } + + // Atualiza a exibição do jogo + private void atualizarView() { + // Recebe matriz do jogo atual + int[][] tabuleiro = model.getTabuleiro(); + // Chamada do metodo para atualizar o tabuleiro + view.atualizarTabuleiro(tabuleiro); + // repaint redesenha a tela e exibe as atualizações feitas + view.repaint(); + } + + // Acionado quando um botão do mouse é clicado + @Override + public void mouseClicked(MouseEvent e) { + // Armazena o botao cliclado na variavel botaoClicado + JButton botaoClicado = (JButton) e.getSource(); + int linha = -1; + int coluna = -1; + // Encontra a linha e a coluna do botão clicado + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (this.view.getBotoes(i, j) == botaoClicado) { + linha = i; + coluna = j; + } + } + } + // Move o número para o quadrado vazio + this.model.mover(linha - this.model.getLinhaVazia(), coluna - this.model.getColunaVazia()); + // Atualiza a exibição do jogo + this.atualizarView(); + } + + @Override + public void mousePressed(MouseEvent e) { + // Sem ações + } + + @Override + public void mouseReleased(MouseEvent e) { + // Sem ações + } + + @Override + public void mouseEntered(MouseEvent e) { + // Sem ações + } + + @Override + public void mouseExited(MouseEvent e) { + // Sem ações + } +} diff --git a/jogo-oito/src/main/java/chat/gpt/model/GameModel.java b/jogo-oito/src/main/java/chat/gpt/model/GameModel.java new file mode 100644 index 0000000..19f7130 --- /dev/null +++ b/jogo-oito/src/main/java/chat/gpt/model/GameModel.java @@ -0,0 +1,140 @@ +package chat.gpt.model; + +import javax.swing.*; + +import chat.gpt.view.GameView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class GameModel { + GameView view; + + private int[][] tabuleiro; + + public int[][] getTabuleiro() { + return tabuleiro; + } + + public GameModel(GameView view) { + this.view = view; + List numeros = new ArrayList<>(); + for (int i = 1; i < 9; i++) { // Começa pelo 1 e exclui o 0 + numeros.add(i); + } + Collections.shuffle(numeros); // Embaralhando os elementos + numeros.add(0); // Adiciona o 0 ao final + + // Preenche o tabuleiro + this.tabuleiro = new int[][]{{numeros.get(0), numeros.get(1), numeros.get(2)}, + {numeros.get(3), numeros.get(4), numeros.get(5)}, + {numeros.get(6), numeros.get(7), numeros.get(8)}}; + } + + // Metodo responsável por realizar as jogadas + public void mover(int linha, int coluna) { + int linhaVazia = -1; + int colunaVazia = -1; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (tabuleiro[i][j] == 0) { + linhaVazia = i; + colunaVazia = j; + } + } + } + + int novaLinha = linhaVazia + linha; + int novaColuna = colunaVazia + coluna; + if (novaLinha < 0 || novaLinha > 2 || novaColuna < 0 || novaColuna > 2) { + // movimento inválido + return; + } + + // Verifica se o número está adjacente ao quadrado vazio + int linhaMovida = linhaVazia + linha; + int colunaMovida = colunaVazia + coluna; + + if (linhaMovida != linhaVazia && colunaMovida != colunaVazia) { + // movimento inválido (em diagonal) + return; + } + + // Realiza a troca de duas peças no tabuleiro + tabuleiro[linhaVazia][colunaVazia] = tabuleiro[novaLinha][novaColuna]; + // Atribui o valor 0 à posição da peça que foi movida + tabuleiro[novaLinha][novaColuna] = 0; + + // Atualiza a vizualização do tabuleiro + view.atualizarTabuleiro(tabuleiro); + + // Depois de verificado se as peças estão ordenadas o if abaixo é chamado + if (jogoConcluidoComSucesso()) { + JOptionPane.showMessageDialog(this.view, "Parabéns, você venceu!"); + reiniciar(); + } + } + + // Verificando se foi concluido + private boolean jogoConcluidoComSucesso() { + + int count = 1; + // Percorre o tabuleiro do jogo e compara cada elemento com uma sequencia de 1 a 9 + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + // % 9 garante que o valor de count sempre sera um numero entre 1 e 9 + if (tabuleiro[i][j] != count % 9) { + return false; + } + count++; + } + } + return true; + } + + // Reinicia o jogo embaralhando as peças + public void reiniciar() { + List numeros = new ArrayList<>(); + + // insere os numeros de 1 a 8 a lista numeros criada acima + for (int i = 1; i < 9; i++) { + numeros.add(i); + } + + Collections.shuffle(numeros); // Embaralha as peças + numeros.add(0); // Adiciona 0 ao final + + // Atualiza a matriz com as novas informações + this.tabuleiro = new int[][]{ + {numeros.get(0), numeros.get(1), numeros.get(2)}, + {numeros.get(3), numeros.get(4), numeros.get(5)}, + {numeros.get(6), numeros.get(7), numeros.get(8)} + }; + } + + // os dois metodos abaixo sao responsaveis por envontrar as posições vazias + public int getLinhaVazia() { + // Percorre o tabuleiro para encontrar a posição onde está o 0 + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (tabuleiro[i][j] == 0) { + return i; + } + } + } + // Caso não houver posição vazia no tabuleiro retornara -1 para indicar a ausencia + return -1; + } + + public int getColunaVazia() { + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (tabuleiro[i][j] == 0) { + return j; + } + } + } + return -1; + } +} diff --git a/jogo-oito/src/main/java/chat/gpt/view/GameView.java b/jogo-oito/src/main/java/chat/gpt/view/GameView.java new file mode 100644 index 0000000..143a4e4 --- /dev/null +++ b/jogo-oito/src/main/java/chat/gpt/view/GameView.java @@ -0,0 +1,101 @@ +package chat.gpt.view; + +import java.awt.*; +import java.awt.event.KeyListener; +import javax.swing.*; + +public class GameView extends JFrame { + + private int[][] tabuleiro = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 0 } }; + private JButton[][] botoes = new JButton[3][3]; + private final JButton botaoReiniciar; + + // Cria e configura a interface gráfica do jogo + public GameView() { + // Insere o titulo na view + super("Jogo dos Oito"); + // Define o comportamento ai fechar a janela + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + // Define o tamanho da view + setSize(300, 350); + + // Cria painel que organiza os componentes nas 5 regioes (norte, sul, leste, oeste e centro) + JPanel panel = new JPanel(new BorderLayout()); + + // Cria o layout com os botoes 3x3 + JPanel botoesPanel = new JPanel(new GridLayout(3, 3)); + + // Cria as configurações dos botões individualmente + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + JButton botao = new JButton(); + // Configurações da fonte + botao.setFont(new Font("Consolas", Font.PLAIN, 20)); + botoes[i][j] = botao; + // Adiciona o botao no painel depois de configurados. + botoesPanel.add(botao); + } + } + + // Adiciona todos os botões criados ao centro do painel + panel.add(botoesPanel, BorderLayout.CENTER); + + // Cria botao reiniciar e define que sera apresentado com letras maiusculas + botaoReiniciar = new JButton("Reiniciar".toUpperCase()); + // Configurações da fonte (Tipo, estilo e tamanho) + botaoReiniciar.setFont(new Font("Comic Sans", Font.BOLD, 20)); + // Define o tamanho do botão + botaoReiniciar.setPreferredSize(new Dimension(botaoReiniciar.getPreferredSize().width * 2, botaoReiniciar.getPreferredSize().height * 2)); + // Adiciona o botãi reinciar ao Sul da view + panel.add(botaoReiniciar, BorderLayout.SOUTH); + + // Define o painel principal + setContentPane(panel); + // Desabilita o redimensionamento de tela + setResizable(false); + // Centraliza a view no centro da tela + setLocationRelativeTo(null); + // Torna a janela vizivel + setVisible(true); + } + + // Atualiza a exibição do tabuleiro + public void atualizarTabuleiro(int[][] tabuleiro) { + this.tabuleiro = tabuleiro; + + int count = 0; + // Percorre a matriz. Para cada posição o texto no botão é definido como o valor da posição na matriz + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + // faz a inserção do valor no botão "Atualizando" + botoes[i][j].setText(String.valueOf(tabuleiro[i][j])); + + // Se o valor no botão for == 0 recebe um string em branco "" + if (tabuleiro[i][j] == 0) { + botoes[i][j].setText(""); + } + } + } + } + + // Ouvinte do teclado tanto para a janela principal do jogo quanto para cada um dos botões individuais + public void addKeyListener(KeyListener listener) { + super.addKeyListener(listener); + // adiciona o ouvinte de eventos de teclado a cada botão individual na matriz + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + botoes[i][j].addKeyListener(listener); + } + } + } + + // Getter reponsavel por retornar o botão de reiniciar + public JButton getBotaoReiniciar() { + return botaoReiniciar; + } + + // Getter reponsavel por retornar o botao localizado na posiçãp [i, j] da matriz botoes + public JButton getBotoes(int i, int j) { + return botoes[i][j]; + } +} diff --git a/senior-developer-challenge.iml b/senior-developer-challenge.iml new file mode 100644 index 0000000..d032c51 --- /dev/null +++ b/senior-developer-challenge.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file