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

📄 gameclient.java

📁 Java五子棋编程................... 仅供参考
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.io.*;
import java.net.*;

public class GameClient extends JApplet
  implements Runnable, ActionListener, GameConstants
{
	private boolean myTurn = false;
  	private char myToken = ' ';
  	private char otherToken = ' ';
  	
  	private Cell[][] cell =  new Cell[20][20];
  	
  	JPanel p = new JPanel();
  	
  	private JLabel jlblTitle = new JLabel();
  	private JLabel jlblStatus = new JLabel();
  	
  	private JMenuBar jmb = new JMenuBar();
    private JMenu jmOp = new JMenu("Operation");
    private JMenuItem jmiStart = new JMenuItem("Start");
    private JMenuItem jmiExit = new JMenuItem("Exit");
  	
  	private int rowSelected;
  	private int columnSelected;
  	
  	Socket connectToServer;
  	
  	private DataInputStream isFromServer;
  	private DataOutputStream osToServer;
  	
  	private boolean continueToPlay = true;
	private boolean waiting = true;
	
	public static void main(String args[])
	{
		JFrame frame = new JFrame("GameClient");
		
		GameClient applet = new GameClient();
		frame.getContentPane().add(applet);
		applet.init();
		applet.start();
		
		frame.setSize(320, 360);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public void init()
  	{
    	p.setLayout(new GridLayout(20, 20, 0, 0));
    	for (int i=0; i<20; i++)
      		for (int j=0; j<20; j++)
        		p.add(cell[i][j] = new Cell(i, j));
       
    	jlblTitle.setHorizontalAlignment(JLabel.CENTER);
    	
    	jmb.add(jmOp);
    	jmOp.add(jmiStart);
    	jmOp.add(jmiExit);
    	jmiStart.addActionListener(this);
    	jmiExit.addActionListener(this);
    	
    	this.setJMenuBar(jmb);
    	this.getContentPane().add(jlblTitle, BorderLayout.NORTH);
    	this.getContentPane().add(p, BorderLayout.CENTER);
    	this.getContentPane().add(jlblStatus, BorderLayout.SOUTH);
    }
  	
  	public void actionPerformed(ActionEvent e)
  	{
  		String command = e.getActionCommand();
  		if ("Start".equals(command))
  		{
  			connectToServer();
  			jmiStart.setEnabled(false);
  			continueToPlay = true;
  		
  			for (int i=0; i<20; i++)
      			for (int j=0; j<20; j++)
        			cell[i][j].setToken(' ');
        }
        else if ("Exit".equals(command))
        {
        	try
        	{
        		osToServer.writeInt(STOP);
        		System.exit(0);
        	}
        	catch(Exception er)
        	{
        		System.err.println(er);
        		System.exit(0);
        	}
        }
  	}
  	
  	//connectToServer()
  	private void connectToServer()
  	{
  		try
  		{
      		connectToServer = new Socket("localhost", GAMEPORT);
      		isFromServer = new DataInputStream(connectToServer.getInputStream());
      		osToServer = new DataOutputStream(connectToServer.getOutputStream());
  		}
  		catch (Exception e)
  		{
  			System.err.println(e);
  		}
  		
  		Thread thread = new Thread(this);
    	thread.start();
  	}
  	
  	//run()
  	public void run()
  	{
  		try
  		{
  			int player = isFromServer.readInt();
  			
  			if (player == PLAYER1)
  			{
  				myToken = 'X';
        		otherToken = 'O';
        		jlblTitle.setText("Player 1 ---> 'X'");
        		jlblStatus.setText("Waiting for player 2 to join");

        		isFromServer.readInt();

        		jlblStatus.setText("Player 2 has joined. You start first");
        		myTurn = true;
  			}
  			else if (player == PLAYER2)
  			{
  				myToken = 'O';
        		otherToken = 'X';
        		jlblTitle.setText("Player 2 ---> 'O'");
        		jlblStatus.setText("Waiting for player 1 to move");
  			}
  			
  			while (continueToPlay)
  			{
  				if (player == PLAYER1)
  				{
  					waitPlayer(); 
          			sendMove(); 
          			receiveInfo(); 
  				}
  				else if (player == PLAYER2)
  				{
  					receiveInfo(); 
          			waitPlayer(); 
          			sendMove(); 
  				}
  			}//end while
  		}
  		catch (Exception e)
  		{
  			System.err.println(e);
  		}
  	}
  	
  	// waitPlayer()
  	private void waitPlayer() throws InterruptedException
  	{
 	   while (waiting)
 	   {
			Thread.sleep(100);
		}
		waiting = true;
	}
	
	// sendMove()
  	private void sendMove() throws IOException
  	{
    	osToServer.writeInt(rowSelected); 
    	osToServer.writeInt(columnSelected); 
  	}
  	
  	// Receive info from the server
  	private void receiveInfo() throws IOException
  	{
		int status = isFromServer.readInt();
		
		if (status == STOP)
		{
			continueToPlay = false;
			jmiStart.setEnabled(true);
			jmiExit.setEnabled(true);
			jlblStatus.setText("Game stopped,please restart!");
       		connectToServer.close();
		}
		
		if (status == PLAYER1_WON)
		{
			continueToPlay = false;
			jmiStart.setEnabled(true);
			jmiExit.setEnabled(true);
			if (myToken == 'X')
			{
				jlblStatus.setText("You won! (X)");
			}
			else if (myToken == 'O')
			{
				receiveMove();
				jlblStatus.setText("Player 1 (X) has won!");
			}	
		}
		else if (status == PLAYER2_WON)
		{
			continueToPlay = false;
			jmiStart.setEnabled(true);
			jmiExit.setEnabled(true);
			if (myToken == 'O')
			{
				jlblStatus.setText("You won! (O)");
			}
			else if (myToken == 'X')
			{
				receiveMove();
				jlblStatus.setText("Player 2 (O) has won!");
			}	
		}
		else if (status == DRAW)
		{
			continueToPlay = false;
			jmiStart.setEnabled(true);
			jmiExit.setEnabled(true);
      		if (myToken == 'O')
      		{
        		receiveMove();
      		}
      		jlblStatus.setText("Game is over!");
		}
		else
		{
			jmiExit.setEnabled(true);
			receiveMove();
      		jlblStatus.setText("Your turn");
      		myTurn = true;	
		}
	}
	
	//receiveMove()
	private void receiveMove() throws IOException
	{
		int row = isFromServer.readInt();
    	int column = isFromServer.readInt();
    	cell[row][column].setToken(otherToken);
    }
    
	//class Cell
	public class Cell extends JPanel implements MouseListener
	{
		private int row;
    	private int column;
    	private char token = ' ';
    	
    	public Cell(int row, int column)
    	{
    		this.row = row;
      		this.column = column;
      		setBorder(new LineBorder(Color.black, 1)); 
      		addMouseListener(this);  
      	}
      	
      	//getToken()
      	public char getToken()
    	{
      		return token;
    	}
    	
    	//setToken()
    	public void setToken(char c)
    	{
    		token = c;
      		repaint();
      	}
      	
      	//paintComponent()
      	public void paintComponent(Graphics g)
      	{
      		super.paintComponent(g);
      		
      		if (token == 'X')
      		{
      			g.drawLine(0, 0, getSize().width, getSize().height);
      			g.drawLine(getSize().width, 0, 0, getSize().height);
      		}
      		else if (token == 'O')
      		{
      			g.setColor(Color.black);
      			g.fillOval(0, 0, getSize().width, getSize().height);
      		}
      	}
      	
      	//implement mouseClicked()
      	public void mouseClicked(MouseEvent e)
      	{
      		if ((token == ' ') && myTurn)
      		{
      			setToken(myToken);  
        		myTurn = false;
        		rowSelected = row;
        		columnSelected = column;
        		jlblStatus.setText("Waiting for the other player to move");
        		waiting = false; 
        		jmiExit.setEnabled(false);
        	}
        }
        
        public void mouseExited(MouseEvent e){}
        public void mouseEntered(MouseEvent e){}
        public void mouseReleased(MouseEvent e){}
        public void mousePressed(MouseEvent e){}
	}
}	
  

⌨️ 快捷键说明

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