Hər kəsə salam, mən oyunu çoxdan yazmağı bitirmişəm, amma hələ də məqalə yazmağa macal tapmamışam, bu yazının məntiqi davamıdır . Əgər hələ də başqa bir şey etməyə cəhd etməmisinizsə JavaRush tapşırıqlarından daha çox, onda oyunla tanış olmaq tam olaraq başlamaq istədiyiniz yerdə olacaq, hər kəsə iştirak etməyi şiddətlə tövsiyə etdiyim real layihənin test tapşırıqlarına hazırlaşmağa başlamalı olacaqsınız. Ümumiyyətlə, boşluqda sferik proqramçı olmağı dayandırmağın və java nüvəsindən kənar bir şey öyrənməyə başlamağın vaxtıdır. Oyunu sadəcə izləmək üçün sizdə MySQL quraşdırılmış olmalıdır, hələ istifadə etməmisinizsə, çəkinməyin - quraşdırın, bu, işinizdə və şəxsi layihələrinizdə istifadə edəcəyiniz verilənlər bazalarından biridir! Verilənlər bazasını quraşdırmaq və onunla işləmək barədə məlumat verməyəcəyəm; İnternetdə bir çox dərslik və videolar var; Mən bunu özünüz başa düşməyi məsləhət görürəm, bu da bir proqramçının ən vacib bacarıqlarından biridir - fiqur yaratmaq bunu öz başınıza :) Həyatda sizə sql-də, yerli olaraq və JDBC vasitəsilə, hibernate , spring, spring datası vasitəsilə sorğu yazmaq bacarığı lazım olacaq, bəlkə siyahı davam etdirilə bilər, amma mənim biliklərim bununla bitər. İndi bu məqaləni oxumağı dayandırın və MySQL-i anlayın, əslində heç də çətin deyil, serverin özünü quraşdırmalısan, yeganə parametrlər giriş və şifrədir. sonra işləyərkən hansı əmrlərdən istifadə olunduğunu oxuyun. Serverlə işləmək üçün əmrlər: create , show, use, və başqaları, komanda help- əmrlərin tam siyahısını verəcəkdir. Müəyyən bir cədvəllə işləmək üçün sorğular: select , insert, deletevə başqaları. Çox dərinə getməyin, sadəcə əmrləri oxumaqla yalnız kiçik bir hissənin yadda qalması şansı var. zamanla hər şeyi öyrənəcəksən. MySQL terminalında oynaya, verilənlər bazası yarada, cədvəllər yarada, onları doldura, məlumatların göstərilməsi üçün sorğu verə, sorğu meyarları əlavə edə bilərsiniz. Çox güman ki, bu sizə 2-3 saatdan çox çəkməyəcək, əgər daha uzun olarsa, narahat olmayın, təcrübə ilə yeni materialı daha tez mənimsəyəcəksiniz. Bazalarla bağlı heç bir probleminiz yoxdursa, o zaman tic-tac-toe haqqında yazdığım oyun əsasında oyunu inkişaf etdirməyə başlaya bilərsiniz.. Çox uzun müddət multiplayerin necə tətbiq olunacağını anlaya bilmədim, verilənlər bazasından istifadə edərək həll tapdım. Oyun prosesi oyunçuların növbə ilə getməsini nəzərdə tutur, oyundakı bütün dəyişikliklər verilənlər bazasında qeyd olunur. artıq buna əsaslanaraq başa düşürük ki, bir oyunçumuz var və oyunçularla əlaqəni ehtiva edən bir oyun sahəsi var, bir oyunçunun ikinci oyunçunun hərəkət etməsini gözlədiyi məntiq oyun sahəsində bağlanmalıdır. və bundan sonra onların rolları dəyişir və birinci oyunçu hərəkət edir, ikincisi isə gözləyir. Və bütün dəyişikliklər verilənlər bazasında təkrarlanmalı olduğundan, hər bir hərəkətdən sonra sahəni saxlamalıyıq. Beləliklə, biz ilk nəticəyə gəldik, Verilənlər Bazasında oyun sahəsi olmalıdır və çox oyunçudan danışdığımız üçün ora oyunçular əlavə etməliyik. MySQL-də cədvəllər yaradaq, mən bunu yerli olaraq, mysql terminal pəncərəsi vasitəsilə etdim. oyun sahəsində oyunçulara bağlantılar var, buna görə də əvvəlcə oyunçularla bir masa yaratmaq məntiqli olardı. Oyunçularımızda:
  • id– sıra nömrəsi, onu əsas açar edirik;
  • name– ümumi ad, sətir;
  • wins- qələbələrin sayı;
  • loses- lezyonların sayı;
  • games- oynanılan oyunların ümumi sayı.
Oyun cədvəli:
  • id– sıra nömrəsi, onu əsas açar edirik;
  • x– oynayan oyunçunun identifikatoru х– ikinci dərəcəli açar;
  • o– oynayan oyunçunun identifikatoru o– ikinci dərəcəli açar;
  • field– sahənin özü, onun formatı aşağıda təsvir olunacaq;
  • status- bu, multiplayerin düzgün işləməsi üçün lazımdır, status oyunun vəziyyətini xarakterizə edir:
    yaradıldı, oynayır, oyun bitdi

  • current– həmçinin multiplayer üçün, xüsusən oyun zamanı bu sahə kimin növbəsinin olduğunu idarə edir
    və bitdikdən sonra qalibi elan edir və ya heç-heçə edir.

Cədvəlləri sıraladıq, indi müvafiq sahələrlə Java sinifləri yaratmalıyıq - 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;
}
Parametrləri olmayan boş bir konstruktor əlavə edək - verilənlər bazası və obyektlər yaradacağımız başqa bir konstruktorla işləmək üçün. Bütün sahələr üçün təyinedicilər və alıcılar əlavə edək. İndi qışlama ilə məşğul olaq :) bu saatdan saata asanlaşmır. MySQL-dən bir az daha mürəkkəbdir, mən tez bir zamanda ümumi strukturu nəzərdən keçirəcəyəm. Yenə də hər şey o qədər də mürəkkəb deyil, əsasları bir neçə saat ərzində istənilən dərslik vasitəsilə öyrənmək olar və layihələrinizi yazarkən dərindən öyrənmək daha yaxşıdır. JAVA verilənlər bazası ilə işləmək JDBC-dən istifadə etməyi nəzərdə tutur, bu barədə wiki -də oxuyun . Ancaq kod yazmaqda istifadə etsəniz, bu , anusda çox ağrı gətirəcək , DAO siniflərinin yazılmasında bir qədər mürəkkəblik ( həmçinin wiki ), qışlama vəziyyəti bir az yaxşılaşdıracaq, onunla daha az təkrarlanacaqsınız (şablon). ) kodu. Qış rejiminin işləməsi üçün layihəyə kitabxana qoşmalısınız, bu, çox sadədir: Ctrl+Alt+Shift+S(Fayl-Layihə Strukturu), Kitabxanalar sekmesine keçin, “+” düyməsini basın və əlavə edin əvvəlcədən yüklənmiş kitabxana ( seçim olaraq, buradan ). Dərsləri əlaqələndirmək üçün annotasiyalardan istifadə Useretməlisiniz Game- onlardan istifadə etmək çox asandır, onlarla kod belə görünür:
@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;
    }
}
Burada sadədir
  • @Entity– sinfin “varlıq” olduğunu, sadə sözlə, verilənlər bazasındakı cədvələ bağlandığını söyləyir.
  • @Table(name="games")– hansı cədvəli bildirir, games– verilənlər bazasındakı cədvəlin adı
  • @Id, @GeneratedValue, @Column(name = "id")– bu üç annotasiya ilə qeyd edirik ki, bu sahə identifikasiya sahəsidir, avtomatik olaraq yaradılır və verilənlər bazasındakı sütun id adlanır.
  • @Column(name = "x")– verilənlər bazasındakı sütunun adı.
Sonra səviyyələri - DAO səviyyəsini və xidmət səviyyəsini qurmalısınız. Hər şeyi vakuum şərtlərinə sadələşdirsək, məlumatlarla işləmək xidmət səviyyəsindən keçir, bu, abstraksiya səviyyələrindən biridir, bu, proqramın daha müstəqil işləməsinə imkan verir ki, oyun məntiqinin tərtibçisi təfərrüatlara girməsin. verilənlər bazasına girişin qurulması və ya məsələn, birdən biz sadə qışlama əvəzinə yazdan istifadə etmək qərarına gəlsək, dəyişikliklər xidmət səviyyəsindən kənara çıxmayacaq, onsuz tətbiqin yarısı yenidən yazılmalı olacaq! bu dizayn nümunələrindən biridir. DAO səviyyəsini yazmağa başlayaq.
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();
            }
        }
    }
}
Verilənlər bazasına yeni istifadəçinin əlavə edilməsi əməliyyatı belə görünür.Nəzərə alın ki, metoda yalnız obyekt sinfinin obyekti ötürülür, burada əlavə məlumat tələb olunmur. Bu, HibernateUtil sinfindən verilənlər bazası ilə hazır ünsiyyət sessiyasını almağımızla təmin edilir. Gəlin bunu nəzərdən keçirək.
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;
    }
}
Gördüyünüz kimi, burada hər şey çox sadədir SessionFactory- bu, layihəmizə qoşulduğumuz qışlama kitabxanasından bir interfeysdir. Düzgün işləmək üçün hibernate.cfg.xml konfiqurasiya faylını doldurmaq qalır.
<!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>
Teqlərə nəzər salsanız, burada nəyi və necə qurduğumuz aydın olar. Hibernate rejiminin başqa bir xüsusiyyəti odur ki, əgər birdən verilənlər bazasını MySQL-dən başqa birinə dəyişmək qərarına gəlsək, sadəcə property name="connection.driver_class" DAO qatının hazır teqinin içindəki driveri dəyişmək kifayətdir, gəlin xidmət təbəqəsi yaradaq. Xidmət səviyyəsində DAO obyektlərinin yaradılmasının qarşısını almaq üçün biz zavod modelindən istifadə edirik.
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ə burada xidmət səviyyəsi üsullarından biridir
public class UserService {
    static void setUserBusy(User user){
        user.setBusy(true); //делаем его занятым
        //и обновляем его в БД
        Factory.getInstance().getUserDAO().updateUser(user);
    }

}
Verilənlər bazası ilə işləmək üçün kod tamamlandı, dəyişiklikləri nəzərə alaraq oyun məntiqini yenidən yazırıq. Birincisi, əsas işə salma metodunu ayrı bir sinifə ayıraq Main, bu, yalnız bir nəzarət sinfi olacaq - oyuna başlaya və ya statistikaya baxa biləcəyiniz bir oyun menyusu. GameLogicOyunun bütün məntiqini təsvir edəcək və oyun sahəsini yoxlayacaq bir sinif yaradaq . O, oyun sahəsindəki bütün dəyişikliklərin və oyundan sonra oyunçu statistikasının saxlanmasını xidmət səviyyəsinə həvalə edəcək. Maraqlı bir xüsusiyyət var: biz oyun sahəsini massivlər şəklində saxlayırıq, onlar verilənlər bazasında saxlanıla bilər, lakin bu mərhələdə təkəri yenidən ixtira etmək qərarına gəldim və verilənlər bazamda sahə int, yəni 9 kimi yer alır. Sinif metodlarından istifadə etməklə iki tərəfindən təhlil edilən -rəqəmli nömrə, GameLogicbunu etməyi məsləhət görmürəm, oyunun növbəti buraxılışlarında təkmilləşdirəcəyəm :) JAVA-nı öyrənməkdə hər kəsə uğurlar! Layihəni buradan yükləyə bilərsiniz .