user: Puedes programarme en JAVA un Tres en Raya con Interfaz por Consola. Necesitaría un menú donde haya 3 opciones, la primera que sea que puedo jugar contra otro jugador, la segunda que sea que puedo jugar contra una falsa IA, y la tercera para cerrar el programa.

assistant: Claro, aquí te muestro una implementación simple del juego "Tres en Raya" en Java con una interfaz por consola:


import java.util.Scanner;

public class TresEnRaya {

  static Scanner scan = new Scanner(System.in);
  static char[][] tablero = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};
  static int fila, columna;
  static char turno = 'X';

  public static void main(String[] args) {
    while (true) {
      menu();
      int opcion = scan.nextInt();
      switch (opcion) {
        case 1:
          jugarContraOtroJugador();
          break;
        case 2:
          jugarContraIA();
          break;
        case 3:
          System.out.println("Gracias por jugar.");
          System.exit(0);
          break;
        default:
          System.out.println("Opción inválida. Intenta de nuevo.");
      }
    }
  }

  public static void menu() {
    System.out.println("Tres en Raya");
    System.out.println("1. Jugar contra otro jugador");
    System.out.println("2. Jugar contra IA");
    System.out.println("3. Salir");
    System.out.print("Selecciona una opción: ");
  }

  public static void jugarContraOtroJugador() {
    System.out.println("Comienza el juego. Tu turno es X.");
    while (true) {
      mostrarTablero();
      moverJugador();
      if (hayGanador(turno)) {
        System.out.println("El ganador es " + turno + ".");
        break;
      }
      if (tableroLleno()) {
        System.out.println("Empate.");
        break;
      }
      cambiarTurno();
    }
    reiniciarTablero();
  }

  public static void jugarContraIA() {
    System.out.println("Comienza el juego. Tu turno es X.");
    while (true) {
      mostrarTablero();
      if (turno == 'X') {
        moverJugador();
      } else {
        moverIA();
      }
      if (hayGanador(turno)) {
        mostrarTablero();
        System.out.println("El ganador es " + turno + ".");
        break;
      }
      if (tableroLleno()) {
        System.out.println("Empate.");
        break;
      }
      cambiarTurno();
    }
    reiniciarTablero();
  }

  public static void moverJugador() {
    System.out.print("Fila (1, 2, o 3): ");
    fila = scan.nextInt() - 1;
    System.out.print("Columna (1, 2, o 3): ");
    columna = scan.nextInt() - 1;
    while (tablero[fila][columna] != ' ') {
      System.out.println("Esa casilla ya está ocupada. Intenta de nuevo.");
      System.out.print("Fila (1, 2, o 3): ");
      fila = scan.nextInt() - 1;
      System.out.print("Columna (1, 2, o 3): ");
      columna = scan.nextInt() - 1;
    }
    tablero[fila][columna] = turno;
  }

  public static void moverIA() {
    fila = (int) (Math.random() * 3);
    columna = (int) (Math.random() * 3);
    while (tablero[fila][columna] != ' ') {
      fila = (int) (Math.random() * 3);
      columna = (int) (Math.random() * 3);
    }
    tablero[fila][columna] = turno;
  }

  public static boolean hayGanador(char jugador) {
    for (int i = 0; i < 3; i++) {
      if (tablero[i][0] == jugador && tablero[i][1] == jugador && tablero[i][2] == jugador) {
        return true;
      }
      if (tablero[0][i] == jugador && tablero[1][i] == jugador && tablero[2][i] == jugador) {
        return true;
      }
    }
    if (tablero[0][0] == jugador && tablero[1][1] == jugador && tablero[2][2] == jugador) {
      return true;
    }
    if (tablero[0][2] == jugador && tablero[1][1] == jugador && tablero[2][0] == jugador) {
      return true;
    }
    return false;
  }

  public static boolean tableroLleno() {
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        if (tablero[i][j] == ' ') {
          return false;
        }
      }
    }
    return true;
  }

  public static void cambiarTurno() {
    if (turno == 'X') {
      turno = 'O';
    } else {
      turno = 'X';
    }
  }

  public static void mostrarTablero() {
    System.out.println("-------------");
    for (int i = 0; i < 3; i++) {
      System.out.print("| ");
      for (int j = 0; j < 3; j++) {
        System.out.print(tablero[i][j] + " | ");
      }
      System.out.println();
      System.out.println("-------------");
    }
  }
}