JavaRush /Blog Java /Random-VI /Trò chơi console nhiều người chơi trong java
timurnav
Mức độ

Trò chơi console nhiều người chơi trong java

Xuất bản trong nhóm
Xin chào mọi người, tôi đã viết xong trò chơi này từ lâu nhưng vẫn chưa có thời gian để viết một bài, đây là sự tiếp nối hợp lý của phần viết này . Nếu bạn chưa thử làm bất cứ điều gì khác hơn các nhiệm vụ JavaRush, thì việc làm quen với trò chơi sẽ chính xác là nơi bạn muốn bắt đầu, bạn sẽ cần bắt đầu chuẩn bị cho các nhiệm vụ thử nghiệm của một dự án thực sự, trong đó tôi thực sự khuyên mọi người nên tham gia. Và nói chung, đã đến lúc ngừng trở thành một lập trình viên hình cầu trong chân không và bắt đầu học thứ gì đó bên ngoài java-core. Để xem trận đấu đơn giản, bạn phải cài đặt MySQL, nếu bạn chưa sử dụng thì đừng ngần ngại - hãy cài đặt nó, đây là một trong những cơ sở dữ liệu mà bạn sẽ sử dụng trong công việc và các dự án cá nhân của mình! Tôi sẽ không mô tả cách cài đặt và làm việc với cơ sở dữ liệu; có rất nhiều hướng dẫn và video trên Internet; tôi khuyên bạn nên tự mình tìm ra điều này, đây cũng là một trong những kỹ năng quan trọng nhất của một lập trình viên - tính toán nó tự mình giải quyết :) Trong cuộc sống, bạn sẽ cần khả năng viết các truy vấn bằng sql, nguyên bản và thông qua dữ liệu JDBC, hibernate , spring, spring, có lẽ danh sách có thể được tiếp tục, nhưng kiến ​​​​thức của tôi kết thúc ở đó. Bây giờ hãy dừng đọc bài viết này và tìm hiểu MySQL, thực ra nó không khó chút nào, bạn cần phải tự cài đặt máy chủ, cài đặt duy nhất là thông tin đăng nhập và mật khẩu. sau đó đọc về những lệnh được sử dụng khi làm việc. Các lệnh để làm việc với máy chủ: create , show, usevà các lệnh khác, lệnh help- sẽ đưa ra danh sách lệnh đầy đủ. Các truy vấn để làm việc với một bảng cụ thể: select , insert, deletevà các bảng khác. Đừng đi quá sâu, có khả năng bạn sẽ chỉ nhớ được một phần nhỏ chỉ bằng cách đọc lệnh. bạn sẽ học được mọi thứ theo thời gian. Bạn có thể chơi trong thiết bị đầu cuối MySQL, tạo cơ sở dữ liệu, tạo bảng, điền chúng vào, đưa ra yêu cầu hiển thị dữ liệu, thêm tiêu chí truy vấn. Rất có thể, việc này sẽ khiến bạn mất không quá 2-3 giờ, nếu lâu hơn, đừng lo lắng, với kinh nghiệm, bạn sẽ nắm vững tài liệu mới nhanh hơn. Nếu bạn không gặp vấn đề gì với các căn cứ thì bạn có thể bắt đầu phát triển trò chơi, dựa trên trò chơi mà tôi đã viết về tic-tac-toe. Trong một thời gian rất dài, tôi không thể tìm ra cách triển khai nhiều người chơi, tôi đã tìm ra giải pháp bằng cách sử dụng cơ sở dữ liệu. Quá trình trò chơi giả định người chơi thay phiên nhau, mọi thay đổi trong trò chơi đều được ghi lại trong cơ sở dữ liệu. Dựa trên điều này, chúng tôi hiểu rằng chúng tôi có một người chơi và có một sân chơi chứa các liên kết đến người chơi, trong sân chơi đó phải có logic trong đó một người chơi đang đợi người chơi thứ hai di chuyển và sau đó vai trò của họ thay đổi và Người chơi đầu tiên thực hiện nước đi, còn người thứ hai chờ đợi. Và vì tất cả các thay đổi phải được sao chép trong cơ sở dữ liệu nên sau mỗi lần di chuyển, chúng ta cần lưu trường. Vì vậy, chúng tôi đã đi đến kết luận đầu tiên, phải có một sân chơi trong Cơ sở dữ liệu và vì chúng tôi đang nói về nhiều người chơi nên chúng tôi cần thêm người chơi vào đó. Hãy tạo các bảng trong MySQL, tôi đã làm điều đó một cách tự nhiên, thông qua cửa sổ terminal mysql. sân chơi chứa các liên kết đến người chơi, vì vậy sẽ hợp lý hơn nếu trước tiên bạn tạo một bảng với những người chơi. Người chơi của chúng tôi có:
  • id– số thứ tự, chúng ta đặt nó làm khóa chính;
  • name– tên chung, chuỗi;
  • wins- số trận thắng;
  • loses- số lượng tổn thương;
  • games– tổng số trò chơi đã chơi.
Bàn trò chơi:
  • id– số thứ tự, chúng ta đặt nó làm khóa chính;
  • x– id của người chơi х– khóa phụ;
  • o– id của người chơi o– khóa phụ;
  • field– chính trường đó, định dạng của nó sẽ được mô tả bên dưới;
  • status– điều này là cần thiết để nhiều người chơi hoạt động chính xác, trạng thái đặc trưng cho trạng thái của trò chơi:
    đã tạo, đang chơi, trò chơi kết thúc

  • current– cũng dành cho nhiều người chơi, cụ thể là trong trò chơi, trường này sẽ kiểm soát lượt của ai bây giờ
    và sau khi kết thúc, nó sẽ tuyên bố người chiến thắng hoặc hòa

Chúng ta đã sắp xếp các bảng, bây giờ chúng ta cần tạo các lớp Java với các trường tương ứng - GameUser.
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;
}
Hãy thêm một hàm tạo trống không có tham số - để làm việc với cơ sở dữ liệu và một hàm tạo khác mà chúng ta sẽ tạo các đối tượng. Hãy thêm setters và getters cho tất cả các trường. Bây giờ chúng ta hãy giải quyết chế độ ngủ đông :) mọi việc sẽ không dễ dàng hơn theo từng giờ. Nó phức tạp hơn một chút so với MySQL, tôi sẽ xem nhanh cấu trúc chung. Một lần nữa, không phải mọi thứ đều quá phức tạp, bạn có thể học những kiến ​​thức cơ bản thông qua bất kỳ hướng dẫn nào trong vài giờ và tốt hơn hết là bạn nên nghiên cứu chuyên sâu trong khi viết dự án của mình. Làm việc với cơ sở dữ liệu từ JAVA liên quan đến việc sử dụng JDBC, hãy đọc về nó trên wiki . Nhưng nếu bạn sử dụng nó để viết code thì sẽ rất đau hậu môn, hơi phức tạp khi viết các lớp DAO ( cũng là wiki ), ngủ đông sẽ cải thiện tình hình một chút, với nó bạn sẽ bớt lặp đi lặp lại nhiều (mẫu ) mã số. Để chế độ ngủ đông hoạt động, bạn cần kết nối thư viện với dự án, việc này được thực hiện rất đơn giản: Ctrl+Alt+Shift+S(Cấu trúc tệp-dự án), chuyển đến tab Thư viện, nhấp vào "+" và thêm một thư viện được tải xuống trước ( dưới dạng tùy chọn, từ đây ). Để liên kết các lớp, Userbạn Gamecần sử dụng các chú thích - chúng rất dễ sử dụng, với chúng, mã trông như thế này:
@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;
    }
}
Ở đây rất đơn giản
  • @Entity– nói rằng lớp là một “thực thể”, nói một cách đơn giản, nó được gắn với một bảng trong cơ sở dữ liệu.
  • @Table(name="games")– cho biết bảng nào, games– tên của bảng trong cơ sở dữ liệu
  • @Id, @GeneratedValue, @Column(name = "id")– với ba chú thích này, chúng tôi biểu thị rằng trường này là trường nhận dạng, nó được tạo tự động và cột trong cơ sở dữ liệu được gọi là id.
  • @Column(name = "x")– tên của cột trong cơ sở dữ liệu.
Tiếp theo, bạn cần xây dựng các cấp độ - cấp độ DAO và cấp độ dịch vụ. Nếu chúng ta đơn giản hóa mọi thứ về điều kiện chân không, sau đó làm việc với dữ liệu sẽ đi qua cấp độ dịch vụ thì đây là một trong những cấp độ trừu tượng, nó cho phép bạn làm cho ứng dụng hoạt động độc lập hơn, để nhà phát triển logic trò chơi không đi sâu vào chi tiết về việc thiết lập quyền truy cập vào cơ sở dữ liệu, hoặc ví dụ, nếu đột nhiên chúng tôi thay vì chế độ ngủ đông đơn giản quyết định sử dụng mùa xuân, các thay đổi sẽ không vượt ra ngoài lớp dịch vụ, nếu không có lớp đó thì một nửa ứng dụng sẽ phải được viết lại! đây là một trong những mẫu thiết kế. Hãy bắt đầu viết cấp độ 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();
            }
        }
    }
}
Đây là hoạt động thêm người dùng mới vào cơ sở dữ liệu. Xin lưu ý rằng chỉ một đối tượng của lớp thực thể được truyền vào phương thức; không cần thêm thông tin ở đây. Điều này được đảm bảo bởi thực tế là chúng tôi nhận được phiên giao tiếp được tạo sẵn với cơ sở dữ liệu từ lớp HibernateUtil. Hãy xem xét nó.
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;
    }
}
Như bạn có thể thấy, mọi thứ ở đây cũng rất đơn giản SessionFactory- đây là giao diện từ thư viện ngủ đông mà chúng tôi đã kết nối với dự án của mình. Để hoạt động chính xác, tất cả những gì còn lại là điền vào tệp cấu hình 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>
Nếu bạn nhìn vào các thẻ, bạn sẽ thấy rõ chúng tôi đang thiết lập cái gì và như thế nào ở đây. Một tính năng khác của ngủ đông là nếu chúng ta đột nhiên quyết định thay đổi cơ sở dữ liệu từ MySQL sang cơ sở dữ liệu khác, chúng ta chỉ cần thay đổi trình điều khiển bên trong property name="connection.driver_class" lớp thẻ DAO đã sẵn sàng, hãy tạo một lớp dịch vụ. Để tránh tạo các đối tượng DAO trong lớp dịch vụ, chúng tôi sử dụng mẫu xuất xưởng.
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;
    }
}
Và đây là một trong những phương pháp cấp độ dịch vụ
public class UserService {
    static void setUserBusy(User user){
        user.setBusy(true); //делаем его занятым
        //и обновляем его в БД
        Factory.getInstance().getUserDAO().updateUser(user);
    }

}
Mã để làm việc với cơ sở dữ liệu đã hoàn tất, chúng tôi viết lại logic trò chơi có tính đến những thay đổi. Trước tiên, hãy tách phương thức khởi chạy chính thành một lớp riêng Main, nó sẽ chỉ là lớp điều khiển - một menu trò chơi trong đó bạn có thể bắt đầu trò chơi hoặc xem số liệu thống kê. Hãy tạo một lớp GameLogicmô tả tất cả logic của trò chơi và kiểm tra sân chơi. Anh ta sẽ ủy quyền việc lưu tất cả các thay đổi trên sân chơi và số liệu thống kê về người chơi sau trận đấu cho lớp dịch vụ. Có một tính năng thú vị, chúng tôi chứa sân chơi ở dạng mảng, chúng có thể được lưu trong cơ sở dữ liệu, nhưng ở giai đoạn này, tôi quyết định phát minh lại bánh xe và trong cơ sở dữ liệu của tôi, trường được chứa dưới dạng int, cụ thể là 9 -số, được phân tích bằng hai cách sử dụng các phương thức lớp GameLogic, tôi không khuyên bạn nên làm điều này, tôi sẽ cải thiện trong các phiên bản tiếp theo của trò chơi :) Chúc mọi người học JAVA may mắn! Bạn có thể tải về dự án ở đây .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION