JavaRush /مدونة جافا /Random-AR /لعبة وحدة تحكم متعددة اللاعبين في جافا
timurnav
مستوى

لعبة وحدة تحكم متعددة اللاعبين في جافا

نشرت في المجموعة
مرحبًا بالجميع، لقد انتهيت بالفعل من كتابة اللعبة منذ وقت طويل، لكنني لم أتمكن بعد من كتابة مقال، إنه استمرار منطقي لهذه المقالة . إذا لم تحاول بعد القيام بأي شيء آخر بدلاً من مهام JavaRush، فإن التعرف على اللعبة سيكون بالضبط حيث تريد أن تبدأ، وسوف تحتاج إلى البدء في التحضير لمهام الاختبار لمشروع حقيقي، والذي أوصي بشدة الجميع بالمشاركة فيه. وبشكل عام، حان الوقت للتوقف عن كونك مبرمجًا كرويًا في الفراغ والبدء في تعلم شيء ما خارج Java-core. لتتمكن من مشاهدة اللعبة ببساطة، يجب أن يكون لديك MySQL مثبتًا، وإذا لم تكن قد استخدمته بعد، فلا تتردد - قم بتثبيته، فهذه إحدى قواعد البيانات التي ستستخدمها في عملك ومشاريعك الشخصية! لن أعطي وصفًا لتثبيت قاعدة البيانات والعمل معها؛ هناك الكثير من البرامج التعليمية ومقاطع الفيديو على الإنترنت؛ أوصي بمعرفة ذلك بنفسك، فهذه أيضًا إحدى أهم مهارات المبرمج - اكتشافها قم بذلك بنفسك :) في الحياة، ستحتاج إلى القدرة على كتابة الاستعلامات بلغة SQL، محليًا، ومن خلال بيانات JDBC، والإسبات ، والربيع، والربيع، وربما يمكن الاستمرار في القائمة، لكن معرفتي تنتهي عند هذا الحد. الآن توقف عن قراءة هذه المقالة واكتشف MySQL، الأمر في الواقع ليس صعبًا على الإطلاق، فأنت بحاجة إلى تثبيت الخادم نفسه، والإعدادات الوحيدة هناك هي تسجيل الدخول وكلمة المرور. ثم اقرأ عن الأوامر المستخدمة عند العمل. أوامر العمل مع الخادم: create و showو useو و أخرى، الأمر help- سيعطي قائمة كاملة بالأوامر. استعلامات للعمل مع جدول معين: select و insertو deleteوغيرها. لا تتعمق كثيرًا، فهناك احتمال ألا يتم تذكر سوى جزء صغير من مجرد قراءة الأوامر. سوف تتعلم كل شيء مع مرور الوقت. يمكنك اللعب في محطة MySQL، وإنشاء قاعدة بيانات، وإنشاء الجداول، وملئها، وتقديم طلب لعرض البيانات، وإضافة معايير الاستعلام. على الأرجح، لن يستغرق الأمر أكثر من 2-3 ساعات، إذا كان أطول، فلا تقلق، مع الخبرة سوف تتقن المواد الجديدة بشكل أسرع. إذا لم تكن لديك مشاكل مع القواعد، فيمكنك البدء في تطوير اللعبة، بناءً على اللعبة التي كتبتها بالفعل عن tic-tac-toe. لفترة طويلة جدًا لم أتمكن من معرفة كيفية تنفيذ اللعب الجماعي، ووجدت حلاً في استخدام قاعدة البيانات. تفترض عملية اللعبة أن اللاعبين يتناوبون، ويتم تسجيل جميع التغييرات في اللعبة في قاعدة البيانات. بناءً على ذلك بالفعل، نحن ندرك أن لدينا لاعبًا وأن هناك ساحة لعب تحتوي على روابط للاعبين، وفي ساحة اللعب يجب ربط المنطق الذي ينتظر فيه أحد اللاعبين قيام اللاعب الثاني بالتحرك وبعدها تتغير أدوارهم ويقوم اللاعب الأول بالحركة، وينتظر الثاني. وبما أنه يجب تكرار جميع التغييرات في قاعدة البيانات، بعد كل خطوة نحتاج إلى حفظ الحقل. لذلك توصلنا إلى الاستنتاج الأول، يجب أن يكون هناك مجال للعب في قاعدة البيانات وبما أننا نتحدث عن تعدد اللاعبين، فنحن بحاجة إلى إضافة لاعبين هناك. لنقم بإنشاء جداول في MySQL، لقد قمت بذلك محليًا من خلال نافذة المحطة الطرفية لـ MySQL. تحتوي ساحة اللعب على روابط للاعبين، لذا سيكون من المنطقي إنشاء طاولة مع اللاعبين أولاً. لاعبينا لديهم:
  • id– الرقم التسلسلي، ونجعله المفتاح الأساسي؛
  • name- الاسم الشائع، سلسلة؛
  • wins- عدد الانتصارات؛
  • loses– عدد الآفات.
  • games- إجمالي عدد المباريات التي تم لعبها.
طاولة العاب:
  • id– الرقم التسلسلي، ونجعله المفتاح الأساسي؛
  • x- هوية اللاعب الذي يلعب х- المفتاح الثانوي؛
  • o- هوية اللاعب الذي يلعب o- المفتاح الثانوي؛
  • field- الحقل نفسه، سيتم وصف نسقه أدناه؛
  • status– يعد ذلك ضروريًا لكي يعمل الوضع المتعدد اللاعبين بشكل صحيح، حيث تحدد الحالة حالة اللعبة:
    تم الإنشاء، واللعب، وانتهت اللعبة

  • current– أيضًا لطور اللعب الجماعي، وتحديدًا أثناء اللعبة، يتحكم هذا الحقل في من يأتي دوره الآن،
    وبعد النهاية يعلن الفائز أو التعادل

لقد قمنا بفرز الجداول، والآن نحن بحاجة إلى إنشاء فئات جافا مع الحقول المقابلة - Gameو 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;
}
لنقم بإضافة مُنشئ فارغ بدون معلمات - للعمل مع قاعدة البيانات ومنشئ آخر سننشئ به الكائنات. دعونا نضيف المستوطنين والحروف لجميع الحقول. الآن دعونا نتعامل مع السبات :) فالأمر لا يصبح أسهل من ساعة إلى أخرى. إنه أكثر تعقيدًا قليلًا من MySQL، وسأتناول سريعًا البنية العامة. مرة أخرى، ليس كل شيء معقدًا للغاية، حيث يمكن تعلم الأساسيات من خلال أي برنامج تعليمي في بضع ساعات، ومن الأفضل أن تدرسها بعمق أثناء كتابة مشاريعك. يتضمن العمل مع قاعدة بيانات من JAVA استخدام JDBC، اقرأ عنها على موقع wiki . ولكن إذا كنت تستخدمه في كتابة التعليمات البرمجية، فسوف يسبب الكثير من الألم في فتحة الشرج، وبعض التعقيد في كتابة فئات DAO ( أيضًا wiki )، وسيحسن السبات الوضع قليلاً، وبمساعدته سيكون لديك تكرار أقل بكثير (قالب ) شفرة. لكي يعمل السبات، تحتاج إلى توصيل مكتبة بالمشروع، ويتم ذلك بكل بساطة: Ctrl+Alt+Shift+S (بنية مشروع الملف)، انتقل إلى علامة التبويب المكتبات، وانقر فوق "+" وأضف المكتبة التي تم تنزيلها مسبقًا ( كخيار، من هنا ). لربط الفئات، Userتحتاج Gameإلى استخدام التعليقات التوضيحية - فهي سهلة الاستخدام للغاية، ويبدو الكود معها كما يلي:
@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;
    }
}
الأمر بسيط هنا
  • @Entity- يقول أن الفصل هو "كيان"، بكلمات بسيطة، وهو مرتبط بجدول في قاعدة البيانات.
  • @Table(name="games")- يقول أي جدول، games- اسم الجدول في قاعدة البيانات
  • @Id، ، @GeneratedValue- @Column(name = "id")بهذه التعليقات التوضيحية الثلاثة نشير إلى أن هذا الحقل هو حقل تعريف، ويتم إنشاؤه تلقائيًا، ويسمى العمود الموجود في قاعدة البيانات بالمعرف.
  • @Column(name = "x")- اسم العمود في قاعدة البيانات.
بعد ذلك، تحتاج إلى بناء المستويات - مستوى DAO ومستوى الخدمة. إذا قمنا بتبسيط كل شيء لتفريغ الظروف، فإن العمل مع البيانات يمر عبر مستوى الخدمة، وهذا أحد مستويات التجريد، فهو يسمح لك بجعل التطبيق يعمل بشكل أكثر استقلالية، بحيث لا يخوض مطور منطق اللعبة في التفاصيل لإعداد الوصول إلى قاعدة البيانات، أو على سبيل المثال، إذا قررنا فجأة استخدام الربيع بدلاً من السبات البسيط، فلن تتجاوز التغييرات طبقة الخدمة، والتي بدونها سيتعين إعادة كتابة نصف التطبيق! وهذا أحد أنماط التصميم. لنبدأ في كتابة مستوى 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();
            }
        }
    }
}
هذا هو ما تبدو عليه عملية إضافة مستخدم جديد إلى قاعدة البيانات، يرجى ملاحظة أنه يتم تمرير كائن فئة الكيان فقط إلى الطريقة، ولا توجد معلومات إضافية مطلوبة هنا. يتم ضمان ذلك من خلال حقيقة أننا نتلقى جلسة اتصال جاهزة مع قاعدة البيانات من فئة HibernateUtil. دعونا نفكر في الأمر.
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;
    }
}
كما ترون، كل شيء هنا بسيط جدًا أيضًا SessionFactory- هذه واجهة من مكتبة السبات التي قمنا بتوصيلها بمشروعنا. للتشغيل الصحيح، كل ما تبقى هو ملء ملف التكوين 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>
إذا ألقيت نظرة سريعة على العلامات، يصبح من الواضح ما وكيف نقوم بإعداده هنا. ميزة أخرى للسبات هي أنه إذا قررنا فجأة تغيير قاعدة البيانات من MySQL إلى قاعدة بيانات أخرى، فنحن نحتاج فقط إلى تغيير برنامج التشغيل داخل property name="connection.driver_class" طبقة العلامة DAO الجاهزة، فلنقم بإنشاء طبقة خدمة. لتجنب إنشاء كائنات DAO في طبقة الخدمة، نستخدم نمط المصنع.
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;
    }
}
وإليك إحدى طرق مستوى الخدمة
public class UserService {
    static void setUserBusy(User user){
        user.setBusy(true); //делаем его занятым
        //и обновляем его в БД
        Factory.getInstance().getUserDAO().updateUser(user);
    }

}
اكتمل رمز العمل مع قاعدة البيانات، وأعدنا كتابة منطق اللعبة مع مراعاة التغييرات. أولاً، دعونا نقسم طريقة الإطلاق الرئيسية إلى فئة منفصلة Main، ​​وستكون فقط فئة تحكم - قائمة ألعاب يمكنك من خلالها بدء اللعبة أو عرض الإحصائيات. لنقم بإنشاء فصل GameLogicيصف منطق اللعبة بالكامل ويتحقق من ساحة اللعب. سيقوم بتفويض حفظ جميع التغييرات في الملعب وإحصائيات اللاعب بعد المباراة إلى طبقة الخدمة. هناك ميزة مثيرة للاهتمام: نحن نحتوي الملعب على شكل صفائف، ويمكن حفظها في قاعدة البيانات، ولكن في هذه المرحلة قررت إعادة اختراع العجلة وفي قاعدة البيانات الخاصة بي، يتم احتواء الحقل على شكل int، أي 9 -رقم رقمي، والذي يتم تحليله من خلال طريقتين باستخدام أساليب الفصل GameLogic، لا أوصي بالقيام بذلك، وسوف أقوم بتحسينه في الإصدارات القادمة من اللعبة :) حظًا موفقًا للجميع في تعلم JAVA! يمكنك تحميل المشروع هنا .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION