Segue um joguinho da velha simples (não foi tão simples assim pra mim kkk ), esse exercício requisitou bastante do que aprendi até agora da linguagem, sinto-me orgulhoso

package aulas_poo;

import java.awt.Color;
import java.util.Scanner;
import javax.swing.*;

class Jogo_Da_Velha {
  static Scanner input;
  static char [][] tabuleiro;
  static int jogada = 0, fila, coluna;
  static boolean vencedor = false, linhaValida, colunaValida;



  public static void infoGame(){
    System.out.println("JOGO DA VELHA:\n\n- Tabuleiro 3 X 3\n- 2 jogadores\n- Primeiro o X\n- Segundo o O");
  }

  public static void inicializandoTabuleiro(){
    for(int i = 0; i < tabuleiro.length; i++){
      for(int j = 0; j < tabuleiro[i].length; j++){
        tabuleiro[i][j] = ' ';
      }
    }
  }
  
  public static void mostrandoTabuleiro(){
    System.out.println("_"+tabuleiro[0][0]+"_|_"+tabuleiro[0][1]+"_|_"+tabuleiro[0][2]+"_");
    System.out.println("_"+tabuleiro[1][0]+"_|_"+tabuleiro[1][1]+"_|_"+tabuleiro[1][2]+"_");
    System.out.println(" "+tabuleiro[2][0]+" | "+tabuleiro[2][1]+" | "+tabuleiro[2][2]+" ");
  }

  public static void recebendoValores(){
    System.out.print("\nInforme a fila (1, 2 ou 3): ");
        fila = input.nextInt();
    System.out.print("Informe a coluna (1, 2 ou 3): ");
        coluna = input.nextInt();
  }

  public static boolean validarFila(int fil){
    if(fil >= 1 && fil <= 3){
      linhaValida = true;
    }else{
      linhaValida = false;
    
    }
    return linhaValida;
  }

  public static boolean validarColuna(int col){
    if(col >= 1 && col <= 3){
      colunaValida = true;
    }else{
      colunaValida = false;
    
    }
    return colunaValida;
  }

  public static boolean validarDesocupada(int fil, int col){
    if(tabuleiro[fil-1][col-1] == ' '){
      return true;
    }else{
      return false;

    }
  }
  
  public static boolean validarOcupada(int fil, int col){
    if(tabuleiro[fil-1][col-1] == 'X' || tabuleiro[fil-1][col-1] == 'O'){
      return false;
    }else{
      return true;

    }
  }



  public static void efetuarJogada(){
    
    int player = jogada;

    if(validarFila(fila)&&validarColuna(coluna)&&validarDesocupada(fila, coluna)&&validarOcupada(fila, coluna)){
  
    if(player % 2 == 0){
      jogada++;
      tabuleiro[fila-1][coluna-1] = 'X';
    }else{
      jogada++;
      tabuleiro[fila-1][coluna-1] = 'O';
    }

  }else{
      System.out.print("\nEndereço inválido ou  posição já ocupada...\n\n");
  }
  
  }

  

  public static void testarVencedor(){


      if(
         tabuleiro[0][0] == 'X' && tabuleiro[0][1] == 'X' && tabuleiro[0][2] == 'X'
      || tabuleiro[1][0] == 'X' && tabuleiro[1][1] == 'X' && tabuleiro[1][2] == 'X'
      || tabuleiro[2][0] == 'X' && tabuleiro[2][1] == 'X' && tabuleiro[2][2] == 'X'
      || tabuleiro[0][0] == 'X' && tabuleiro[1][0] == 'X' && tabuleiro[2][0] == 'X'
      || tabuleiro[0][1] == 'X' && tabuleiro[1][1] == 'X' && tabuleiro[2][1] == 'X'
      || tabuleiro[0][2] == 'X' && tabuleiro[1][2] == 'X' && tabuleiro[2][2] == 'X'
      || tabuleiro[0][0] == 'X' && tabuleiro[1][1] == 'X' && tabuleiro[2][2] == 'X'
      || tabuleiro[2][0] == 'X' && tabuleiro[1][1] == 'X' && tabuleiro[0][2] == 'X'
      ){
          JOptionPane.showMessageDialog(null, "☻ Vitória do jogador X  ");
          vencedor = true;

        
      }else if(
         tabuleiro[0][0] == 'O' && tabuleiro[0][1] == 'O' && tabuleiro[0][2] == 'O'
      || tabuleiro[1][0] == 'O' && tabuleiro[1][1] == 'O' && tabuleiro[1][2] == 'O'
      || tabuleiro[2][0] == 'O' && tabuleiro[2][1] == 'O' && tabuleiro[2][2] == 'O'
      || tabuleiro[0][0] == 'O' && tabuleiro[1][0] == 'O' && tabuleiro[2][0] == 'O'
      || tabuleiro[0][1] == 'O' && tabuleiro[1][1] == 'O' && tabuleiro[2][1] == 'O'
      || tabuleiro[0][2] == 'O' && tabuleiro[1][2] == 'O' && tabuleiro[2][2] == 'O'
      || tabuleiro[0][0] == 'O' && tabuleiro[1][1] == 'O' && tabuleiro[2][2] == 'O'
      || tabuleiro[2][0] == 'O' && tabuleiro[1][1] == 'O' && tabuleiro[0][2] == 'O'
      ){
          JOptionPane.showMessageDialog(null, " ☻ Vitória do jogador O ");
          vencedor = true;
          
      }else if(jogada == 9){
          JOptionPane.showMessageDialog(null, "Opa, temos um empate ☺");
          vencedor = true;
      }

      
    
    
  }
  

 
  public static void main(String[] args) {
  input = new Scanner (System.in);
  tabuleiro = new char [3][3];
  

     infoGame();
     inicializandoTabuleiro();
     System.out.print("\n");
     while(vencedor == false){
     mostrandoTabuleiro();
     recebendoValores();
        
     System.out.println("");
   
     efetuarJogada();
     testarVencedor();

    }

    System.out.println("\nResultado: ");
    mostrandoTabuleiro();



  }
}
2 curtidas

Show mano, ficou top.

Criei um baseado no seu.

class JogoDaVelha {
    private static String simbolo;
    private static Grid grid = new Grid();

    public static void main(String[] args) {
        mudarSimbolo();
    }

    public static String getSimbolo()
    {
        return simbolo;
    }

    public static void mudarSimbolo()
    {
        if(verificarVitoria())
        {
            grid.desabilitarBotoes();
            grid.popUp("☻ Vitória do " + simbolo);

            return;
        }

        if(verificarVelha())
        {
            grid.popUp("Opa, deu velha ☺");

            return;
        }

        if (simbolo == "X")
        {
            simbolo = "O";
        }
        else
        {
            simbolo = "X";
        }
    }

    private static boolean verificarVitoriaNasLinhas()
    {
        if (grid.getValorBotao(0) == simbolo && grid.getValorBotao(1) == simbolo && grid.getValorBotao(2) == simbolo)
        {
            return true;
        }

        if (grid.getValorBotao(3) == simbolo && grid.getValorBotao(4) == simbolo && grid.getValorBotao(5) == simbolo)
        {
            return true;
        }

        if (grid.getValorBotao(6) == simbolo && grid.getValorBotao(7) == simbolo && grid.getValorBotao(8) == simbolo)
        {
            return true;
        }

        return false;
    }

    private static boolean verificarVitoriaNasColunas()
    {
        if (grid.getValorBotao(0) == simbolo && grid.getValorBotao(3) == simbolo && grid.getValorBotao(6) == simbolo)
        {
            return true;
        }

        if (grid.getValorBotao(1) == simbolo && grid.getValorBotao(4) == simbolo && grid.getValorBotao(7) == simbolo)
        {
            return true;
        }

        if (grid.getValorBotao(2) == simbolo && grid.getValorBotao(5) == simbolo && grid.getValorBotao(8) == simbolo)
        {
            return true;
        }

        return false;
    }

    private static boolean verificarVitoriaNasDiagonais()
    {
        if (grid.getValorBotao(0) == simbolo && grid.getValorBotao(4) == simbolo && grid.getValorBotao(8) == simbolo)
        {
            return true;
        }

        if (grid.getValorBotao(2) == simbolo && grid.getValorBotao(4) == simbolo && grid.getValorBotao(6) == simbolo)
        {
            return true;
        }

        return false;
    }

    private static boolean verificarVitoria()
    {
        return verificarVitoriaNasLinhas() || verificarVitoriaNasColunas() || verificarVitoriaNasDiagonais();
    }

    private static boolean verificarVelha()
    {
        if(
                grid.getValorBotao(0) != ""
                        && grid.getValorBotao(1) != ""
                        && grid.getValorBotao(2) != ""
                        && grid.getValorBotao(3) != ""
                        && grid.getValorBotao(4) != ""
                        && grid.getValorBotao(5) != ""
                        && grid.getValorBotao(6) != ""
                        && grid.getValorBotao(7) != ""
                        && grid.getValorBotao(8) != ""
        )
        {
            return true;
        }

        return false;
    }
}
import java.awt.Container;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.stream.IntStream;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JOptionPane;

public class Grid extends JFrame {
    private Container pane;
    Grid()
    {
        pane = getContentPane();

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
        pane.setLayout(new GridLayout(3,  3));
        IntStream.range(0, 9).forEach(i -> pane.add(botao()));
        pack();
        setVisible(true);
    }

    public String getValorBotao(int indice)
    {
        return ((JButton) pane.getComponent(indice)).getText();
    }

    public void popUp(String mensagem)
    {
        JOptionPane.showMessageDialog(null, mensagem);
    }

    public void desabilitarBotoes()
    {
        for(Component component : pane.getComponents())
        {
            ((JButton) component).setEnabled(false);
        }
    }

    private JButton botao()
    {
        JButton botao = new JButton();

        botao.setPreferredSize(new Dimension(50, 50));
        botao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent)
            {
                clicarBotao(botao);
            }
        });

        return botao;
    }

    private void desabilitarBotao(JButton botao)
    {
        botao.setEnabled(false);
    }

    private void clicarBotao(JButton botao)
    {
        desabilitarBotao(botao);
        botao.setText(JogoDaVelha.getSimbolo());
        JogoDaVelha.mudarSimbolo();
    }
}

Muito bacana!