JavaRush /Blog Java /Random-ES /Juego de consola multijugador en java.
timurnav
Nivel 21

Juego de consola multijugador en java.

Publicado en el grupo Random-ES
Hola a todos, ya terminé de escribir el juego hace mucho tiempo, pero todavía no he podido escribir un artículo, es una continuación lógica de este escrito . Si aún no has intentado hacer nada más que las tareas de JavaRush, luego familiarizarse con el juego será exactamente donde desea comenzar; deberá comenzar a prepararse para las tareas de prueba de un proyecto real, en el que recomiendo encarecidamente a todos que participen. Y, en general, es hora de dejar de ser un programador esférico en el vacío y comenzar a aprender algo fuera de Java-core. Para simplemente ver el juego, debes tener instalado MySQL, si aún no lo has usado, no lo dudes: instálalo, ¡esta es una de esas bases de datos que usarás en tu trabajo y proyectos personales! No daré una descripción de cómo instalar y trabajar con la base de datos; hay muchos tutoriales y videos en Internet; recomiendo descubrir esto usted mismo, esta también es una de las habilidades más importantes de un programador: calcular hágalo usted mismo :) En la vida, necesitará la capacidad de escribir consultas en SQL, de forma nativa y a través de JDBC, hibernación , primavera, datos de primavera, tal vez la lista pueda continuar, pero mi conocimiento termina ahí. Ahora deja de leer este artículo y descubre MySQL, en realidad no es nada difícil, necesitas instalar el servidor, las únicas configuraciones que hay son nombre de usuario y contraseña. luego lea sobre qué comandos se utilizan cuando se trabaja. Comandos para trabajar con el servidor: create , show, usey otros, comando help: le darán una lista completa de comandos. Consultas para trabajar con una tabla específica: select , insert, deletey otras. No profundices demasiado, existe la posibilidad de que solo se recuerde una pequeña parte simplemente leyendo los comandos. aprenderás todo con el tiempo. Puedes jugar en la terminal MySQL, crear una base de datos, crear tablas, completarlas, realizar una solicitud para mostrar datos, agregar criterios de consulta. Lo más probable es que esto no te lleve más de 2 o 3 horas; si es más, no te preocupes, con experiencia dominarás material nuevo más rápido. Si no tienes problemas con las bases, entonces puedes empezar a desarrollar el juego, basándote en el juego que ya escribí sobre tres en raya.. Durante mucho tiempo no pude entender cómo implementar el modo multijugador, encontré una solución usando una base de datos. El proceso del juego supone que los jugadores se turnan, todos los cambios en el juego se registran en la base de datos. Ya en base a esto, entendemos que tenemos un jugador y hay un campo de juego que contiene enlaces a los jugadores, es en el campo de juego donde se debe vincular la lógica en la que un jugador está esperando que el segundo jugador haga un movimiento. y después de lo cual sus roles cambian y el primer jugador hace un movimiento y el segundo espera. Y como todos los cambios deben duplicarse en la base de datos, después de cada movimiento debemos guardar el campo. Entonces llegamos a la primera conclusión: debe haber un campo de juego en la base de datos y, dado que estamos hablando de multijugador, necesitamos agregar jugadores allí. Creemos tablas en MySQL, yo lo hice de forma nativa, a través de la ventana de la terminal mysql. el campo de juego contiene enlaces a los jugadores, por lo que sería lógico crear primero una tabla con los jugadores. Nuestros jugadores tienen:
  • id– número de secuencia, lo convertimos en la clave principal;
  • name– nombre común, cadena;
  • wins– número de victorias;
  • loses– número de lesiones;
  • games– el número total de juegos jugados.
Mesa de juego:
  • id– número de secuencia, lo convertimos en la clave principal;
  • x– id del jugador que juega х– clave secundaria;
  • o– id del jugador que juega o– clave secundaria;
  • field– el campo en sí, su formato se describirá a continuación;
  • status– esto es necesario para que el modo multijugador funcione correctamente, el estado caracteriza el estado del juego:
    creado, jugando, juego terminado

  • current– también para multijugador, específicamente durante el juego este campo controla de quién es el turno ahora,
    y después del final declara el ganador o el sorteo

Hemos ordenado las tablas, ahora necesitamos crear clases Java con los campos correspondientes Gamey User.
public class Game {
    private Integer id;
    private Integer x;
    private Integer y;
    private Integer field;
    private String status;
    private String current;
}
public class User {
    private Integer id;
    private String name;
    private Integer wins;
    private Integer loses;
    private Integer games;
    private Boolean busy;
}
Agreguemos un constructor vacío sin parámetros para trabajar con la base de datos y otro constructor con el que crearemos objetos. Agreguemos definidores y captadores para todos los campos. Ahora vamos a ocuparnos de la hibernación :) no se vuelve más fácil de hora en hora. Es un poco más complicado que con MySQL, repasaré rápidamente la estructura general. Nuevamente, no todo es tan complicado, los conceptos básicos se pueden aprender a través de cualquier tutorial en un par de horas, y es mejor estudiar en profundidad mientras escribes tus proyectos. Trabajar con una base de datos de JAVA implica el uso de JDBC, lea sobre esto en la wiki . Pero si lo usas para escribir código, traerá mucho dolor en el ano, algo de complejidad al escribir clases DAO ( también un wiki ), la hibernación mejorará un poco la situación, con esto tendrás mucho menos repetitivo (plantilla ) código. Para que la hibernación funcione, necesita conectar una biblioteca al proyecto, esto se hace de manera muy simple: Ctrl+Alt+Shift+S(Estructura de archivo-proyecto), vaya a la pestaña Bibliotecas, haga clic en "+" y agregue un Biblioteca predescargada ( como opción, desde aquí ). Para vincular clases Usernecesitas Gameusar anotaciones; son muy fáciles de usar, con ellas el código se ve así:
@Entity
@Table(name="games")
public class Game {
    private Integer id;
    private Integer x;

    @Id
    @GeneratedValue
    @Column(name = "id")
    public Integer getId() {
        return id;
    }

    @Column(name = "x")
    public Integer getX() {
        return x;
    }
}
Es simple aquí
  • @Entity– dice que la clase es una “entidad”, en palabras simples, está vinculada a una tabla en la base de datos.
  • @Table(name="games")– dice qué tabla, games– el nombre de la tabla en la base de datos
  • @Id, @GeneratedValue, @Column(name = "id")– con estas tres anotaciones denotamos que este campo es un campo de identificación, se genera automáticamente y la columna en la base de datos se llama id.
  • @Column(name = "x")– nombre de la columna en la base de datos.
A continuación, debe crear niveles: el nivel DAO y el nivel de servicio. Si simplificamos todo a condiciones de vacío, entonces el trabajo con datos pasa por el nivel de servicio, este es uno de los niveles de abstracción, le permite hacer que la aplicación funcione de manera más independiente, para que el desarrollador de la lógica del juego no entre en detalles. de configurar el acceso a la base de datos, o por ejemplo, si de repente en lugar de una simple hibernación decidiéramos usar Spring, los cambios no irán más allá de la capa de servicio, sin la cual la mitad de la aplicación tendría que ser reescrita. Este es uno de los patrones de diseño. Comencemos a escribir el nivel DAO.
public class UserDAO {

    public void addUser(User user) throws SQLException {
        Session session = null;
        try{
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            session.save(user);
            session.getTransaction().commit();
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
    }
}
Así es como se ve la operación de agregar un nuevo usuario a la base de datos. Tenga en cuenta que solo se pasa un objeto de la clase de entidad al método; aquí no se requiere información adicional. Esto está garantizado por el hecho de que recibimos una sesión de comunicación lista para usar con la base de datos de la clase HibernateUtil. Considerémoslo.
public class HibernateUtil {
    private static SessionFactory sessionFactory = null;

    static {
        try {

            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
Como puede ver, aquí todo también es muy simple SessionFactory: esta es una interfaz de la biblioteca de hibernación que conectamos a nuestro proyecto. Para un correcto funcionamiento solo queda completar el archivo de configuración hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/tictactoe</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.pool_size">100</property>
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <property name="show_sql">false</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.connection.autocommit">false</property>
        <property name="current_session_context_class">thread</property>
        <property name="hibernate.enable_lazy_load_no_trans">true</property>
        <mapping class="entity.User" />
        <mapping class="entity.Game" />
    </session-factory>
</hibernate-configuration>
Si echa un vistazo a las etiquetas, quedará claro qué y cómo estamos configurando aquí. Otra característica de hibernar es que si de repente decidimos cambiar la base de datos de MySQL a otra, solo necesitamos cambiar el controlador dentro de la etiqueta. La property name="connection.driver_class" capa DAO está lista, creemos una capa de servicio. Para evitar la creación de objetos DAO en la capa de servicio, utilizamos el patrón de fábrica.
public class Factory {
    private static UserDAO userDAO = null;
    private static Factory instance = null;
    private Factory() {
    }

    public static synchronized Factory getInstance() {
        if (instance == null) {
            instance = new Factory();
        }
        return instance;
    }

    public UserDAO getUserDAO() {
        if (userDAO == null) {
            userDAO = new UserDAO();
        }
        return userDAO;
    }
}
Y aquí está uno de los métodos de nivel de servicio.
public class UserService {
    static void setUserBusy(User user){
        user.setBusy(true); //делаем его занятым
        //и обновляем его в БД
        Factory.getInstance().getUserDAO().updateUser(user);
    }

}
Se completa el código para trabajar con la base de datos, reescribimos la lógica del juego teniendo en cuenta los cambios. Primero, separemos el método de inicio principal en una clase separada Main, solo será una clase de control: un menú del juego en el que puedes iniciar el juego o ver estadísticas. Creemos una clase GameLogicque describa toda la lógica del juego y controle el campo de juego. Delegará el almacenamiento de todos los cambios en el campo de juego y las estadísticas de los jugadores después del partido a la capa de servicio. Hay una característica interesante: contiene el campo de juego en forma de matrices, se pueden guardar en la base de datos, pero en esta etapa decidí reinventar la rueda y en mi base de datos el campo está contenido como un int, es decir, un 9. -número de dígitos, que se analiza mediante dos usando métodos de clase GameLogic, no recomiendo hacer esto, mejoraré en las próximas versiones del juego :) ¡Buena suerte a todos en aprender JAVA! Puedes descargar el proyecto aquí .
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION