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

📄 tryserver.java

📁 一个实现双人玩的圈叉游戏
💻 JAVA
字号:
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JButton;
import javax.swing.JToolBar;

public class TryServer
{	 
	 public static void main(String args[])
	 {
	 	TServer app=new TServer();
	 	app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	 	app.show();
	 	app.runServer();                                        //开始开始运行服务器
	 }
}

 class TServer extends JFrame
 {
	JButton button[]=new JButton[9];        //9个按钮,用于接受输入并显示图案
	JTextArea textArea;                    //文本域,用于显示对方传送过来的信息
	JButton select1,select2,exit,restart,startgame;           //分别用于图案选择与退出铵钮
	JToolBar  toolbar=new JToolBar("工具栏");
	int record[]=new int[9];                 //用于记录9个面板按钮的当前状态
	JPanel panel=new JPanel();
	Icon icon[]=new Icon[2];
	Icon image[]=new Icon[2];               //贴图的图标
	Icon backcolor=new ImageIcon("bground.gif");
	int imageType;                          //用于记录两张图标应该选择哪一张
	ServerSocket server;
	Socket connection;
	
	boolean pressed;                     //判断是否已经按下一次
	ObjectOutputStream output;
	ObjectInputStream input;               //定义输入输出流,用于接收数据
	
	boolean start=true;              //判断是否已经开始游戏
	
	int totalnum,servernum,clientnum;     //分别记录贴子的总数,自己的数目,对方的数目
	public  TServer()
	{
	
	    super("服务器端游戏");
		Container cpp=getContentPane();
     	toolbar=new JToolBar("工具栏");       //创建工具栏
		
		imageType=0;
		ActionListener command=new Actionhandler();   //添加事件监听器
		cpp.setLayout(new BorderLayout());
		textArea=new JTextArea(4,20);

		icon[0]=new ImageIcon("circle.gif");
    	icon[1]=new ImageIcon("line.gif");
	
		select1=new JButton("",icon[0]);

		select2=new JButton("",icon[1]);

		startgame=new JButton("startGame");
		startgame.addActionListener(command);
		exit=new JButton(" Exit  ");
		exit.addActionListener(command);
		restart=new JButton("Restart");
		restart.addActionListener(command);
		
        image[0]=new ImageIcon("cimage.gif");
        image[1]=new ImageIcon("limage.gif");          //装载图标
	 
		toolbar.add(select1);
		
		toolbar.addSeparator();
		toolbar.add(select2);  
		toolbar.addSeparator();
		toolbar.add(startgame);
		toolbar.addSeparator();
		toolbar.add(exit);    
		toolbar.addSeparator();
		toolbar.add(restart);                          //创建工具栏
	    cpp.add(toolbar,BorderLayout.NORTH);
	    
	    panel.setSize(200,200);
		panel.setLayout(new GridLayout(3,3));          //在框架中另外创建一个面板类
	
		 int   i=0;           
		for( i=0;i<9;i++)
		  {  
		     button[i]=new JButton("");                 //创建桌面上按钮
		     button[i].setBackground(new Color(125,0,10));
		     button[i].addActionListener(command);
		     panel.add(button[i]);                       //把按钮添加到面板中
		     
		   }
	          
	     for(i=0;i<9;i++)
	        record[i]=-1;                 //初始化记录数组
	    
		cpp.add(panel,BorderLayout.CENTER);
		cpp.add(new JScrollPane(textArea),BorderLayout.SOUTH);    //安排桌面的布局
	
		setSize(400,400);
		setVisible(true);
	  }

		 public void runServer()
        {
           //设置服务器,接受客户端的连接
         try
          {
   
           //创建一个服务器的端口
            server = new ServerSocket( 5000, 100 );
   
            while ( true )
             {
   
                waitForConnection();          //等待连接
                getStreams();                 //接受消息
                processConnection();         //处理连接
                closeConnection();           //关闭连接
   
          
              }
          }
            catch ( EOFException eofException ) 
            {
                System.out.println( "Client terminated connection" );
             }
   
         //输入输出处理方法
         catch ( IOException ioException )
          {
            ioException.printStackTrace();
          }
         }//end_runServer()
	  private void getStreams() throws IOException
       {
       //设置输出流
        output = new ObjectOutputStream(
           connection.getOutputStream() );
  
       
        output.flush();
  
       //设置输入流
        input = new ObjectInputStream(
           connection.getInputStream() );
  
        textArea.append( "\nGot I/O streams\n" );
       }
	  
	   private void closeConnection() throws IOException
        {
          textArea.append( "\nUser terminated connection" );
       
          output.close();
          input.close();
          connection.close();
        }
	  
	   private void waitForConnection() throws IOException
	   {
	 	   textArea.setText( "Waiting for connection\n" );
  
       //允许服务器接受连接
           connection = server.accept();
              
           textArea.append( "Connection  received from: " +
           connection.getInetAddress().getHostName() );
	   }//end_waitForConnection()
	   
	  
	   
	  private void processConnection() throws IOException
     {
        //发送成功连接的信号
        String message = "SERVER>>> Connection successful";
        output.writeObject( message );
        output.flush();
       //处理客户端发送过来的消息
        do {
  
          //接受消息并处理消息
           try 
           {
              message = ( String ) input.readObject();
         
              if(message.substring(0,5).equals("start"))   //对方发出开始的命令
              {
              	  start=false;
              	  if(message.charAt(11)=='0') imageType=1;
              	  else imageType=0;                          //选择贴图的图标
              }
              else if(message.substring(0,5).equals("order")) //对方贴子的操作
              {
              	 int i=0;
              	 i=Integer.parseInt(message.substring(6,7));  
             
              	 if(imageType==0)
              	 { 
              	     record[i]=1;         //对方的子
              	     button[i].setIcon(image[1]);
              	   	 clientnum++;
                 	 totalnum++;
                 }
                 else 
                 {
                 	record[i]=0;
                 	button[i].setIcon(image[0]);
                 	clientnum++;
                 	totalnum++;
                 }
                 pressed=true;
               if(IsGameOver())             //胜负已经揭晓
                    {
                    	 start=true; 
                    	 startAgain();
                    	pressed=true;
                    }
                    	 
                 else if(totalnum==9)
                 {
                 	JOptionPane.showMessageDialog(null,"双方不分胜负,此局结束,请重新开始");
                    start=true;
                 	startAgain();
                 	pressed=true;
                 	
                 }
     
              }
              else if(message.substring(0,7).equals("restart"))
              {	
                start=false;
              	startAgain();          //重新开始
              }
              textArea.append( "\n" + message );
              textArea.setCaretPosition(
              textArea.getText().length() );
           }
  
          //异常处理函数
           catch ( ClassNotFoundException classNotFoundException )
            {
              textArea.append( "\nUnknown object type received" );
            }
  
           } while ( !message.equals( "game over" ) );
        }//end_processConnection()
	     
	     //重新开始游戏,并重新做初始化工作
	     public void startAgain()
	      {
	   	        int i;
	   	     	for(i=0;i<9;i++)
	   	     	{
	   	     		button[i].setIcon(backcolor);
	   	     		record[i]=-1;
	  	     	}
	   	     		totalnum=0;
	   	     		servernum=0;
	   	     		clientnum=0;
	   	      if(start)
	  	   sendData("restart");
	      }
	      
	    //判断游戏是否结束的方法
	   public boolean IsGameOver()
	   {    
	   	     if(record[4]==0)                      //以4为中心,总共有4种取胜的可能
	   	     {
	   	     	if((record[3]==0&&record[5]==0)||(record[1]==0&&record[7]==0)||(record[0]==0&&record[8]==0)||(record[2]==0&&record[6]==0))
	   	     	   
	   	     	 {  if(imageType==1)
	   	     	  	  	JOptionPane.showMessageDialog(null,"客户端已经获胜,游戏结束,按restart可以重新开始游戏");
	   	     	    else 
	   	     	  	JOptionPane.showMessageDialog(null,"服务器端已经获胜,游戏结束,按restart可以重新开始游戏");
	   	     	    return true;
	   	     
	   	     	 }
	   	     }
	   	   else if(record[4]==1)
	   	   { 
	   	        if((record[3]==1&&record[5]==1)||(record[1]==1&&record[7]==1)||(record[0]==1&&record[8]==1)||(record[2]==1&&record[6]==1))
	   	     	   
	   	     	 {  if(imageType==0)
	   	     	      	JOptionPane.showMessageDialog(null,"客户端已经获胜,游戏结束,按restart可以重新开始游戏");
	   	     	     else 
	   	     	  	JOptionPane.showMessageDialog(null,"服务器端已经获胜,游戏结束,按restart可以重新开始游戏");
	   	     	    return true;
	   	     	 
	   	     	 }
	   	   }
	   	  	  //判断四周是否存在获胜组合,共有4种
	   	   if((record[0]==0&&record[1]==0&&record[2]==0)||(record[0]==0&&record[3]==0&&record[6]==0)
	   	             ||(record[6]==0&&record[7]==0&&record[8]==0)||(record[2]==0&&record[5]==0&&record[8]==0))
	   	        {
	   	          if(imageType==1)
	   	     	  	JOptionPane.showMessageDialog(null,"客户端已经获胜,游戏结束,按restart可以重新开始游戏");
	   	     	  
	   	     	  else 
	   	     	  	JOptionPane.showMessageDialog(null,"服务器端已经获胜,游戏结束,按restart可以重新开始游戏");
	   	     	    return true;
	   	     	  
	   	       }
	   	     	 
  	      if((record[0]==1&&record[1]==1&&record[2]==1)||(record[0]==1&&record[3]==1&&record[6]==1)
	   	             ||(record[6]==1&&record[7]==1&&record[8]==1)||(record[2]==1&&record[5]==1&&record[8]==1))
	   	          {
	   	            if(imageType==0)
	   	     	   	JOptionPane.showMessageDialog(null,"客户端已经获胜,游戏结束,按restart可以重新开始游戏");
	   	     	    else 
	   	     	  	JOptionPane.showMessageDialog(null,"服务器端已经获胜,游戏结束,按restart可以重新开始游戏");
	   	     	    return true;
	   	     	  
	   	     	   }
	   	     
	   	       return false;            //还不分胜负
	   }//end_IsGameOver()
	   
	      public void sendData(String command)
	          {
     
              //发送消息到客户端
               try {
                    output.writeObject( command );
                    output.flush();
                    textArea.append("\nCLIENT>>>" + command );
                   }
  
             //处理消息发送的异常
               catch ( IOException ioException ) 
               {
                 textArea.append( "\nError writing object" );
               }
	   	
	          }//end_sendData()

	   //事件监听类
	   public class Actionhandler implements ActionListener
	   {
	   	    
	   	     public void actionPerformed(ActionEvent e)
	   	     {
	   	       
	   	         if(e.getSource().equals(startgame))
	   	             {
	   	             	if(start)                //如果对方还没按下开始键
	   	             	 StartGame();   
	   	             	else JOptionPane.showMessageDialog(null,"对方已经按下开始键下"); 
	   	             	
	   	             }
	   	        else if(e.getSource().equals(exit))
	   	           {
	   	           	 sendData("game over");
	   	           	 System.exit(0);
	   	           }
	   	        else if(e.getSource().equals(restart))
	   	              {
	   	              	if(start)
	   	              	    restart();                             //调动重新开始方法
	   	              	else 
	   	              	   JOptionPane.showMessageDialog(null,"对方已经按下开始键了");
	   	              }
	   	              	
	   	        else                                       //下面处理面板上的按钮的点击事件
	   	         	{    int i;
	   	         		 for(i=0;!(e.getSource().equals(button[i]))&&i<9;i++);  //判断是哪一个按钮被按下的
	   	          		 PressHandler(i);
	   	            }
	   	        	   
	   	        
	   	        
	   	     }
	   	     //开始游戏处理方法
	   	     public void StartGame()
	   	     {
	   	     	int m;
	   	     	m=(int)(Math.random()*10);           //随机分配这一方用的是圈还是勾
	   	     	if(m%2==0) {
	   	     		         imageType=0;
	   	     		         textArea.append("服务器端选择--圆圈\n");
	   	     		       }
	   	     	   else { imageType=1;             //随机选择
	   	     	          textArea.append("服务器端选择--叉\n");
	   	     	       }
	   	     	sendData("start game:"+imageType+"  ");
	   	     	pressed=true;
	   	     
	   	     }
	   	   
	   	      //游戏重新开始处理方法
	   	     public void restart()
	   	     {
	   	     	int i;
	   	     	for(i=0;i<9;i++)
	   	     	{
	   	     		button[i].setIcon(backcolor);
	   	     		record[i]=-1;
	   	     	}
	   	        sendData("restart");
	   	     	pressed=true;
	   	     }
	   	     //在按钮上按键处理的方法
	   	     public void PressHandler(int loc)
	   	     {
	   	     	if(pressed)
	   	     	{
	   	     	   if(record[loc]==-1)              //如果这个位置原本是空的
	   	     	    {
	   	     	    	button[loc].setIcon(image[imageType]);    //给这个位置设置图标  
	   	     	    	record[loc]=imageType;
	   	     	    	sendData("order:"+loc+"  ");
	   	     	    	textArea.append("\nServer>>>order:"+loc);
	   	     	    
	   	     	    	totalnum++;
	   	     	    	pressed=false;
	   	     	    	if(IsGameOver())
	   	     	    	  { 
	   	     	    	    start=true; 
	   	     	    	    startAgain();
	   	     	    	  	  
	   	     	    	  }
	   	     	    	else if(totalnum==9)
	   	     	    	{
	   	     	          JOptionPane.showMessageDialog(null,"双方不分胜负,本局结束,请重新开始");
	   	     	          start=true; 
	   	     	          startAgain();
	   	     	          
	   	     	    	}
	   	     	    }
	   	     	   else JOptionPane.showMessageDialog(null,"此处不能下");
	   	       }
	   	       else JOptionPane.showMessageDialog(null,"你已经下过一次了,等对方下完");
	   	       
	   	    }//end_PressHandler()
	   }
  }	 
	 

⌨️ 快捷键说明

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