JavaRush /จาวาบล็อก /Random-TH /เกมคอนโซลผู้เล่นหลายคนใน Java
timurnav
ระดับ

เกมคอนโซลผู้เล่นหลายคนใน Java

เผยแพร่ในกลุ่ม
สวัสดีทุกคน ฉันเขียนเกมนี้จบไปนานแล้วแต่ยังไม่ได้เขียนบทความเลย ถือว่าเขียนต่อไปอย่างมีเหตุผลหาก คุณยังไม่ได้ลองทำอะไรอย่างอื่นเลย กว่างาน JavaRush การทำความคุ้นเคยกับเกมจะเป็นจุดที่คุณต้องการเริ่มต้นคุณจะต้องเริ่มเตรียมตัวสำหรับงานทดสอบของโปรเจ็กต์จริงซึ่งฉันขอแนะนำให้ทุกคนเข้าร่วม และโดยทั่วไป ถึงเวลาที่จะเลิกเป็นโปรแกรมเมอร์แบบ spherical ในสุญญากาศ และเริ่มเรียนรู้บางอย่างนอกเหนือจาก java-core ในการรับชมเกมเพียงอย่างเดียว คุณต้องติดตั้ง MySQL หากคุณยังไม่ได้ใช้ อย่าลังเลที่จะติดตั้ง นี่คือหนึ่งในฐานข้อมูลที่คุณจะใช้ในงานและโครงการส่วนตัวของคุณ! ฉันจะไม่ให้คำอธิบายเกี่ยวกับการติดตั้งและการทำงานกับฐานข้อมูล มีบทช่วยสอนและวิดีโอมากมายบนอินเทอร์เน็ต ฉันขอแนะนำให้ค้นหาสิ่งนี้ด้วยตัวคุณเอง นี่เป็นหนึ่งในทักษะที่สำคัญที่สุดของโปรแกรมเมอร์ - การหา ออกมาด้วยตัวคุณเอง :) ในชีวิตคุณจะต้องมีความสามารถในการเขียนแบบสอบถามใน sql, Natively และผ่าน JDBC, ข้อมูล ไฮเบอร์เนต , สปริง, สปริง บางทีรายการสามารถดำเนินต่อไปได้ แต่ความรู้ของฉันก็จบลงที่นั่น ตอนนี้หยุดอ่านบทความนี้และค้นหา MySQL จริงๆ แล้วมันไม่ได้ยากเลย คุณต้องติดตั้งเซิร์ฟเวอร์เอง การตั้งค่าเดียวคือการเข้าสู่ระบบและรหัสผ่าน จากนั้นอ่านเกี่ยวกับคำสั่งที่ใช้เมื่อทำงาน คำสั่งสำหรับการทำงานกับเซิร์ฟเวอร์: create , show, use, และอื่น ๆ , command help- จะให้รายการคำสั่งทั้งหมด แบบสอบถามสำหรับการทำงานกับตารางเฉพาะ: select , insertและdeleteอื่น ๆ อย่าลงลึกเกินไป มีโอกาสเพียงส่วนเล็กๆ เท่านั้นที่จะจำได้จากการอ่านคำสั่งง่ายๆ คุณจะได้เรียนรู้ทุกสิ่งเมื่อเวลาผ่านไป คุณสามารถเล่นในเทอร์มินัล MySQL สร้างฐานข้อมูล สร้างตาราง กรอกข้อมูล ส่งคำขอเพื่อแสดงข้อมูล เพิ่มเกณฑ์การสืบค้น เป็นไปได้มากว่าคุณจะใช้เวลาไม่เกิน 2-3 ชั่วโมง หากนานกว่านี้ ไม่ต้องกังวล ด้วยประสบการณ์ คุณจะเชี่ยวชาญเนื้อหาใหม่ได้เร็วขึ้น หากคุณไม่มีปัญหากับฐานคุณสามารถเริ่มพัฒนาเกมได้โดยอิงจากเกมที่ฉันเขียนเกี่ยวกับโอเอกซ์ แล้ว. เป็นเวลานานมากที่ฉันไม่สามารถหาวิธีใช้งานผู้เล่นหลายคนได้ ฉันพบวิธีแก้ปัญหาในการใช้ฐานข้อมูล กระบวนการของเกมถือว่าผู้เล่นผลัดกัน การเปลี่ยนแปลงทั้งหมดในเกมจะถูกบันทึกไว้ในฐานข้อมูล ตามนี้แล้ว เราเข้าใจดีว่าเรามีผู้เล่นและมีสนามแข่งขันที่มีลิงก์ไปยังผู้เล่น มันอยู่ในสนามแข่งขันที่ตรรกะควรผูกติดอยู่กับที่ผู้เล่นคนหนึ่งกำลังรอให้ผู้เล่นคนที่สองทำการเคลื่อนไหว และหลังจากนั้นบทบาทของพวกเขาก็เปลี่ยนไป และผู้เล่นคนแรกทำการเคลื่อนไหว และคนที่สองรอ และเนื่องจากการเปลี่ยนแปลงทั้งหมดจะต้องทำซ้ำในฐานข้อมูล หลังจากการย้ายแต่ละครั้ง เราจึงต้องบันทึกฟิลด์ ดังนั้นเราจึงมาถึงข้อสรุปแรก ต้องมีสนามแข่งขันในฐานข้อมูล และเนื่องจากเรากำลังพูดถึงผู้เล่นหลายคน เราจึงต้องเพิ่มผู้เล่นที่นั่น มาสร้างตารางใน 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;
}
มาเพิ่มคอนสตรัคเตอร์ว่างที่ไม่มีพารามิเตอร์ - สำหรับการทำงานกับฐานข้อมูลและคอนสตรัคเตอร์อื่นที่เราจะสร้างวัตถุ มาเพิ่ม setters และ getters สำหรับทุกฟิลด์กัน ทีนี้มาจัดการกับไฮเบอร์เนตกันดีกว่า :) มันไม่ง่ายไปกว่านี้อีกแล้วในแต่ละชั่วโมง มันซับซ้อนกว่า MySQL เล็กน้อย ฉันจะอธิบายโครงสร้างทั่วไปอย่างรวดเร็ว ขอย้ำอีกครั้ง ไม่ใช่ทุกอย่างจะซับซ้อนนัก คุณสามารถเรียนรู้พื้นฐานผ่านบทช่วยสอนใดๆ ได้ภายในสองสามชั่วโมง และควรศึกษาเชิงลึกในขณะที่เขียนโครงการของคุณจะดีกว่า การทำงานกับฐานข้อมูลจาก JAVA เกี่ยวข้องกับการใช้ JDBC อ่านเกี่ยวกับเรื่องนี้ในwiki แต่ถ้าคุณใช้มันในการเขียนโค้ด มันจะทำให้เกิดความเจ็บปวดอย่างมากในทวารหนัก ความซับซ้อนในการเขียนคลาส DAO ( รวมถึงวิกิด้วย ) ไฮเบอร์เนตจะปรับปรุงสถานการณ์เล็กน้อย โดยที่คุณจะต้องทำซ้ำน้อยลงมาก (เทมเพลต ) รหัส เพื่อให้ไฮเบอร์เนตทำงานได้ คุณต้องเชื่อมต่อไลบรารีเข้ากับโปรเจ็กต์ ซึ่งทำได้ง่ายมาก: 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")– ด้วยคำอธิบายประกอบทั้งสามนี้ เราแสดงว่าฟิลด์นี้เป็นฟิลด์การระบุ ซึ่งถูกสร้างขึ้นโดยอัตโนมัติ และคอลัมน์ในฐานข้อมูลเรียกว่า id
  • @Column(name = "x")– ชื่อของคอลัมน์ในฐานข้อมูล
ถัดไป คุณต้องสร้างระดับ - ระดับ DAO และระดับการบริการ หากเราทำให้ทุกอย่างง่ายขึ้นในสภาวะสุญญากาศ จากนั้นการทำงานกับข้อมูลจะต้องผ่านระดับการบริการ นี่เป็นหนึ่งในระดับนามธรรม ซึ่งช่วยให้คุณทำให้แอปพลิเคชันทำงานได้อย่างอิสระมากขึ้น เพื่อให้ผู้พัฒนาตรรกะของเกมไม่ได้ลงรายละเอียด ของการตั้งค่าการเข้าถึงฐานข้อมูล หรือตัวอย่างเช่น หากจู่ๆ เราตัดสินใจใช้ Spring แทนการจำศีลแบบธรรมดา การเปลี่ยนแปลงจะไม่ไปไกลกว่าชั้นบริการ โดยที่แอปพลิเคชันจะต้องถูกเขียนใหม่ครึ่งหนึ่ง! นี่เป็นหนึ่งในรูปแบบการออกแบบ มาเริ่มเขียนระดับ 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();
            }
        }
    }
}
นี่คือลักษณะของการดำเนินการเพิ่มผู้ใช้ใหม่ลงในฐานข้อมูล โปรดทราบว่าเฉพาะ object ของคลาสเอนทิตีเท่านั้นที่จะถูกส่งผ่านไปยังเมธอด โดยไม่ต้องการข้อมูลเพิ่มเติมที่นี่ สิ่งนี้รับประกันได้ว่าเราได้รับเซสชันการสื่อสารสำเร็จรูปพร้อมฐานข้อมูลจากคลาส 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