JavaRush /Java Blog /Random-TW /java 中的多人控制台遊戲
timurnav
等級 21

java 中的多人控制台遊戲

在 Random-TW 群組發布
大家好,我早就寫完了遊戲,但還沒抽出時間來寫文章,算是這篇文章的順理成章的延續吧 如果你還沒有嘗試過做其他的事情比JavaRush任務,那麼熟悉遊戲將正是您想要開始的地方,您將需要開始準備真實專案的測試任務,我強烈建議大家參加。總的來說,是時候停止在真空中成為球形程式設計師並開始學習 java 核心之外的東西了。為了簡單地觀看比賽,您必須安裝 MySQL,如果您還沒有使用它,請不要猶豫 - 安裝它,這是您將在工作和個人專案中使用的資料庫之一!我不會描述如何安裝和使用資料庫;網路上有大量的教學和影片;我建議您自己解決這個問題,這也是程式設計師最重要的技能之一 - 計算自己解決:) 在生活中,您將需要能夠在本機中使用sql 編寫查詢,並透過JDBC、hibernate、spring、spring data,也許這個清單可以繼續,但我的知識就到此為止。現在別再讀這篇文章了,要弄清楚MySQL,其實一點也不難,你需要安裝伺服器本身,唯一的設定就是登入名稱和密碼。然後了解工作時使用哪些指令。 使用伺服器的命令: createshowuse和其他命令help- 將給予完整的命令列表。 使用特定表格的查詢: selectinsertdelete其他。不要太深入,僅僅閱讀命令有可能只記住一小部分。隨著時間的推移,你會學到一切。你可以在MySQL終端機玩,建立資料庫,建立表,填滿它們,發出顯示資料的請求,加入查詢條件。最有可能的是,這不會超過 2-3 小時;如果更長,也不必擔心,隨著經驗的積累,你會更快地掌握新材料。如果你的基礎沒有問題,那麼你可以開始開發遊戲,基於我已經寫過的關於井字棋的遊戲。很長一段時間我不知道如何實現多人遊戲;我找到了使用資料庫的解決方案。遊戲過程假設玩家輪流進行,遊戲中的所有變化都記錄在資料庫中。已經基於此,我們知道我們有一個玩家,並且有一個包含玩家連結的比賽場地,在比賽場地中,應該將一個玩家等待第二個玩家採取行動的邏輯聯繫起來之後他們的角色發生變化,第一個玩家採取行動,第二個玩家等待。由於所有變更都必須在資料庫中複製,因此每次移動後我們都需要儲存該欄位。所以我們得出第一個結論,資料庫中必須有一個比賽場地,並且由於我們正在談論多人遊戲,因此我們需要在那裡添加玩家。讓我們在 MySQL 中建立表,我是透過 mysql 終端機視窗本地完成的。比賽場地包含與球員的鏈接,因此首先創建一個包含球員的表是合乎邏輯的。 我們的球員有:
  • id– 序號,我們將其設為主鍵;
  • name– 通用名稱、字串;
  • wins– 勝利次數;
  • loses– 病灶數;
  • games– 玩過的遊戲總數。
遊戲桌:
  • id– 序號,我們將其設為主鍵;
  • x– 玩遊戲的玩家 ID х– 輔助鍵;
  • o– 玩遊戲的玩家 ID o– 輔助鍵;
  • field– 欄位本身,其格式將在下面描述;
  • status– 這是多人遊戲正常運作所必需的,狀態表徵了遊戲的狀態:
    已創建、正在玩、遊戲結束

  • current– 也適用於多人遊戲,特別是在遊戲過程中,該字段控制現在輪到誰,
    並在結束後宣布獲勝者或平局

我們已經整理好了表格,現在我們需要建立具有相應欄位的 Java 類別 -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;
}
讓我們新增一個不帶參數的空建構函式 - 用於使用資料庫和另一個用於建立物件的建構函式。讓我們為所有字段添加 setter 和 getter。現在讓我們來處理休眠:)它並沒有變得越來越容易。它比 MySQL 稍微複雜一些,我將快速瀏覽一下一般結構。再說一遍,並不是所有事情都那麼複雜,透過任何教程都可以在幾個小時內學習基礎知識,並且最好在編寫專案時深入學習。從 JAVA 處理資料庫涉及使用 JDBC,請在wiki上閱讀相關內容。但如果你在寫程式碼時使用它,它會帶來很多麻煩,寫 DAO 類別(也是 wiki)會有些複雜,hibernate 會稍微改善這種情況,有了它你的重複性就會少很多(模板)代碼。為了讓 hibernate 運作,您需要將一個庫連接到項目,這非常簡單:Ctrl+Alt+Shift+S(檔案-項目結構),前往「庫」選項卡,點擊「+」並新增預先下載的庫(作為一個選項,從這裡)。為了連結類,UserGame需要使用註解 - 它們非常易於使用,使用它們,程式碼如下所示:
@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 而不是簡單的hibernate,那麼更改將不會超出服務層,否則一半的應用程式將不得不重寫!這是設計模式之一。讓我們開始編寫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 -digit數字,使用類別方法進行兩次解析GameLogic,我不建議這樣做,我會在遊戲的下一個版本中改進:)祝大家學習JAVA好運!您可以在此處下載該項目。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION