JavaRush /Java Blog /Random-ID /Game konsol multipemain di java
timurnav
Level 21

Game konsol multipemain di java

Dipublikasikan di grup Random-ID
Halo semuanya, Saya sudah selesai menulis game ini sejak lama, tetapi saya masih belum sempat menulis artikel, ini merupakan kelanjutan logis dari tulisan ini . Jika Anda belum mencoba melakukan hal lain daripada tugas JavaRush, maka mengenal game ini akan menjadi tempat yang Anda inginkan untuk memulai. Anda harus mulai mempersiapkan tugas pengujian proyek nyata, di mana saya sangat menyarankan semua orang untuk berpartisipasi. Dan secara umum, inilah waktunya untuk berhenti menjadi pemrogram bola dalam ruang hampa dan mulai mempelajari sesuatu di luar java-core. Untuk sekadar menonton pertandingan, Anda harus menginstal MySQL, jika Anda belum menggunakannya, jangan ragu - instal, ini adalah salah satu database yang akan Anda gunakan dalam pekerjaan dan proyek pribadi Anda! Saya tidak akan memberikan deskripsi tentang instalasi dan bekerja dengan database; ada banyak sekali tutorial dan video di Internet; Saya sarankan untuk mencari tahu sendiri, ini juga salah satu keterampilan terpenting seorang programmer - mencari tahu lakukan sendiri :) Dalam hidup, Anda akan memerlukan kemampuan untuk menulis kueri dalam sql, secara asli, dan melalui JDBC, hibernate , spring, spring data, mungkin daftarnya bisa dilanjutkan, tetapi pengetahuan saya berakhir di situ. Sekarang berhentilah membaca artikel ini dan cari tahu MySQL, sebenarnya tidak sulit sama sekali, Anda perlu menginstal servernya sendiri, pengaturannya hanya ada login dan kata sandi. lalu baca tentang perintah apa yang digunakan saat bekerja. Perintah untuk bekerja dengan server: create , show, use, dan lainnya, perintah help- akan memberikan daftar perintah lengkap. Kueri untuk bekerja dengan tabel tertentu: select , insert, deletedan lainnya. Jangan terlalu dalam, ada kemungkinan Anda hanya akan mengingat sebagian kecil dari sekadar membaca perintahnya. Anda akan mempelajari segalanya seiring berjalannya waktu. Anda bisa bermain di terminal MySQL, membuat database, membuat tabel, mengisinya, membuat permintaan untuk menampilkan data, menambahkan kriteria query. Kemungkinan besar, ini akan memakan waktu tidak lebih dari 2-3 jam, jika lebih lama, jangan khawatir, dengan pengalaman Anda akan menguasai materi baru lebih cepat. Jika Anda tidak memiliki masalah dengan database, maka Anda dapat mulai mengembangkan game tersebut, berdasarkan game yang sudah saya tulis tentang Tic Tac Toe. Untuk waktu yang sangat lama saya tidak tahu cara mengimplementasikan multipemain, saya menemukan solusi dalam menggunakan database. Proses permainan mengasumsikan pemain bergiliran, semua perubahan dalam permainan dicatat dalam database. sudah berdasarkan ini, kami memahami bahwa kami memiliki pemain dan ada lapangan bermain yang berisi tautan ke pemain, di lapangan bermain itulah logika harus diikat di mana satu pemain menunggu pemain kedua untuk bergerak. dan setelah itu peran mereka berubah dan Pemain pertama bergerak, dan pemain kedua menunggu. Dan karena semua perubahan harus diduplikasi dalam database, setelah setiap gerakan kita perlu menyimpan bidang tersebut. Jadi kita sampai pada kesimpulan pertama, harus ada lapangan bermain di Database dan karena kita berbicara tentang multipemain, kita perlu menambahkan pemain di sana. Mari kita membuat tabel di MySQL, saya melakukannya secara asli, melalui jendela terminal mysql. lapangan permainan berisi tautan ke pemain, jadi masuk akal untuk membuat meja dengan para pemain terlebih dahulu. Pemain kami memiliki:
  • id– nomor urut, kami menjadikannya kunci utama;
  • name– nama umum, string;
  • wins– jumlah kemenangan;
  • loses– jumlah lesi;
  • games– jumlah total permainan yang dimainkan.
Meja permainan:
  • id– nomor urut, kami menjadikannya kunci utama;
  • x– id pemain yang bermain х– kunci sekunder;
  • o– id pemain yang bermain o– kunci sekunder;
  • field– bidang itu sendiri, formatnya akan dijelaskan di bawah;
  • status– ini diperlukan agar multipemain berfungsi dengan benar, status mencirikan keadaan permainan:
    dibuat, dimainkan, permainan berakhir

  • current– juga untuk multipemain, khususnya selama permainan, bidang ini mengontrol giliran siapa sekarang,
    dan setelah selesai, pemenang atau seri diumumkan

Kami telah memilah tabelnya, sekarang kami perlu membuat kelas Java dengan bidang yang sesuai - Gamedan 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;
}
Mari tambahkan konstruktor kosong tanpa parameter - untuk bekerja dengan database dan konstruktor lain yang akan kita gunakan untuk membuat objek. Mari tambahkan setter dan getter untuk semua bidang. Sekarang mari kita berurusan dengan hibernasi :) tidak menjadi lebih mudah dari jam ke jam. Ini sedikit lebih rumit dibandingkan dengan MySQL, saya akan segera membahas struktur umumnya. Sekali lagi, tidak semuanya rumit, dasar-dasarnya dapat dipelajari melalui tutorial apa pun dalam beberapa jam, dan lebih baik mempelajarinya secara mendalam sambil menulis proyek Anda. Bekerja dengan database dari JAVA melibatkan penggunaan JDBC, bacalah di wiki . Tetapi jika Anda menggunakannya dalam menulis kode, itu akan membawa banyak rasa sakit di anus, beberapa kerumitan dalam menulis kelas DAO ( juga wiki ), hibernasi akan sedikit memperbaiki situasi, dengan itu Anda akan memiliki lebih sedikit pengulangan (templat) ) kode. Agar hibernasi berfungsi, Anda perlu menghubungkan perpustakaan ke proyek, ini dilakukan dengan sangat sederhana: Ctrl+Alt+Shift+S(Struktur File-Proyek), buka tab Perpustakaan, klik "+" dan tambahkan perpustakaan yang telah diunduh sebelumnya ( sebagai opsi, dari sini ). Untuk menautkan kelas, UserAnda Gameperlu menggunakan anotasi - anotasi sangat mudah digunakan, kodenya terlihat seperti ini:
@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;
    }
}
Sederhana saja di sini
  • @Entity– mengatakan bahwa kelas adalah “entitas”, dengan kata sederhana, kelas terikat pada tabel di database.
  • @Table(name="games")– menyebutkan tabel yang mana, games– nama tabel di database
  • @Id, @GeneratedValue, @Column(name = "id")– dengan tiga anotasi ini kami menyatakan bahwa bidang ini adalah bidang identifikasi, dihasilkan secara otomatis, dan kolom dalam database disebut id.
  • @Column(name = "x")– nama kolom dalam database.
Selanjutnya, Anda perlu membangun level - level DAO dan level layanan. Jika kita menyederhanakan semuanya ke kondisi vakum, maka pekerjaan dengan data melewati tingkat layanan, ini adalah salah satu tingkat abstraksi, ini memungkinkan Anda membuat aplikasi bekerja lebih mandiri, sehingga pengembang logika permainan tidak merinci mengatur akses ke database, atau misalnya, jika tiba-tiba kita memutuskan untuk menggunakan pegas alih-alih hibernasi sederhana, perubahan tidak akan melampaui lapisan layanan, yang tanpanya separuh aplikasi harus ditulis ulang! ini adalah salah satu pola desain. Mari mulai menulis level 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();
            }
        }
    }
}
Seperti inilah operasi menambahkan pengguna baru ke database. Harap dicatat bahwa hanya objek kelas entitas yang diteruskan ke metode ini, tidak diperlukan informasi tambahan di sini. Hal ini dipastikan dengan fakta bahwa kami menerima sesi komunikasi siap pakai dengan database dari kelas HibernateUtil. Mari kita pertimbangkan.
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;
    }
}
Seperti yang Anda lihat, semuanya di sini juga sangat sederhana SessionFactory- ini adalah antarmuka dari perpustakaan hibernasi, yang kami sambungkan ke proyek kami. Agar berfungsi dengan benar, yang tersisa hanyalah mengisi file konfigurasi 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>
Jika Anda melihat sekilas tagnya, menjadi jelas apa dan bagaimana kami menyiapkannya di sini. Fitur lain dari hibernate adalah jika kita tiba-tiba memutuskan untuk mengubah database dari MySQL ke database lain, kita hanya perlu mengganti driver di dalam tag property name="connection.driver_class" layer DAO sudah siap, mari kita buat layer layanan. Untuk menghindari pembuatan objek DAO di lapisan layanan, kami menggunakan pola pabrik.
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;
    }
}
Dan inilah salah satu metode tingkat layanan
public class UserService {
    static void setUserBusy(User user){
        user.setBusy(true); //делаем его занятым
        //и обновляем его в БД
        Factory.getInstance().getUserDAO().updateUser(user);
    }

}
Kode untuk bekerja dengan database selesai, kami menulis ulang logika permainan dengan mempertimbangkan perubahan. Pertama, mari kita pisahkan metode peluncuran utama menjadi kelas terpisah Main, itu hanya akan menjadi kelas kontrol - menu permainan di mana Anda dapat memulai permainan atau melihat statistik. Mari kita buat kelas GameLogicyang akan menjelaskan semua logika permainan dan pemeriksaan lapangan permainan. Dia akan mendelegasikan penyimpanan semua perubahan di lapangan permainan dan statistik pemain setelah pertandingan ke lapisan layanan. Ada fitur yang menarik: kami memuat lapangan bermain dalam bentuk array, dapat disimpan di database, tetapi pada tahap ini saya memutuskan untuk menemukan kembali roda dan di database saya bidang tersebut berisi int, yaitu 9 -digit angka, yang diurai menjadi dua menggunakan metode kelas GameLogic, saya tidak menyarankan melakukan ini, saya akan memperbaikinya di rilis game berikutnya :) Semoga sukses untuk semuanya dalam mempelajari JAVA! Anda dapat mengunduh proyeknya di sini .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION