JavaRush /Java Blog /Random-JA /Java のマルチプレイヤー コンソール ゲーム
timurnav
レベル 21

Java のマルチプレイヤー コンソール ゲーム

Random-JA グループに公開済み
皆さん、こんにちは。ゲームはかなり前に書き終えましたが、まだ記事を書くまでには至っていません。これはこの記事の論理的な続きです まだ何も試していない場合は、 JavaRush タスクよりもゲームに慣れることから始めてください。実際のプロジェクトのテスト タスクの準備を始める必要があります。これには全員が参加することを強くお勧めします。そして一般的には、孤立した領域のプログラマーであることをやめて、Java コア以外の何かを学び始める時期が来ています。単にゲームを視聴するには、MySQL をインストールする必要があります。まだ使用していない場合は、ためらわずにインストールしてください。これは、仕事や個人のプロジェクトで使用するデータベースの 1 つです。データベースのインストールと操作については説明しません。インターネット上にはチュートリアルやビデオが大量にあります。これは自分で理解することをお勧めします。これはプログラマの最も重要なスキルの 1 つでもあります。自分で解決してください:) 人生においては、SQLでネイティブに、そしてJDBC、休止状態、スプリング、スプリングデータを介してクエリを作成する能力が必要になります。おそらくリストは続く可能性がありますが、私の知識はそこで終わります。さて、この記事を読むのをやめて、MySQL について理解してください。実際にはまったく難しいことではありません。サーバー自体をインストールする必要があり、設定はログインとパスワードだけです。次に、作業時にどのようなコマンドが使用されるかを読んでください。 サーバーを操作するためのコマンド: createshowuseなど、 command help- コマンドの完全なリストが表示されます。 特定のテーブルを操作するためのクエリ: selectinsertなどdelete。コマンドを読んだだけではほんの一部しか覚えていない可能性があるため、あまり深く考えすぎないでください。時間が経てばすべてを学ぶことができます。MySQL ターミナルで操作したり、データベースの作成、テーブルの作成、入力、データの表示リクエストの作成、クエリ条件の追加を行うことができます。ほとんどの場合、これには 2 ~ 3 時間もかかりませんが、それより長くても、経験を積めば新しい内容をより早く習得できるようになるので、心配しないでください。ベースに問題がない場合は、三目並べについて既に書いたゲームに基づいてゲームの開発を開始できます。。長い間、マルチプレイヤーを実装する方法がわかりませんでしたが、データベースを使用することで解決策を見つけました。ゲーム プロセスでは、プレイヤーが順番に行動し、ゲーム内のすべての変更がデータベースに記録されることを前提としています。すでにこれに基づいており、プレイヤーがいて、プレイヤーへのリンクを含むプレイフィールドがあることを理解しています。1 人のプレイヤーが 2 番目のプレイヤーが動くのを待つというロジックが結び付けられるのはプレイフィールドです。その後、役割が変わり、最初のプレイヤーが行動し、2 番目のプレイヤーが待機します。また、すべての変更をデータベースに複製する必要があるため、移動するたびにフィールドを保存する必要があります。そこで私たちは最初の結論に達しました。データベースには競技場が存在する必要があり、マルチプレイヤーについて話しているので、そこにプレイヤーを追加する必要があるということです。MySQL でテーブルを作成しましょう。私は mysql ターミナル ウィンドウを使用してネイティブに作成しました。競技場にはプレーヤーへのリンクが含まれているため、最初にプレーヤーを含むテーブルを作成するのが合理的です。 私たちのプレーヤーは以下を備えています:
  • id– シーケンス番号。これを主キーにします。
  • name– 一般名、文字列;
  • wins– 勝利数;
  • loses– 病変の数;
  • games– プレイされたゲームの合計数。
ゲームテーブル:
  • id– シーケンス番号。これを主キーにします。
  • x– プレイしているプレーヤーの ID х– セカンダリキー;
  • o– プレイしているプレーヤーの ID o– セカンダリキー;
  • field– フィールド自体。その形式については以下で説明します。
  • status– これはマルチプレイヤーが正しく動作するために必要です。ステータスはゲームの状態を特徴付けます:
    作成、プレイ中、ゲームオーバー

  • current– マルチプレイヤーでも、特にゲーム中、このフィールドは誰のターンかを制御し、
    終了後に勝者または引き分けを宣言します。

テーブルを整理しました。次に、対応するフィールド -Gameと を含む Java クラスを作成する必要があります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 を使用する必要があります。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")これら 3 つの注釈を使用して、このフィールドが識別フィールドであり、自動的に生成され、データベース内の列が id と呼ばれることを示します。
  • @Column(name = "x")– データベース内の列の名前。
次に、DAO レベルとサービス レベルというレベルを構築する必要があります。すべてを真空状態に単純化すると、データの操作はサービス レベルを経由します。これは抽象化レベルの 1 つであり、アプリケーションをより独立して動作させることができるため、ゲーム ロジックの開発者は詳細に立ち入らなくなります。データベースへのアクセスを設定する場合や、たとえば、突然単純な休止状態の代わりに 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();
            }
        }
    }
}
これは、データベースに新しいユーザーを追加する操作の様子です。エンティティ クラスのオブジェクトのみがメソッドに渡されることに注意してください。ここでは追加情報は必要ありません。これは、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 のもう 1 つの特徴は、突然データベースを 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;
    }
}
そして、これはサービスレベルメソッドの1つです
public class UserService {
    static void setUserBusy(User user){
        user.setBusy(true); //делаем его занятым
        //и обновляем его в БД
        Factory.getInstance().getUserDAO().updateUser(user);
    }

}
データベースを操作するためのコードが完成したので、変更を考慮してゲーム ロジックを書き直します。まず、メインの起動メソッドを別のクラスに分離しましょうMain。これは、ゲームを開始したり統計を表示したりできるゲーム メニューであるコントロール クラスのみになります。GameLogicゲームのすべてのロジックと競技場をチェックするクラスを作成しましょう。彼は、試合後の競技場とプレーヤーの統計に関するすべての変更の保存をサービス層に委任します。興味深い機能があります。配列の形式で競技フィールドが含まれており、データベースに保存できますが、この段階では車輪を再発明することにしました。データベースではフィールドは int、つまり 9 として含まれています。 -桁の数値。クラス メソッドを使用して 2 つで解析されますGameLogic。これはお勧めしません。ゲームの次のリリースでは改善します :) JAVA の学習を頑張ってください。プロジェクトはここからダウンロードできます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION