游戏代码部分-------game包------GameFrame.java

来源:互联网 发布:ios旧版手机淘宝 编辑:程序博客网 时间:2024/05/22 17:32
package game;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import dialog.*;
import server.*;
import client.*;
import net.*;
/**
 *组织游戏运行的类
 * @see <a href="MenuBar.html">MenuBar</a>
 * @see <a href="ActionHandler.html">ActionHandler</a>
 * @see <a href="Tetrics.html">Tetrics</a>
 * @see <a href="ChatBar.html">ChatBar</a>
 * @see <a href="../server/MyServer.html">MyServer</a>,<a href="../client/Client.html"> MyClient</a>
 * @see <a href="PieceBuffer.html">PieceBuffer</a>
 * @see <a href="Producer.html">Producer</a>
 */
public class GameFrame extends JFrame implements Net {

  private  Container container1;
  private  Color BackColor=new Color(80,123,166);
  /**菜单栏*/
  private ActionHandler actionlistener=new ActionHandler(this);
  private MenuBar m_mMenuBar=new MenuBar(actionlistener);
  /**游戏panel*/
  private  Tetrics m_pTetricsPanel;
  /**聊天Panel*/
  private  ChatBar m_pChatPane;
  /**服务器类*/
  private  MyServer m_server;
  /**客户机类*/
  private  MyClient m_client;
  /**当前网络状态*/
  private  int m_nNetStatus=NOCONNECT;
  /**缓冲存放Piece*/
  //PieceBuffer m_PieceBuffer=new PieceBuffer();
  private PieceBuffer m_PieceBuffer=new PieceBuffer();
  /**生产线程生,产出Piece放入缓冲*/
  private Producer  m_Producer=null;
/**
 *  Construct the frame
 */
public GameFrame() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
      myInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  /**
   * Component initialization
   * @throws java.lang.Exception
   */
  private void jbInit() throws Exception  {
    this.setBackground(BackColor);
    this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
    container1=this.getContentPane();
    this.setSize(new Dimension(650, 620));
    this.setTitle("毕业设计:基于Internet的Game2D--网络版的俄罗斯方块游戏(作者:赵建川)");
    this.setResizable(false);
  }
  /**
 * 将ChatBar Panel和Tetrics Panel加入到TetricsFrame中
 */
private void myInit()
{
  //constructMenuBar();
   this.setJMenuBar(m_mMenuBar);
   JPanel Game2D=new JPanel();
   Game2D.setLayout(null);
   m_pTetricsPanel = new Tetrics(this);
   m_pTetricsPanel.setBounds(new Rectangle(0, 0, 800, 430));
   m_pChatPane = new ChatBar(this);
   m_pChatPane.setBounds(new Rectangle(0, 430, 800, 200));
   Game2D.add(m_pTetricsPanel);
   Game2D.add(m_pChatPane);
   container1.add(Game2D);
}
/**
 * 用来在ChatBar里显示现在的联网状况
 * @param str 在本机上显示发送给对方的聊天信息
 */
public void showMessage(String str)
{
    m_pChatPane.appendStr(str+"/n");
}
  /**
   * 从对方读来字符串时,进行解析
   * @param str 读来的字符串
   */
  public void readStr(String str)
  {
    if (str!=""&&str!=null)
    {
      int nStrPre2;
      try {
        nStrPre2 = Integer.parseInt(str.substring(0, 2));
        switch (nStrPre2) {
          case STARTGAME:
            m_pTetricsPanel.getPieceBuffer(m_PieceBuffer);
            m_pTetricsPanel.start();
            str = str.substring(3, str.length());
            m_pChatPane.appendStr("对手:" + str + "/n");
            break;
          case PAUSEGAME:
            m_pTetricsPanel.pause();
            str = str.substring(3, str.length());
            m_pChatPane.appendStr("对手:" + str + "/n");
            break;
          case ENDGAME:
            m_pTetricsPanel.stop();
            this.m_PieceBuffer.clearpbuffer();
            str = str.substring(3, str.length());
            m_pChatPane.appendStr("对手:" + str + "/n");
            break;
          case EXITGAME:
            str = str.substring(3, str.length());
            m_pChatPane.appendStr("对手:" + str + "/n");
            m_pTetricsPanel.stop();
            if(this.m_nNetStatus==Net.SERVER)
              this.m_Producer.stopProduce();
            stopConnect();
            m_nNetStatus=NOCONNECT;
            m_pTetricsPanel.setNetStatus(NOCONNECT);
            break;
          case GAMEPIECE:
            str = str.substring(3, str.length());
            m_PieceBuffer.put(Integer.parseInt(str));
            break;
          case GAMEDATA:
            str = str.substring(3, str.length());
            this.m_pTetricsPanel.receRivalGameData(str);
            break;
          case GAMESCORE:
            str = str.substring(3, str.length());
            m_pTetricsPanel.setRivalScore(Integer.parseInt(str));
            break;
          case GAMEOVER:
            m_pTetricsPanel.setGameInPlay(false);
            m_pTetricsPanel.setWin(1);
            str = str.substring(3, str.length());
            m_pChatPane.appendStr("对手:" + str + "分/n");
            break;
          case GAMEREMOVELINE:
            int line;
            str = str.substring(3, str.length());
            line=Integer.parseInt(str);
            for(int i=0;i<line;i++)
              m_pTetricsPanel.addRandomLine();
            break;
          case TALK:
            str = str.substring(3, str.length());
            m_pChatPane.appendStr("对手:" + str + "/n");
            break;
          case EXITCONN:
            str = str.substring(3, str.length());
            m_pChatPane.appendStr("对手:" + str + "/n");
            stopConnect();
            break;
          case GAMELEVEL:
            str = str.substring(3, str.length());
            int Level=Integer.parseInt(str);
            m_pTetricsPanel.setPlayLevel(Level);
            m_pChatPane.appendStr("对手:更改游戏级别" + str + "/n");
            break;
          case BUFFERCLEAR:
            m_PieceBuffer.clearpbuffer();
            break;
          default:
            m_pChatPane.appendStr("对手:" + str + "/n");
            break;
        }
      }
      catch (Exception e) {
        //先这么做着
        //System.out.println("数据有错!--TetricsFrame.readStr(String str)");
      }
    }
    //else
      //System.out.println("没有");
  }
  /**
   * 将信息发送给对方
   * @param str 要发送的字符串
   */
public void sendStr(String str)
{
    switch(m_nNetStatus)
    {
        case SERVER:
            if(m_server!=null)
                m_server.writeStr(str+"/n");
            break;
        case CLIENT:
            if(m_client!=null)
                m_client.writeStr(str+"/n");
            break;
        case NOCONNECT:
          break;
        default:
          m_pChatPane.appendStr("自己:"+str+"/n");
          break;
    }
}
  /**
   * 启动游戏
   */
  public void startGame()
  {
    switch (m_nNetStatus)
    {
      case CLIENT:
        warningDialog(this,"作为客户端无权开启游戏,只有服务器端才能开始游戏!");
        break;
      case SERVER:
        if (!m_server.getbConnDone())
        {
          this.warningDialog(this, "请等待其他玩家加入后再可以游戏");
          break;
        }
        m_PieceBuffer.clearpbuffer();
        m_PieceBuffer.initPBuffer(500);
        m_pTetricsPanel.getPieceBuffer(m_PieceBuffer);//游戏取得m_pTetricsPanel
        sendStr(""+ BUFFERCLEAR+":"+"I清空缓冲");
        for(int i=0;i<500;i++)    //传给对方
          sendStr(GAMEPIECE+":"+m_PieceBuffer.pbuffer[i]);
        m_Producer = new Producer(this,m_PieceBuffer);
        sendStr(STARTGAME+":"+"开始游戏");
        showMessage("开始游戏");
        try{
        m_Producer.start();
        m_pTetricsPanel.start();
       }catch(Exception e){}
        break;
      case NOCONNECT:
        m_PieceBuffer.clearpbuffer();
        m_PieceBuffer.initPBuffer(500);
        m_pTetricsPanel.getPieceBuffer(m_PieceBuffer);//游戏取得m_pTetricsPanel
        m_Producer = new Producer(this,m_PieceBuffer);
        showMessage("开始游戏");
        try{
        m_Producer.start();
        m_pTetricsPanel.start();
      }catch(Exception e){}
        break;
    }
  }
  /**
   * 暂停游戏
   */
  public  void pauseGame()
  {
    switch (m_nNetStatus)
    {
      case CLIENT:
        warningDialog(this,"作为客户端无权暂停游戏,只有服务器端才能暂停游戏!");
        break;
      case SERVER:
        if (!m_pTetricsPanel.getGameInPlay()) {
          warningDialog(this, "游戏没有开启,无法暂停游戏!");
        }
        else {
          sendStr(PAUSEGAME + ":" + "暂停游戏");
          showMessage("暂停游戏");
          m_pTetricsPanel.pause();
        }
        break;
      case NOCONNECT:
        if (!m_pTetricsPanel.getGameInPlay()) {
          warningDialog(this, "游戏没有开启,无法暂停游戏!");
        }
        else {
          showMessage("暂停游戏");
          m_pTetricsPanel.pause();
        }

        break;
    }
  }
  /**
   * 结束游戏
   */
  public  void endGame()
  {
    switch ( m_nNetStatus)
    {
      case CLIENT:
        warningDialog(this,"作为客户端无权结束游戏,只有服务器端才能结束游戏");
        break;
      case SERVER:
        if (!m_pTetricsPanel.getGameInPlay()) {
          warningDialog(this, "游戏没有开启,无法结束游戏!");
        }
        else {
          sendStr(ENDGAME+":"+"结束游戏");
          showMessage("结束游戏");
          m_Producer.stopProduce();
          m_pTetricsPanel.stop();
          m_PieceBuffer.clearpbuffer();
        }
        break;
      case NOCONNECT:
        if (!m_pTetricsPanel.getGameInPlay()) {
          warningDialog(this, "游戏没有开启,无法结束游戏!");
        }
        else {
          showMessage("结束游戏");
          m_Producer.stopProduce();
          m_pTetricsPanel.stop();
          m_PieceBuffer.clearpbuffer();
        }
        break;
    }
  }
  /**
   * 退出游戏程序
   */
  public  void exitGame()
  {
    /**控制关闭游戏的代码加到这儿.*/
    switch ( m_nNetStatus)
   {
     case CLIENT:
       sendStr(EXITGAME + ":" + "已经退出游戏");
       m_pTetricsPanel.stop();
     case SERVER:
       sendStr(EXITGAME + ":" + "已经退出游戏");
       m_pTetricsPanel.stop();
       stopConnect();
       break;
     case NOCONNECT:
       //m_Producer.stopProduce();
       m_pTetricsPanel.stop();
       break;
   }
   System.exit(0);
  }
  /**
   * 设置级别
   */
  public  void setLevel()
  {
    if(m_pTetricsPanel.getGameInPlay())
    {
      showMessage("游戏正在玩,请在游戏没有开始前设置级别!");
      return;
    }
    if(m_nNetStatus==CLIENT)
    {
      this.warningDialog(this, "客户端无权更改游戏级别!");
      return;
    }
    int Level=5;
    try{
      Level=Integer.parseInt(JOptionPane.showInputDialog("输入游戏的级别!注意:1-11之间"));
      if(Level>=1&&Level<=10)
      {
        this.m_pTetricsPanel.setPlayLevel(Level);
      }
      else{
        showMessage("输入级别不在范围内!");
      }
      if(m_nNetStatus==SERVER)
        sendStr(GAMELEVEL+":"+Level);
    }catch(Exception e)
    {
      showMessage("输入有错误!");
    }
  }
  /**
   * 创建游戏,创建游戏后就可变为服务器端
   */
  public  void createGame()
  {
    switch ( m_nNetStatus)
    {
      case CLIENT:
      warningDialog(this,"作为客户端无权创建游戏请先退出客户端");
        break;
      case SERVER:
        warningDialog(this,"你已经创建了游戏!");
        break;
      case NOCONNECT:
         m_server = new MyServer(this);
         m_server.start();
         if(m_server.getServerDone())
         {
           m_nNetStatus = SERVER;
           showMessage("开始监听等待其他玩家加入");
         }
        break;
    }
  }
  /**
   * 加入游戏
   */
  public  void addGame()
  {
    switch (m_nNetStatus)
    {
      case CLIENT:
        warningDialog(this,"你已经加入了一个游戏,请先退出再加入其他游戏");
        break;
      case SERVER:
        warningDialog(this,"你已经建立了一个游戏,请先退出再加入其他游戏");
        break;
      case NOCONNECT:
        String strConn;
        strConn=JOptionPane.showInputDialog("连接对方输入对方的IP地址或者机器名");
        this.setClient(strConn);
        break;
    }

  }
  /**
   *退出游戏,主要是退出连网状态,断开与对方的连接并结束游戏
   */
  public  void exitConn()
  {
    if(m_pTetricsPanel.getGameInPlay())
    {
      warningDialog(this,"游戏正在进行中,不能推出连接!");
      return;
    }
    switch ( m_nNetStatus)
    {
      case CLIENT:
      case SERVER:
        sendStr(EXITCONN + ":" + "已经退出连接");
        showMessage("退出连接");
        stopConnect();
        break;
      case NOCONNECT:
        break;
    }

  }
  /**
  * 查看记录分数
  */
  public  void seeRecord()
  {
   RecordDialog jd=new RecordDialog("Recordset.txt");
   jd.setSize(300,300);
   jd.setLocation(100, 100);
   jd.show();
  }
  /**
  * 查看关于制作的情况
  */
  public  void seeAbout()
  {
   //System.out.println("关于");
   Dialog d = new Dialog( this, "关于");
   d.add(new AboutPanel(d));
   d.setSize(430, 230);
   d.setLocation(100, 100);
   d.show();
  }
  /**
   * 中断网络连接
   */
  public  void stopConnect()
   {
     switch (m_nNetStatus)
     {
       case CLIENT:
         m_client.close();
         break;
       case SERVER:
         m_server.close();
         m_server.setConnDone(false);
         break;
     }
     m_nNetStatus =NOCONNECT;
     this.m_pTetricsPanel.setNetStatus(NOCONNECT);
   }
  /**
   * 取得网络状态
   * @return m_nNetStatus  网络状态
   */
  public int getNetStatus()
  {
    return m_nNetStatus;
  }
  /**
   * 实例 m_client 连接服务器
   * @param strIP 连接服务器端的IP地址
   */
  public void setClient(String strIP)
  {
    m_client = new MyClient(strIP, this);
    //System.out.println("连接对方");
    if (m_client.getConnectFlag() == true)
    {
      m_nNetStatus = CLIENT;
      //sendStr(TALK + ":" +  "加入游戏");
      showMessage("自己" +"加入"+strIP+"创建的游戏中");
    }
  }
  /**
   * 通过JOptionPane弹出模式对话框显示警告信息
   * @param jf  附属的JFrame
   * @param msg 要显示的警告消息内容
   */
  public static void warningDialog(JFrame jf,String msg)
  {
    JOptionPane.showMessageDialog(
        jf,
        msg,
        "警告",
        JOptionPane.WARNING_MESSAGE);
  }

  public void setNetStatus(int status)
  {
    this.m_nNetStatus=status;
  }
  /*
   public void Test()
   {
     initPieceBuffer(BUFFERSIZE);
     m_pTetricsPanel.getPieceBuffer(m_PieceBuffer);
     showMessage("开始游戏");
     try {
       m_Producer.start();
       m_pTetricsPanel.start();
 //m_pTetricsPanel.requestFocus();
       m_pTetricsPanel.setFocusable(true);
       m_pTetricsPanel.requestFocus();
     }
     catch (Exception e) {}

   }
   */
} //end file