⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameserver.java

📁 一款JAVA网络格斗游戏
💻 JAVA
字号:
/**
   游戏服务器类,负责控制游戏规则,为客户端提供
   游戏控制信息
   Download by http://www.codefans.net
 **/

package game.multiplayer;

import java.net.*;
import java.util.*;

public class GameServer {

  //player1的当前X坐标位置
  static int player1 = 0;
  //player2的当前X坐标位置
  static int player2 = 140;
  //player1的当前动作状态("go" 或者“hit”)
  static String player1State = null;
  //player2的当前动作状态("go" 或者“hit”)
  static String player2State = null;
  //player1的当前积分
  static int player1Scope = 0;
  //player2的当前积分
  static int player2Scope = 0;
  //存储玩家的向量对象
  static Vector playerVector = new Vector();

  //客户端UDP请求的处理者
  class UDPRequestHandler
      implements java.lang.Runnable {

    String clientRequire;
    DatagramSocket serverSocket;
    InetAddress ipAddress;
    int port;

    public UDPRequestHandler(String clientRequire, DatagramSocket serverSocket,
                             InetAddress ipAddress, int port) {
      this.clientRequire = clientRequire;
      this.serverSocket = serverSocket;
      this.ipAddress = ipAddress;
      this.port = port;
    }

    //监听客户端UDP请求线程主方法
    public void run() {
      try {
        UDPServerListener();
      }
      catch (Exception ex) {
        ex.printStackTrace();
      }
    }

    //监听客户端UDP请求
    void UDPServerListener() throws Exception {

      //应答客户端UDP请求状态串
      String ackclientRequire = null;

      //发送数据字节数组
      byte[] sendData;

      //解析客户端UDP请求命令串
      int position = clientRequire.indexOf(":");
      if (position != -1) {

        String currentPlayer = clientRequire.substring(0, position);
        String currentCmd = clientRequire.substring(position + 1,
            clientRequire.length());

        //处理player1的命令串
        if (currentPlayer.equals("player1")) {
          System.out.println("clientRequire= " + clientRequire);
          //判断player1的当前状态
          if (currentCmd.equals("go")) {
            if ( (player1 + 30) < player2) {
              player1 = player1 + 2;
            }
            //设置player1的当前状态为“go”
            player1State = "go";
          }
          else if (currentCmd.equals("hit")) {
            //设置player1的当前状态为“hit”
            player1State = "hit";
          }
          else if (currentCmd.equals("pause")) {
            //设置player1的当前状态为“go”
            player1State = "go";
          }
          else if (currentCmd.equals("reset")) {

            //重置所有player状态
            reset();

          } //处理player1后退命令
          else if (currentCmd.equals("back")) {
            if (player1 > 2) {
              player1 = player1 - 2;
            }
            //设置player1的当前状态为“go”
            player1State = "go";

          } //处理player1积分命令
          else if (currentCmd.equals("scope")) {

            if (player1Scope < 100) {
              player1Scope = player1Scope + 5;
            }
            else {
              player1Scope = 0;
            }
            player1State = "go";

          }

        } //处理player2的命令串
        else if (currentPlayer.equals("player2")) {

          if (currentCmd.equals("go")) {

            if ( (player1 + 30) < player2) {
              player2 = player2 - 2;
            }
            //设置player2的当前状态为“go”
            player2State = "go";
          }
          else if (currentCmd.equals("hit")) {

            //设置player2的当前状态为“hit”
            player2State = "hit";
          }
          else if (currentCmd.equals("pause")) {
            //设置player2的当前状态为“go”
            player2State = "go";
          }
          else if (currentCmd.equals("reset")) {

            //重置所有player状态
            reset();
          } //处理player2后退命令
          else if (currentCmd.equals("back")) {
            System.out.println("player2= " + player2);
            if (player2 < 140) {
              player2 = player2 + 2;
            }
            player2State = "go";

          } //处理player2积分命令
          else if (currentCmd.equals("scope")) {
            if (player2Scope < 100) {
              player2Scope = player2Scope + 5;
            }
            else {
              player2Scope = 0;
            }
            player2State = "go";
          }

        }

        //处理player注销请求
        if (currentCmd.equals("logout")) {

          logout(currentPlayer);
        }

        //组合应答状态串
        ackclientRequire = player1 + "," + player2 + ":" + player1State + "," +
            player2State + "?" + player1Scope + "," + player2Scope;
      } //处理来自客户端的加入请求
      else if (clientRequire.equals("attend")) {
        if (playerVector.size() < 2) {
          if (playerVector.size() > 0) {
            String playerName = (String) playerVector.firstElement();
            if (playerName != null) {
              if (playerName.equals("player1")) {
                ackclientRequire = "player2";
              }
              else {
                ackclientRequire = "player1";
              }
            }
          }
          else {
            ackclientRequire = "player1";
          }
          playerVector.addElement(ackclientRequire);
        }
        else { //控制玩家人数最多为2个
          playerVector.removeAllElements();
          ackclientRequire = "player1";
          playerVector.addElement(ackclientRequire);
        }

        if (ackclientRequire.equals("player1")) {
          player1State = "go";
        }
        else {
          player2State = "go";
        }

      }
      else if (clientRequire.equals("query")) {
        //组合应答状态串
        ackclientRequire = player1 + "," + player2 + ":" + player1State + "," +
            player2State + "?" + player1Scope + "," + player2Scope;

      }

      //发送应答状态串
      sendData = ackclientRequire.getBytes();

      DatagramPacket sendPacket = new DatagramPacket(
          sendData, sendData.length, ipAddress, port);
      serverSocket.send(sendPacket);
    }

  }

  //重置服务器状态
  private void reset() {

    player1State = "go";
    player2State = "go";
    player1 = 0;
    player2 = 140;
    player1Scope = 0;
    player2Scope = 0;

  }

  //处理客户端注销请求
  private void logout(String currentPlayer) {
    if (currentPlayer.equals("player1")) {
      playerVector.remove("player1");
      player1State = "null";
      player1 = 0;
      player1Scope = 0;
    }
    else if (currentPlayer.equals("player2")) {
      playerVector.remove("player2");
      player2State = "null";
      player2 = 140;
      player2Scope = 0;
    }
  }

  //游戏服务器主方法
  public static void main(String args[]) throws Exception {

    GameServer gameServer = new GameServer();
    /* 打开一个数据报文套接口 5188 */
    DatagramSocket serverSocket = new DatagramSocket(5188);

    //监听客户端UDP请求命令串
    String clientRequire = null;

    //申请缓冲内存用来收发数据
    byte[] receiveData = new byte[1024];

    //绑定一个packet 对象用来接收数据
    DatagramPacket packet = new DatagramPacket(receiveData,
                                               receiveData.length);
    //循环监听来自客户端的UDP请求
    while (true) {

      // 监听客户端的请求,没有请求则在这里等待
      serverSocket.receive(packet);

      //获取数据包的来源地址与端口号
      InetAddress ipAddress = packet.getAddress();
      int port = packet.getPort();

      //接收来自客户端UDP请求数据包
      clientRequire = new String(packet.getData(), 0, packet.getLength());
      gameServer.start(clientRequire, serverSocket, ipAddress, port);

    }

  }

  //启动服务器
  void start(String clientRequire, DatagramSocket serverSocket,
             InetAddress ipAddress, int port) {
    {

      new java.lang.Thread(new UDPRequestHandler(clientRequire, serverSocket,
                                                 ipAddress, port)).start();

    }

  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -