JavaRush /Blog Java /Random-MS /Permainan konsol berbilang pemain di java
timurnav
Tahap

Permainan konsol berbilang pemain di java

Diterbitkan dalam kumpulan
Helo semua, saya sudah lama selesai menulis permainan ini, tetapi saya masih belum sempat menulis artikel, ini adalah kesinambungan logik daripada tulisan ini . Jika anda masih belum cuba melakukan perkara lain daripada tugas JavaRush, kemudian membiasakan diri dengan permainan akan menjadi tepat di mana anda ingin bermula, anda perlu mula bersedia untuk tugas ujian projek sebenar, di mana saya amat mengesyorkan semua orang untuk mengambil bahagian. Dan secara umum, sudah tiba masanya untuk berhenti menjadi pengaturcara sfera dalam vakum dan mula mempelajari sesuatu di luar teras java. Untuk hanya menonton permainan, anda mesti memasang MySQL, jika anda belum menggunakannya lagi, jangan teragak-agak - pasangkannya, ini adalah salah satu pangkalan data yang akan anda gunakan dalam kerja dan projek peribadi anda! Saya tidak akan memberikan penerangan tentang memasang dan bekerja dengan pangkalan data; terdapat banyak tutorial dan video di Internet; Saya cadangkan untuk memikirkan perkara ini sendiri, ini juga merupakan salah satu kemahiran paling penting seorang pengaturcara - memikirkan ia keluar sendiri :) Dalam kehidupan, anda memerlukan keupayaan untuk menulis pertanyaan dalam sql, native , dan melalui JDBC, hibernate , spring, spring data, mungkin senarai itu boleh diteruskan, tetapi pengetahuan saya berakhir di sana. Sekarang berhenti membaca artikel ini dan cari tahu MySQL, ia sebenarnya tidak sukar sama sekali, anda perlu memasang pelayan itu sendiri, satu-satunya tetapan di sana ialah log masuk dan kata laluan. kemudian baca tentang arahan yang digunakan semasa bekerja. Perintah untuk bekerja dengan pelayan: create , show, use, dan lain-lain, arahan help- akan memberikan senarai lengkap arahan. Pertanyaan untuk bekerja dengan jadual tertentu: select , insert, deletedan lain-lain. Jangan terlalu dalam, ada kemungkinan hanya sebahagian kecil yang akan diingati daripada hanya membaca arahan. anda akan belajar segala-galanya dari semasa ke semasa. Anda boleh bermain di terminal MySQL, mencipta pangkalan data, membuat jadual, mengisinya, membuat permintaan untuk memaparkan data, menambah kriteria pertanyaan. Kemungkinan besar, ini akan membawa anda tidak lebih daripada 2-3 jam; jika lebih lama, jangan risau, dengan pengalaman anda akan menguasai bahan baharu dengan lebih cepat. Jika anda tidak mempunyai masalah dengan pangkalan, maka anda boleh mula membangunkan permainan, berdasarkan permainan yang telah saya tulis tentang tic-tac-toe. Untuk masa yang sangat lama saya tidak dapat memikirkan bagaimana untuk melaksanakan berbilang pemain, saya menemui penyelesaian dalam menggunakan pangkalan data. Proses permainan mengandaikan bahawa pemain bergilir-gilir, semua perubahan dalam permainan direkodkan dalam pangkalan data. sudah berdasarkan ini, kami faham bahawa kami mempunyai pemain dan terdapat padang permainan yang mengandungi pautan kepada pemain, di padang permainan itulah logiknya harus terikat di mana seorang pemain sedang menunggu pemain kedua untuk bergerak. dan selepas itu peranan mereka berubah dan Pemain pertama bergerak, dan yang kedua menunggu. Dan kerana semua perubahan mesti diduplikasi dalam pangkalan data, selepas setiap langkah kita perlu menyimpan medan. Jadi kami sampai pada kesimpulan pertama, mesti ada padang permainan dalam Pangkalan Data dan kerana kita bercakap tentang berbilang pemain, kita perlu menambah pemain di sana. Mari buat jadual dalam MySQL, saya melakukannya secara asli, melalui tetingkap terminal mysql. padang permainan mengandungi pautan kepada pemain, jadi adalah logik untuk mula-mula membuat jadual dengan pemain. Pemain kami mempunyai:
  • id– nombor urutan, kami menjadikannya kunci utama;
  • name– nama biasa, rentetan;
  • wins– bilangan kemenangan;
  • loses- bilangan lesi;
  • games– jumlah bilangan permainan yang dimainkan.
Jadual permainan:
  • id– nombor urutan, kami menjadikannya kunci utama;
  • x– id pemain yang bermain х– kunci sekunder;
  • o– id pemain yang bermain o– kunci sekunder;
  • field– medan itu sendiri, formatnya akan diterangkan di bawah;
  • status– ini diperlukan untuk berbilang pemain berfungsi dengan betul, status mencirikan keadaan permainan:
    dicipta, bermain, tamat permainan

  • current– juga untuk berbilang pemain, khususnya semasa permainan medan ini mengawal giliran siapa sekarang,
    dan selepas tamat ia mengisytiharkan pemenang atau seri

Kami telah menyusun jadual, kini kami perlu mencipta kelas Java dengan medan yang sepadan - 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 pembina kosong tanpa parameter - untuk bekerja dengan pangkalan data dan pembina lain yang mana kita akan membuat objek. Mari tambah setter dan getter untuk semua medan. Sekarang mari kita berurusan dengan hibernate :) ia tidak menjadi lebih mudah dari jam ke jam. Ia sedikit lebih rumit daripada MySQL, saya akan segera membincangkan struktur umum. Sekali lagi, tidak semuanya begitu rumit, asasnya boleh dipelajari melalui mana-mana tutorial dalam beberapa jam, dan lebih baik untuk belajar secara mendalam semasa menulis projek anda. Bekerja dengan pangkalan data dari JAVA melibatkan penggunaan JDBC, baca tentangnya di wiki . Tetapi jika anda menggunakannya dalam menulis kod, ia akan membawa banyak kesakitan pada dubur, beberapa kerumitan dalam menulis kelas DAO ( juga wiki ), hibernate akan memperbaiki keadaan sedikit, dengan itu anda akan mempunyai lebih kurang berulang (templat ) kod. Untuk hibernate berfungsi, anda perlu menyambungkan perpustakaan ke projek, ini dilakukan dengan mudah: Ctrl+Alt+Shift+S(Struktur Projek Fail), pergi ke tab Perpustakaan, klik "+" dan tambahkan perpustakaan pra-muat turun ( sebagai pilihan, dari sini ). Untuk memautkan kelas, Useranda Gameperlu menggunakan anotasi - ia sangat mudah digunakan, dengan kod tersebut kelihatan 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;
    }
}
Ia mudah di sini
  • @Entity– mengatakan bahawa kelas adalah "entiti", dalam kata mudah, ia terikat pada jadual dalam pangkalan data.
  • @Table(name="games")– menyatakan jadual mana, games– nama jadual dalam pangkalan data
  • @Id, @GeneratedValue, @Column(name = "id")– dengan tiga anotasi ini kami menyatakan bahawa medan ini ialah medan pengenalan, ia dijana secara automatik, dan lajur dalam pangkalan data dipanggil id.
  • @Column(name = "x")– nama lajur dalam pangkalan data.
Seterusnya, anda perlu membina tahap - tahap DAO dan tahap perkhidmatan. Jika kami memudahkan segala-galanya kepada keadaan vakum, kemudian bekerja dengan data melalui tahap perkhidmatan, ini adalah salah satu tahap abstraksi, ia membolehkan anda membuat aplikasi berfungsi lebih bebas, supaya pembangun logik permainan tidak masuk ke butiran menyediakan akses kepada pangkalan data, atau sebagai contoh, jika tiba-tiba kami bukannya hibernate mudah memutuskan untuk menggunakan spring, perubahan tidak akan melampaui lapisan perkhidmatan, tanpanya separuh aplikasi perlu ditulis semula! ini adalah salah satu corak reka bentuk. Mari mula menulis tahap 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();
            }
        }
    }
}
Beginilah rupa operasi menambah pengguna baharu pada pangkalan data. Sila ambil perhatian bahawa hanya objek kelas entiti dihantar ke kaedah; tiada maklumat tambahan diperlukan di sini. Ini dipastikan oleh fakta bahawa kami menerima sesi komunikasi siap sedia dengan pangkalan data daripada 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, segala-galanya di sini juga sangat mudah SessionFactory- ini adalah antara muka daripada perpustakaan hibernate, yang kami sambungkan ke projek kami. Untuk pengendalian yang betul, yang tinggal hanyalah mengisi fail 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 pada teg, ia menjadi jelas apa dan bagaimana kami menyediakan di sini. Satu lagi ciri hibernate ialah jika kita tiba-tiba memutuskan untuk menukar pangkalan data daripada MySQL kepada yang lain, kita hanya perlu menukar pemacu di dalam teg property name="connection.driver_class" lapisan DAO sedia, mari buat lapisan perkhidmatan. Untuk mengelak daripada mencipta objek DAO dalam lapisan perkhidmatan, kami menggunakan corak kilang.
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 kaedah tahap perkhidmatan
public class UserService {
    static void setUserBusy(User user){
        user.setBusy(true); //делаем его занятым
        //и обновляем его в БД
        Factory.getInstance().getUserDAO().updateUser(user);
    }

}
Kod untuk bekerja dengan pangkalan data selesai, kami menulis semula logik permainan dengan mengambil kira perubahan. Mula-mula, mari kita pisahkan kaedah pelancaran utama kepada kelas yang berasingan Main, ia hanya akan menjadi kelas kawalan - menu permainan di mana anda boleh memulakan permainan atau melihat statistik. Mari buat kelas GameLogicyang akan menerangkan semua logik permainan dan menyemak padang permainan. Dia akan mewakilkan penjimatan semua perubahan pada padang permainan dan statistik pemain selepas perlawanan kepada lapisan servis. Terdapat ciri yang menarik: kami mengandungi medan permainan dalam bentuk tatasusunan, mereka boleh disimpan dalam pangkalan data, tetapi pada peringkat ini saya memutuskan untuk mencipta semula roda dan dalam pangkalan data saya medan itu terkandung sebagai int, iaitu 9 -nombor digit, yang dihuraikan oleh dua menggunakan kaedah kelas GameLogic, saya tidak mengesyorkan melakukan ini, saya akan menambah baik dalam keluaran seterusnya permainan :) Semoga berjaya kepada semua orang dalam mempelajari JAVA! Anda boleh memuat turun projek di sini .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION