JavaRush /Java blogi /Random-UZ /Java-da ko'p o'yinchi konsol o'yini
timurnav
Daraja

Java-da ko'p o'yinchi konsol o'yini

Guruhda nashr etilgan
Hammaga salom, men o'yinni anchadan beri yozib tugatganman, lekin hali ham maqola yozishga ulgurmadim, bu maqolaning mantiqiy davomi.Agar siz hali boshqa biror narsa qilishga urinmagan bo'lsangiz JavaRush topshiriqlaridan ko'ra, o'yin bilan tanishish aynan siz boshlamoqchi bo'lgan joyda bo'ladi, siz haqiqiy loyihaning test topshiriqlariga tayyorgarlik ko'rishingiz kerak bo'ladi, unda men barchaga qatnashishni qat'iy tavsiya qilaman. Va umuman olganda, vakuumda sferik dasturchi bo'lishni to'xtatish va java yadrosidan tashqarida biror narsani o'rganishni boshlash vaqti keldi. O'yinni shunchaki tomosha qilish uchun sizda MySQL o'rnatilgan bo'lishi kerak, agar siz hali foydalanmagan bo'lsangiz, ikkilanmang - uni o'rnating, bu sizning ishingizda va shaxsiy loyihalaringizda foydalanadigan ma'lumotlar bazalaridan biridir! Men ma'lumotlar bazasini o'rnatish va u bilan ishlashning tavsifini bermayman; Internetda ko'plab o'quv qo'llanmalar va videolar mavjud; Men buni o'zingiz aniqlashni maslahat beraman, bu ham dasturchining eng muhim ko'nikmalaridan biri - figura yaratish. uni o'zingiz chiqarasiz :) Hayotda sizga so'rovlarni sql-da, natively va JDBC orqali, hibernate , bahor, bahor ma'lumotlari orqali yozish qobiliyati kerak bo'ladi, ehtimol ro'yxatni davom ettirish mumkin, lekin mening bilimlarim shu erda tugaydi. Endi ushbu maqolani o'qishni to'xtating va MySQL-ni aniqlang, bu umuman qiyin emas, siz serverning o'zini o'rnatishingiz kerak, u erda yagona sozlamalar login va parol. keyin ishlayotganda qanday buyruqlar ishlatilishi haqida o'qing. Server bilan ishlash buyruqlari: create , show, use, va boshqalar, buyruq help- buyruqlarning to'liq ro'yxatini beradi. Muayyan jadval bilan ishlash uchun so'rovlar: select , insert, deleteva boshqalar. Juda chuqur tushmang, shunchaki buyruqlarni o'qishdan faqat kichik bir qismini eslab qolish ehtimoli bor. vaqt o'tishi bilan hamma narsani o'rganasiz. Siz MySQL terminalida o'ynashingiz, ma'lumotlar bazasini yaratishingiz, jadvallar yaratishingiz, ularni to'ldirishingiz, ma'lumotlarni ko'rsatish uchun so'rov yuborishingiz, so'rov mezonlarini qo'shishingiz mumkin. Ehtimol, bu sizga 2-3 soatdan ko'proq vaqtni oladi, agar u uzoqroq bo'lsa, tashvishlanmang, tajriba bilan siz yangi materialni tezroq o'zlashtirasiz. Agar sizda bazalar bilan bog'liq muammolar bo'lmasa, men tic-tac-toe haqida yozgan o'yinga asoslanib, o'yinni ishlab chiqishni boshlashingiz mumkin.. Uzoq vaqt davomida men multiplayerni qanday amalga oshirishni tushunolmadim, ma'lumotlar bazasidan foydalanishda yechim topdim. O'yin jarayoni o'yinchilarning navbatma-navbat turishini nazarda tutadi, o'yindagi barcha o'zgarishlar ma'lumotlar bazasida qayd etiladi. allaqachon shunga asoslanib, bizda o'yinchi borligini va o'yinchilarga havolalarni o'z ichiga olgan o'yin maydoni borligini tushunamiz, o'yin maydonida mantiq bog'lanishi kerak, qaysi bir o'yinchi ikkinchi o'yinchi harakat qilishini kutmoqda. va shundan keyin ularning rollari o'zgaradi va birinchi o'yinchi harakat qiladi, ikkinchisi esa kutadi. Va barcha o'zgarishlar ma'lumotlar bazasida takrorlanishi kerakligi sababli, har bir harakatdan keyin biz maydonni saqlashimiz kerak. Shunday qilib, biz birinchi xulosaga keldik, ma'lumotlar bazasida o'yin maydoni bo'lishi kerak va biz multiplayer haqida gapirayotganimiz uchun u erga o'yinchilarni qo'shishimiz kerak. Keling, MySQL-da jadvallar yarataylik, men buni MySQL terminal oynasi orqali mahalliy qildim. o'yin maydonida o'yinchilarga havolalar mavjud, shuning uchun birinchi navbatda o'yinchilar bilan jadval yaratish mantiqan to'g'ri keladi. Bizning futbolchilarda:
  • id– tartib raqami, biz uni asosiy kalitga aylantiramiz;
  • name– umumiy nom, qator;
  • wins- g'alabalar soni;
  • loses- jarohatlar soni;
  • games- o'ynagan o'yinlarning umumiy soni.
