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

📄 chessboard.java

📁 我的五子棋:C/S结构
💻 JAVA
字号:
import	java.io.*;
import	java.awt.*;
import  java.net.*;
import  java.text.*;
import	java.util.*;
import	java.beans.*;
import	javax.swing.*;
import  java.util.zip.*;
import	java.awt.event.*;
import	javax.swing.event.*;
import	javax.swing.border.*;

public	class	ChessBoard	extends	JPanel 	implements MouseListener
{
	public	String	imgFileName = null;
	public	Image	whiteChessmanImg = null;
	public	Image	blackChessmanImg = null;
	public	int	step = 0;
	public	Graphics gs = null;
	/*
	** chessMap = 3 White
	** chessMap = 7 Black
	** chessMap = 0 Null
	*/
	public	int[][] chessMap = new int[19][19];
	public	int[][] checkMap = new int[19][19];
	public	int	lastChessX = -1;
	public	int	lastChessY = -1;
	public	Vector	takeVector = new Vector();
	public	boolean	takeFlag = true;
	public	ChessBoard(String imgFileName)
	{
		this.imgFileName = imgFileName;
		whiteChessmanImg = getImageOfFile("whitechess.gif");
		blackChessmanImg = getImageOfFile("blackchess.gif");
		addMouseListener(this);
		for(int i = 0; i < 19; i ++)
			for(int j = 0; j < 19; j ++)
			{
				chessMap[i][j] = 0;
				checkMap[i][j] = 0;
			}
	}
	public	Image getImageOfFile(String fileName)
	{
		ImageIcon imgIcon = new ImageIcon(getClass().getResource(fileName));
		return	imgIcon.getImage();
	}
	public	void	paint(Graphics g)
	{
		gs = g;
		g.drawImage(getImageOfFile(imgFileName), 0, 0, this);
		drawChessBoardGrid(g);
		for(int i = 0; i < 19; i ++)
			for(int j = 0; j < 19; j ++)
				if(chessMap[i][j] != 0)
					drawChessman(i, j, chessMap[i][j]);
		if((lastChessX >= 0 && lastChessX <= 19) &&
		   (lastChessY >= 0 && lastChessY <= 19))
			markChessman(lastChessX, lastChessY);
	}
	public	void	update(Graphics g)
	{
		paint(g);
	}
	public	void	drawChessBoardGrid(Graphics g)
	{
		g.setColor(Color.black);
		g.drawLine(30, 30, 588, 30);
		g.drawLine(30, 30, 30, 588);
		g.drawLine(588, 30, 588, 588);
		g.drawLine(30, 588, 588, 588);
		step = (590 - 30 - 2)/18;
		int	x = 30;
		int	y = 30;
		for(int i = 1; i <= 17; i ++)
		{
			y += step;
			g.drawLine(30, y, 588, y);
		}
		for(int i = 1; i <= 17; i ++)
		{
			x += step;
			g.drawLine(x, 30, x, 588);
		}
		g.fillOval(30 + step*3 - 3, 30 + step*3 - 3, 7, 7);
		g.fillOval(30 + step*15 - 3, 30 + step*3 - 3, 7, 7);
		g.fillOval(30 + step*3 - 3, 30 + step*15 - 3, 7, 7);
		g.fillOval(30 + step*15 - 3, 30 + step*15 - 3, 7, 7);
		g.fillOval(30 + step*9 - 3, 30 + step*9 - 3, 7, 7);
	}
	public	void	setLastChessman(int x, int y)
	{
		lastChessX = x;
		lastChessY = y;
	}
	public	void	markChessman(int x, int y)
	{
		gs.setColor(Color.red);
		gs.fillOval(27 + step*x, 27 + step*y, 7, 7);
	}
	public	void	drawChessman(int x, int y, int chessColor)
	{
		switch(chessColor)
		{
			case	3:
				gs.drawImage(whiteChessmanImg, 20 + step*x, 20 + step*y, this);
				break;
			case	7:
				gs.drawImage(blackChessmanImg, 20 + step*x, 20 + step*y, this);
				break;
		}
	}
	public	void	takeChessman(int chessX, int chessY)
	{	//提子
		int thisChess = chessMap[chessX][chessY];
		checkMap[chessX][chessY] = 1;
		takeVector.add("" + chessX + "," + chessY);
		//left:
		int x = chessX - 1;
		int y = chessY;
		if(x >= 0 && thisChess == chessMap[x][y] && checkMap[x][y] == 0)
			takeChessman(x, y);
		else	if(x >= 0 && chessMap[x][y] == 0)
		{
			takeFlag = false;
			return;
		}
		//up:
		x = chessX;
		y = chessY - 1;
		if(y >= 0 && thisChess == chessMap[x][y] && checkMap[x][y] == 0)
			takeChessman(x, y);
		else	if(y >= 0 && chessMap[x][y] == 0)
		{
			takeFlag = false;
			return;
		}
		//right:
		x = chessX + 1;
		y = chessY;
		if(x < 19 && thisChess == chessMap[x][y] && checkMap[x][y] == 0)
			takeChessman(x, y);
		else	if(x < 19 && chessMap[x][y] == 0)
		{
			takeFlag = false;
			return;
		}
		//down:
		x = chessX;
		y = chessY + 1;
		if(y < 19 && thisChess == chessMap[x][y] && checkMap[x][y] == 0)
			takeChessman(x, y);
		else	if(y < 19 && chessMap[x][y] == 0)
		{
			takeFlag = false;
			return;
		}
	}
	public	void	takeByColor(int chessColor)
	{
		for(int i = 0; i < 19; i ++)
		for(int j = 0; j < 19; j ++)
		{
			if(chessMap[i][j] == 0)
				continue;
			else	if(chessMap[i][j] != chessColor)
				continue;
			takeFlag = true;
			takeVector.clear();
			for(int l = 0; l < 19; l ++)
			for(int m = 0; m < 19; m ++)
				checkMap[l][m] = 0;
			takeChessman(i, j);
			if(takeFlag == true)
			{
				String	packet = new String("T");
				for(int n = 0; n < takeVector.size(); n ++)
				{
					String[] chessMan = Go.tokenize((String)takeVector.get(n), ",");
					int x = Integer.parseInt(chessMan[0]);
					int y = Integer.parseInt(chessMan[1]);
					chessMap[x][y] = 0;
					if(n > 0) packet += ",";
					packet += x;
					packet += ",";
					packet += y;
				}
				Go.out.println(packet);
			}
		}
		repaint();
	}
	public	void	takeOneChessman(int i, int j)
	{
		takeFlag = true;
		takeVector.clear();
		for(int l = 0; l < 19; l ++)
		for(int m = 0; m < 19; m ++)
			checkMap[l][m] = 0;
		takeChessman(i, j);
		if(takeFlag == true)
		{
			String	packet = new String("T");
			for(int n = 0; n < takeVector.size(); n ++)
			{
				String[] chessMan = Go.tokenize((String)takeVector.get(n), ",");
				int x = Integer.parseInt(chessMan[0]);
				int y = Integer.parseInt(chessMan[1]);
				chessMap[x][y] = 0;
				if(n > 0) packet += ",";
				packet += x;
				packet += ",";
				packet += y;
			}
			Go.out.println(packet);
		}
		repaint();
	}
	public	void	goTakeChessman(int chessX, int chessY)
	{
		if((chessX >= 0 && chessX <= 19) &&
		   (chessY >= 0 && chessY <= 19) &&
		   (chessMap[chessX][chessY] == 0) &&
		   (Go.goFlag == true))
		{
			chessMap[chessX][chessY] = Go.myChessColor;
			Go.goFlag = false;
			setLastChessman(chessX, chessY);
			Go.out.println("O" + Go.myChessColor + "," + chessX + "," + chessY);
			Go.sendMsg.setText("等待对方下棋 ...");
			repaint();
			if(Go.myChessColor == 3)
				takeByColor(7);
			else	if(Go.myChessColor == 7)
				takeByColor(3);
			takeOneChessman(chessX, chessY);
		}
	}
	public	void	mouseReleased(MouseEvent e)
	{
		int	x = e.getX();
		int	y = e.getY();
		//System.out.println("x = " + x + " y = " + y);
		int	indexOfHor = (x - 30)/step;
		int	indexOfVer = (y - 30)/step;
		if(((x - 30) % step) > 15)
			indexOfHor ++;
		if(((y - 30) % step) > 15)
			indexOfVer ++;
		//System.out.println("indexOfHor = " + indexOfHor + " indexOfVer = " + indexOfVer);
		if(Go.chess == 1)
			goTakeChessman(indexOfHor, indexOfVer);
		if((Go.chess == 2) && (indexOfHor >= 0 && indexOfHor <= 19) &&
	   	(indexOfVer >= 0 && indexOfVer <= 19) && (chessMap[indexOfHor][indexOfVer] == 0) &&
	   	(Go.goFlag == true))
		{
			chessMap[indexOfHor][indexOfVer] = Go.myChessColor;
			Go.goFlag = false;
			setLastChessman(indexOfHor, indexOfVer);
			Go.out.println("O" + Go.myChessColor + "," + indexOfHor + "," + indexOfVer);
			repaint();
			Go.sendMsg.setText("等待对方下棋 ...");
			int	who = 0;
			if((who = whoWinGobang()) == 3)
			{
				Go.out.println("W3");
				showMessage("白棋赢!!!");
			}
			if((who = whoWinGobang()) == 7)
			{
				Go.out.println("W7");
				showMessage("黑棋赢!!!");
			}
			if(who == 3 || who == 7)
			{
				//Go.out.println("C");
				for(int i = 0; i < 19; i ++)
				for(int j = 0; j < 19; j ++)
					chessMap[i][j] = 0;
				setLastChessman(-1, -1);
				repaint();
				Go.sendMsg.setText("先手?");
				Go.goFlag = true;
			}
		}
	}
	public	void	mousePressed(MouseEvent e) {	}
	public	void	mouseClicked(MouseEvent e) {	}
	public	void	mouseEntered(MouseEvent e) {	}
	public	void	mouseExited (MouseEvent e) {	}
	public	int	showMessage(String msg)
	{
		String[]	optionNames = { " 确 定 ", " 取 消 " };
		Go.setDefaultFont(new Font("dialog.plain", Font.PLAIN, 12));
		JPanel panel = new JPanel();
		Hashtable sysCfg = null;
		JLabel label = new JLabel(msg);
		label.setIcon(new ImageIcon(getClass().getResource("msg.gif")));
		panel.add(label);
		return  JOptionPane.showOptionDialog(Go.frame, panel,
			"提示信息", JOptionPane.DEFAULT_OPTION,
			JOptionPane.PLAIN_MESSAGE, null,
			optionNames, optionNames[1]);
	}
	public	int	whoWinGobang()
	{
		for(int i = 0; i < 19; i ++)
			for(int	j = 0 ; j < 18; j ++)
		{
			int	sum1 = sumslash(i, j, 0);
			if(sum1 == 15)	return	3;	//:	WHITE WIN
			if(sum1 == 35)	return	7;	//:	BLACK WIN
			
			int	sum2 = sumslash(i, j, 1);
			if(sum2 == 15)	return	3;	//:	WHITE WIN
			if(sum2 == 35)	return	7;	//:	BLACK WIN
			
			int	sum3 = sumslash(i, j, 2);
			if(sum3 == 15)	return	3;	//:	WHITE WIN
			if(sum3 == 35)	return	7;	//:	BLACK WIN
			
			int	sum4 = sumslash(i, j, 3);
			if(sum4 == 15)	return	3;	//:	WHITE WIN
			if(sum4 == 35)	return	7;	//:	BLACK WIN
		}
		return	-1;
	}
	public	int	sumslash(int x, int y, int slashType)
	{
		int	sum = 0;
		int	nx = x;
		int	ny = y;
		for(int n = 0; n < 5; n ++)
		{
			if((nx >= 0) && (nx < 19) &&
			   (ny >= 0) && (ny < 18))
			{
				sum += chessMap[nx][ny];
				switch(slashType)
				{
					case	0:	//: /
						nx ++; ny --;
						break;
					case	1:	//: \
						nx ++; ny ++;
						break;
					case	2:	//: -
						nx = nx; ny ++;
						break;
					case	3:	//: |
						nx ++; ny = ny;
						break;
					default:
						break;
				}
				if((sum == 15) || (sum == 35))
					return	sum;
			}
			else	break;
		}
		return	sum;
	}
}

⌨️ 快捷键说明

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