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