JavaRush /בלוג Java /Random-HE /משחק קונסולה מרובה משתתפים בג'אווה
timurnav
רָמָה

משחק קונסולה מרובה משתתפים בג'אווה

פורסם בקבוצה
שלום לכולם, כבר מזמן סיימתי לכתוב את המשחק, אבל עדיין לא יצא לי לכתוב מאמר, זה המשך הגיוני של כתבת הכתיבה הזו . אם עדיין לא ניסיתם לעשות משהו אחר מאשר משימות JavaRush, אז היכרות עם המשחק תהיה בדיוק במקום בו תרצו להתחיל תצטרכו להתחיל להתכונן למשימות הבדיקה של פרויקט אמיתי, בו אני ממליץ בחום לכולם להשתתף. ובכלל, הגיע הזמן להפסיק להיות מתכנת כדורי בוואקום ולהתחיל ללמוד משהו מחוץ ל-java-core. על מנת לצפות במשחק פשוט יש להתקין את MySQL, אם עדיין לא השתמשתם בו, אל תהססו – התקינו אותו, זה אחד מאותם מסדי נתונים שתשתמשו בהם בעבודה ובפרויקטים האישיים שלכם! אני לא אתן תיאור של התקנה ועבודה עם מסד הנתונים; יש המון מדריכים וסרטונים באינטרנט; אני ממליץ להבין את זה לבד, זו גם אחת הכישורים החשובים ביותר של מתכנת - להבין זה יצא לבד :) בחיים תזדקק ליכולת לכתוב שאילתות ב-sql, native, ודרך JDBC, hibernate , spring, spring data, אולי אפשר להמשיך ברשימה, אבל הידע שלי מסתיים שם. עכשיו תפסיק לקרוא את המאמר הזה ותבין את MySQL, זה בעצם לא קשה בכלל, אתה צריך להתקין את השרת עצמו, ההגדרות היחידות שם הן כניסה וסיסמא. לאחר מכן קרא באילו פקודות נעשה שימוש בעת העבודה. פקודות לעבודה עם השרת: create , show, use, ואחרות, command help- יתנו רשימה מלאה של פקודות. שאילתות לעבודה עם טבלה ספציפית: select , insert, deleteואחרות. אל תכנסו לעומק, יש סיכוי שרק חלק קטן ייזכר מפשוט קריאת הפקודות. תלמד הכל עם הזמן. אתה יכול לשחק בטרמינל MySQL, ליצור מסד נתונים, ליצור טבלאות, למלא אותם, להגיש בקשה להצגת נתונים, להוסיף קריטריונים לשאילתה. סביר להניח שזה ייקח לך לא יותר מ-2-3 שעות; אם זה ארוך יותר, אל תדאג, עם ניסיון תוכל לשלוט בחומר חדש מהר יותר. אם אין לך בעיות עם הבסיסים, אז אתה יכול להתחיל לפתח את המשחק, על סמך המשחק שכבר כתבתי על טיק-tac-toe. הרבה מאוד זמן לא הצלחתי להבין איך ליישם מרובה משתתפים, מצאתי פתרון בשימוש במסד נתונים. תהליך המשחק מניח ששחקנים מתחלפים, כל השינויים במשחק מתועדים במסד הנתונים. כבר בהתבסס על זה, אנחנו מבינים שיש לנו שחקן ויש מגרש שמכיל קישורים לשחקנים, זה במגרש המשחקים שצריך לקשור את ההיגיון שבו שחקן אחד מחכה שהשחקן השני יעשה מהלך ולאחר מכן התפקידים שלהם משתנים והשחקן הראשון עושה מהלך, והשני מחכה. ומכיוון שכל השינויים חייבים להיות משוכפלים במסד הנתונים, לאחר כל מהלך אנחנו צריכים לשמור את השדה. אז הגענו למסקנה הראשונה, חייב להיות שדה משחק ב-Database ומכיוון שאנחנו מדברים על מרובה משתתפים, אנחנו צריכים להוסיף שם שחקנים. בואו ניצור טבלאות ב-MySQL, עשיתי זאת באופן מקורי, דרך חלון המסוף של mysql. מגרש המשחקים מכיל קישורים לשחקנים, אז זה יהיה הגיוני ליצור תחילה שולחן עם השחקנים. לשחקנים שלנו יש:
  • id- מספר רצף, אנו הופכים אותו למפתח הראשי;
  • name- שם נפוץ, מחרוזת;
  • wins- מספר ניצחונות;
  • loses- מספר נגעים;
  • games- המספר הכולל של המשחקים ששיחקו.
שולחן משחק:
  • id- מספר רצף, אנו הופכים אותו למפתח הראשי;
  • x- מזהה השחקן שמשחק х- מפתח משני;
  • o- מזהה השחקן שמשחק o- מפתח משני;
  • field– השדה עצמו, פורמטו יתואר להלן;
  • status- זה הכרחי כדי שהמרובפלייר יעבוד נכון, הסטטוס מאפיין את מצב המשחק:
    נוצר, משחק, משחק נגמר

  • current- גם עבור מרובה משתתפים, במיוחד במהלך המשחק השדה הזה שולט בתורו של מי עכשיו,
    ואחרי הסיום הוא מכריז על הזוכה או הגרלה

סידרנו את הטבלאות, כעת עלינו ליצור מחלקות Java עם השדות המתאימים - 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 ( גם ויקי ), מצב שינה ישפר קצת את המצב, איתו יהיה לך הרבה פחות חזרתי (תבנית ) קוד. כדי שהמצב שינה יעבוד צריך לחבר ספרייה לפרוייקט, זה נעשה בצורה פשוטה מאוד: Ctrl+Alt+Shift+S(File-Project Structure), עבור ללשונית Libraries, לחץ על "+" והוסף ספרייה שהורדה מראש ( כאופציה, מכאן ). כדי לקשר מחלקות 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")– בשלושת ההערות הללו אנו מציינים ששדה זה הוא שדה זיהוי, הוא נוצר באופן אוטומטי, והעמודה במסד הנתונים נקראת 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, שחיברנו לפרויקט שלנו. לפעולה נכונה, כל מה שנותר הוא למלא את קובץ התצורה 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>
אם תציצו בתגיות, יתברר מה ואיך אנחנו מגדירים כאן. תכונה נוספת של hibernate היא שאם פתאום נחליט לשנות את מסד הנתונים מ-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