O'yin jadvali:
  • id– tartib raqami, biz uni asosiy kalitga aylantiramiz;
  • x– o‘ynayotgan o‘yinchining identifikatori х– ikkilamchi kalit;
  • o– o‘ynayotgan o‘yinchining identifikatori o– ikkilamchi kalit;
  • field– maydonning o‘zi, uning formati quyida tavsiflanadi;
  • status- bu multiplayerning to'g'ri ishlashi uchun kerak, holat o'yin holatini tavsiflaydi:
    yaratilgan, o'ynalmoqda, o'yin tugadi

  • current- shuningdek, ko'p o'yinchi uchun, ayniqsa o'yin davomida bu maydon kimning navbatini boshqaradi
    va tugagandan so'ng u g'olibni yoki durangni e'lon qiladi.

Biz jadvallarni saralab oldik, endi tegishli maydonlar bilan Java sinflarini yaratishimiz kerak - Gameva 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;
}
Parametrsiz bo'sh konstruktorni qo'shamiz - ma'lumotlar bazasi va biz ob'ektlar yaratadigan boshqa konstruktor bilan ishlash uchun. Keling, barcha maydonlar uchun sozlagichlar va qabul qiluvchilarni qo'shamiz. Endi hibernatsiya bilan shug'ullanamiz :) bu soatdan soatga osonlashmayapti. Bu MySQL-ga qaraganda biroz murakkabroq, men tezda umumiy tuzilmani ko'rib chiqaman. Shunga qaramay, hamma narsa unchalik murakkab emas, asoslarni har qanday darslik orqali bir necha soat ichida o'rganish mumkin va loyihalarni yozishda chuqur o'rganish yaxshiroqdir. JAVA ma'lumotlar bazasi bilan ishlash JDBC-dan foydalanishni o'z ichiga oladi, bu haqda wiki -da o'qing . Ammo agar siz undan kod yozishda foydalansangiz, bu anusda juda ko'p og'riq keltiradi , DAO sinflarini yozishda biroz murakkablik ( shuningdek, wiki ), hibernate vaziyatni biroz yaxshilaydi, u bilan siz kamroq takrorlanadigan bo'lasiz (shablon). ) kod. Kutish rejimi ishlashi uchun siz kutubxonani loyihaga ulashingiz kerak, bu juda oddiy: Ctrl+Alt+Shift+S(Fayl-loyiha tuzilishi), Kutubxonalar yorlig'iga o'ting, "+" tugmasini bosing va qo'shing. oldindan yuklab olingan kutubxona ( ixtiyoriy ravishda, bu yerdan ). Sinflarni bog'lash uchun Usersiz Gameizohlardan foydalanishingiz kerak - ulardan foydalanish juda oson, ular bilan kod quyidagicha ko'rinadi:
@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;
    }
}
Bu yerda hamma narsa oddiy
  • @Entity– sinfning “obyekt” ekanligini, oddiy so‘z bilan aytganda, u ma’lumotlar bazasidagi jadvalga bog‘langanligini aytadi.
  • @Table(name="games")– qaysi jadvalni aytadi, games– ma’lumotlar bazasidagi jadval nomi
  • @Id, @GeneratedValue, @Column(name = "id")– bu uchta izoh bilan biz bu maydon identifikatsiya maydoni ekanligini, u avtomatik tarzda yaratilishini va ma'lumotlar bazasidagi ustun id deb nomlanishini bildiramiz.
  • @Column(name = "x")– ma’lumotlar bazasidagi ustun nomi.
Keyinchalik, darajalarni qurishingiz kerak - DAO darajasi va xizmat ko'rsatish darajasi. Agar biz hamma narsani vakuum sharoitlariga soddalashtirsak, unda ma'lumotlar bilan ishlash xizmat ko'rsatish darajasidan o'tadi, bu mavhumlik darajalaridan biri bo'lib, o'yin mantig'ini ishlab chiquvchi tafsilotlarga kirmasligi uchun dasturni yanada mustaqil ishlashga imkon beradi. ma'lumotlar bazasiga kirishni sozlash yoki masalan, agar biz to'satdan oddiy kutish o'rniga bahorni ishlatishga qaror qilsak, o'zgarishlar xizmat ko'rsatish qatlamidan tashqariga chiqmaydi, bu holda dasturning yarmini qayta yozish kerak bo'ladi! bu dizayn naqshlaridan biridir. DAO darajasini yozishni boshlaylik.
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();
            }
        }
    }
}
Ma'lumotlar bazasiga yangi foydalanuvchi qo'shish operatsiyasi shunday ko'rinadi.E'tibor bering, metodga faqat ob'ekt klassi ob'ekti uzatiladi, bu erda qo'shimcha ma'lumot talab qilinmaydi. Bu biz HibernateUtil sinfidan ma'lumotlar bazasi bilan tayyor aloqa seansini olishimiz bilan ta'minlanadi. Keling, ko'rib chiqaylik.
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;
    }
}
Ko'rib turganingizdek, bu erda hamma narsa juda oddiy SessionFactory- bu biz loyihamizga ulangan kutish kutubxonasidan interfeys. To'g'ri ishlashi uchun hibernate.cfg.xml konfiguratsiya faylini to'ldirish qoladi.
<!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>
Agar teglarga nazar tashlasangiz, biz bu erda nimani va qanday o'rnatayotganimiz aniq bo'ladi. Kutish rejimining yana bir xususiyati shundaki, agar biz to'satdan ma'lumotlar bazasini MySQL-dan boshqasiga o'zgartirishga qaror qilsak, property name="connection.driver_class" DAO qatlami tayyor tegi ichidagi drayverni o'zgartirishimiz kifoya qiladi, keling, xizmat ko'rsatish qatlamini yarataylik. Xizmat sathida DAO obyektlarini yaratmaslik uchun biz zavod namunasidan foydalanamiz.
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;
    }
}
Va bu erda xizmat darajasining usullaridan biri
public class UserService {
    static void setUserBusy(User user){
        user.setBusy(true); //делаем его занятым
        //и обновляем его в БД
        Factory.getInstance().getUserDAO().updateUser(user);
    }

}
Ma'lumotlar bazasi bilan ishlash uchun kod tugallandi, biz o'zgarishlarni hisobga olgan holda o'yin mantig'ini qayta yozamiz. Birinchidan, asosiy ishga tushirish usulini alohida sinfga ajratamiz Main, bu faqat nazorat sinfi bo'ladi - o'yinni boshlashingiz yoki statistikani ko'rishingiz mumkin bo'lgan o'yin menyusi. GameLogicKeling , o'yinning barcha mantiqini tasvirlaydigan va o'yin maydonini tekshiradigan sinf yarataylik . U o'yin maydonidagi barcha o'zgarishlarni va o'yindan keyin o'yinchi statistikasini saqlashni xizmat ko'rsatish darajasiga topshiradi. Qiziqarli xususiyat bor, biz o'yin maydonini massivlar ko'rinishida o'z ichiga olamiz, ular ma'lumotlar bazasida saqlanishi mumkin, ammo bu bosqichda men g'ildirakni qayta ixtiro qilishga qaror qildim va mening ma'lumotlar bazasida maydon int, ya'ni 9 sifatida mavjud. -raqamli raqam, sinf usullaridan foydalangan holda ikkita tahlil qilinadi GameLogic, buni qilishni tavsiya etmayman, men o'yinning keyingi nashrlarida yaxshilayman :) JAVA o'rganishda barchaga omad! Loyihani bu yerdan yuklab olishingiz mumkin .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION