対戦型ネットゲームの基本

親と子がネートワークで接続する、対戦型ネットゲームの基本です。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. 親と子がインターネットのホームページから接続して、対戦型ゲームをします。
    サインインの確認から始まり、手番を確かめながら交互にプレイするなど、かなりプログラムは複雑です。
    複雑な割には、完成したプログラムは Java Applet に比べて「パッ」としません。 (;_;)
    今回はページの遷移(せんい)などを説明するだけで、実際のゲームは別のページに譲ります。
  2. プロジェクトのディクトリ構成です。
    C:\tomcat\webapps\ に beans\ のフォルダーを作成してプロジェクトを格納します。
    +:フォルダー, ・:ファイル, *:生成されるファイルです。
    +beans
        +WEB-INF
            +classes
                +mybean
                    ・gameclass.java
                    *gameclass.class
        ・gameguid.jsp
        ・gameopen.jsp
        ・gameplay.jsp
        ・gameclose.jsp
    
  3. ソースプログラムです。
    ファイル名 説明
    gameclass.java 対戦ゲームの Object Class
    gameguid.jsp ゲームの説明と初期化を行う JSP
    gameopen.jsp 対戦相手を待ち合わせる JSP
    gameplay.jsp 交互にプレイする JSP
    gameclose.jsp 対戦成績を確認する JSP
  4. gameclass.java をコンパイルして gameclass.class を作成して下さい。
    C:\Users>cd C:\tomcat\webapps\beans\WEB-INF\classes
    C:\tomcat\webapps\beans\WEB-INF\classes>javac myclass\gameclass.java
  5. "C:\tomcat\bin\tomcat7w.exe" を選択して、管理者として実行から apache-tomcat を起動します。
    WWW ブラウザを起動して下記の URL を張り付けて下さい。
    http://localhost:8080/beans/gameguid.jsp
  6. 最初にサインインすると親で登録されます。
    次に新しいページを開いて、子でサインインして下さい。
    親と子がインターネットに接続して、交互にプレイをします。
    今回はページの遷移(せんい)を説明するのが目的なので、ゲームの部分は省略しています。
    "終了"を選ぶと、対戦成績を確認して Guide に戻ります。

プログラムの説明

  1. 対戦型ネットゲームでは、親と子などがインターネットに接続して、情報を交換しながらゲームを進めます。
    サーバーを介して、お互いに情報を交換しながらゲームを進めるので Java Applet のような即時性はありません。
    JSP では FORM を使って情報を入力するのですが、基本的に選択(入力)された値に従って新しいページに移動します。
    これをページの遷移(せんい)と言います。
    対戦型ネットゲームでは、ページの遷移(せんい)を繰り返してゲームが進行します。
  2. Beans を使うメリットは、このゲームに接続している全てのクライアントに共通の Object Class を提供することです。
    つまり、このゲームの gameclass.class は、サインインしている全てのクライアントに対して一個しか存在しません。
    詳細は Serializable で永続化を確認する を参照して下さい。
    gameclass.class の private int stage; でステージを管理します。
    プレイヤーは ArrayList<String> list; で管理します。
    ゲームのプレイに必要な領域やメソッドは、ゲームの種類ごとに定義して下さい。
  3. クライアント毎の個別情報は、ページが遷移(せんい)する度に、パラメータとして次のページに渡します。
    今回はクライアントを識別するために name パラメータを渡しています。
        <input type="text" name="name"
          <% out.println("value=\"" + name + "\"><br><br>"); %>
    
        String name= request.getParameter("name");
        if (name!=null) name= new String(name.getBytes("8859_1"),"Shift_JIS");
        
  4. JSP プログラムの各々の役割です。
    1. gameguid.jsp
      ゲームの説明とゲームの初期化です。
      ブラウザから起動される時と、gameclose.jsp から [再挑戦/終了] で呼ばれる時があります。
      [再挑戦/終了] の時は、前回のゲームの終了を確認してから、次のゲームを開始します。
    2. gameopen.jsp
      対戦相手を待ち合わせします。
      親と子がサインインするとゲームを開始します。
    3. gameplay.jsp
      ゲームをします。(ゲームの部分は省略しています)
      勝敗が決すると Close を呼びます。
    4. gameclose.jsp
      親と子の対戦成績を確認します。
      [継続/終了] を選び、Guide に戻ります。

プログラムの特記事項

  1. gameguid.jsp はブラウザからゲームを起動する時と、gameclose.jsp から終了を確認する時に呼ばれます。
    gameclose.jsp から呼ばれた時は、親と子の終了を確認してから、次のゲームを開始します。
    name が渡されるのは gameclose.jsp から呼ばれた時だけです。
    これを調べて、親と子の終了確認が終わったことを検知します。
  2. FORM から name==null の値を value で渡すと、String "null" が渡されます。
        <input type="text" name="name"
          <% out.println("value=\"" + name + "\"><br><br>"); %>
        
  3. Open では、有効な name が渡された時にサインインします。
    親と子がサインインするとゲームを開始します。
        if (name!=null && name.equals("null")==false)
        {   // name のサインイン
        
  4. gameplay.jsp で本当はゲームを楽しむのですが、今回はゲームの部分は省略しています。
    腕に自信のある方は、面白いゲームを組み込んで下さい。
    サンプルゲームは 対戦型石取りゲーム などを参照して下さい。
  5. 勝敗の確認が終わったからと言って、片方だけサインアウトしてはいけません。
    遅れた方が Object Class にアクセスするとエラーが発生する場合があります。
    Object Class の更新は、進行のスピード(ステージ)が異なる複数のクライアントのことを考えなければなりません。
  6. 対戦型ネットゲームの難しさは、サインインしている複数のクライアントが、それぞれ勝手にステージを進めることにあります。
    あるクライアントがステージ4の画面を操作していたとしても、遅いクライアントはステージ2を操作しているかも知れません。
    ステージごとにクライアントの到着を待つ方法も考えられますが、待ち合わせが多くなると面白みが半減します。
    そこで操作性を考慮して待ち合わせのポイントを決めるなどの対策が必要になります。

Java Game Program