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

📄 chesspanel.java

📁 无禁手的五子棋带人工智能
💻 JAVA
字号:
//杨建国:ChessPanel.java
// Drawing a Chess Map.

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class ChessPanel extends JPanel{
	private ImageIcon map;					//棋盘背景位图
  	private ImageIcon blackchess;			//黑子位图
  	private ImageIcon whitechess;			//白子位图
  	private int isChessOn [][];				//棋局图
  	private int h;							//棋子长
 	private int w;							//棋子宽
 	private int insx;						//插入棋子的位置
 	private int insy;
 	private Point mousePoint;				//鼠标当前位置
 	private int winer;						//谁赢了
 	private Point last[];					//缓存上一步棋,为了悔棋
 	private int plast=0;					//走了几步了,
 	public int BLACK_ONE;					//1表黑子
 	public int WHITE_ONE;					//-1表白子
 	public int NONE_ONE;					//0表无子
 	public int N;							//棋盘边长
 				//winer
 	ChessPanel(ImageIcon r_map,ImageIcon r_blackchess,ImageIcon r_whitechess) 
 	{	
 		N=15;
 		map=new ImageIcon();
 		blackchess=new ImageIcon();
 		whitechess=new ImageIcon();
 		last=new Point[2];
  		map=r_map;
  		blackchess=r_blackchess;
  		whitechess=r_whitechess;
  		NONE_ONE=0;
  		BLACK_ONE=1;
  		WHITE_ONE=-1;
  		winer=NONE_ONE;
   		isChessOn=new int[N][N];
    	h=blackchess.getIconHeight()*(N-1);
    	w=blackchess.getIconWidth()*(N-1);
    	insx=0;
    	insy=0;
    	mousePoint=new Point();
    	    
  }
  public void reset()							//重开一局
  {
  		winer=NONE_ONE;
  		for(int i=0;i<N;i++)
  			for(int j=0;j<N;j++)
  			{
  				isChessOn[i][j]=NONE_ONE;
  			}
  		repaint();
  }
  public void rollback()						//悔一步棋
  {
  	for(int i=0;i<2;i++)
  	{
  		isChessOn[last[i].x][last[i].y]=NONE_ONE;
  	}
  }
  public void showMousePos(Point p)				//调试用,显示鼠标位置
  {
  	int cw;
  	cw=h/N;
  	mousePoint.x=p.x/cw;
  	mousePoint.y=p.y/cw;
  	repaint();
  }
  public Point addChess(int x,int y,int type)	//下一步棋,参数为插入点像素坐标
  {
  	int cw;
  	insx=x;
  	insy=y;
  	cw=h/N;
  	if(x<=w+cw/2&&y<=h+cw/2&&isChessOn[x/cw][y/cw]==NONE_ONE&&winer==NONE_ONE)
  	{
  		isChessOn[x/cw][y/cw]=type;
  	//	System.out.println("add ("+x/cw+","+y/cw+")\ttype="+type);
  		last[(plast++)%2]=new Point(x/cw,y/cw);
  	}
  	else
  	{
  		System.out.println("add Chess error");
  	}
  	repaint();
  	Point r=new Point(x/cw,y/cw);
  	return r;
  }
  public Point addChess(int x,int y,int type,boolean isMatrix)//下一步棋,isMatrix位true参数为插入点棋格坐标,否则参数为插入点像素坐标
  {
  	if(isMatrix==true)
  	{
  		if(x<N&&y<N&&isChessOn[x][y]==NONE_ONE&&winer==NONE_ONE)
  		{
  			isChessOn[x][y]=type;
  		//	System.out.println("add ("+x+","+y+")\ttype="+type+"isChessOn[][]="+isChessOn[x][y]);
  			last[(plast++)%2]=new Point(x,y);
  		}
  		else
  		{
  			System.out.println("add Chess error");
  		}
  		repaint();
  		Point r=new Point(x,y);
  		return r;
  	}
  	else
  	{
  		int cw;
  		insx=x;
  		insy=y;
  		cw=h/N;
  		if(x<=w+cw/2&&y<=h+cw/2&&isChessOn[x/cw][y/cw]==NONE_ONE&&winer==NONE_ONE)
  		{
  			isChessOn[x/cw][y/cw]=type;
  		}
  		repaint();
  		Point r=new Point(x/cw,y/cw);
  		return r;
  	}
  	
  }
  public boolean isSuccess(int type)		//判断是否有一方胜利
  {
  	int i=0;
  	int j=0;
  	int i1,j1;
  	int successFactor_v=0;					//横向五子连珠
  	int successFactor_h=0;					//纵向五子连珠
  	int successFactor_l=0;					//左斜线五子连珠
  	int successFactor_r=0;					//右斜线五子连珠
  	for(i=0;i<N;i++)
  		for(j=0;j<N;j++)
  		{
  			successFactor_v=0;		
  			successFactor_h=0;		
  			successFactor_l=0;		
  			successFactor_r=0;	
  			i1=i;
  			j1=j;
  			while(i1++<N)
  			{
  				if(isChessOn[i1-1][j]==type) successFactor_v++;
  				else i1=N;
  			}
  			i1=i;
  			j1=j;
  			while(j1++<N)
  			{
  				if(isChessOn[i][j1-1]==type) successFactor_h++;
  				else j1=N;
  			}
  			i1=i;
  			j1=j;
  			while(i1++<N&&j1++<N)
  			{
  				if(isChessOn[i1-1][j1-1]==type) successFactor_r++;
  				else i1=N;
  			}
  			i1=i;
  			j1=j;
  			while(i1++<N&&j1-->=0)
  			{
  				if(isChessOn[i1-1][j1+1]==type) successFactor_l++;
  				else i1=N;
  			}
  			if(successFactor_v>0||successFactor_h>0||successFactor_l>0||successFactor_r>0)
  		//	System.out.println(type+"\t"+i+"--"+j+"\tsv="+successFactor_v+"\tsh="+successFactor_h+"\tsl="+successFactor_l+"\tsr="+successFactor_r);
  			if(successFactor_v==5||successFactor_h==5||successFactor_l==5||successFactor_r==5)
  				return true;
  		}
  	
  	
  	return false;
  		
  }
  public void gameOver(int r_winer)			//游戏胜负已分
  {
  	winer=r_winer;
  }
  public void paint(Graphics g)				//画客户区
  {
    super.paint(g);
    paintChessMap(g); 
    paintChess(g);
    if(winer==BLACK_ONE)
    {
    	g.drawString(new String("Game Over!Black Win!"),500,200);
    	
    }
    else if(winer==WHITE_ONE)
    {
    	g.drawString(new String("Game Over!White Win!"),500,200);
    	
    }
  }
  private void paintChessMap(Graphics g)		//画棋盘
  {
  	map.paintIcon(this,g,10,10);
  	int j;
    g.setColor(Color.BLACK);
    for(j=0;j<N;j++)							//画线
    {
    	g.drawLine(h/N/2,h/N*j+h/N/2,w-w/N+(N%2)*(h/N/2),h/N*j+h/N/2);
    	g.drawLine(w/N*j+h/N/2,h/N/2,w/N*j+h/N/2,h-h/N+(N%2)*(h/N/2));
    
    }
    g.fillRect(w/N*7+h/N/2-3,h/N*7+h/N/2-3,6,6);//画5个黑方块
    g.fillRect(w/N*3+h/N/2-3,h/N*3+h/N/2-3,6,6);
    g.fillRect(w/N*11+h/N/2-3,h/N*3+h/N/2-3,6,6);
    g.fillRect(w/N*3+h/N/2-3,h/N*11+h/N/2-3,6,6);
    g.fillRect(w/N*11+h/N/2-3,h/N*11+h/N/2-3,6,6);
  }
  private void paintChess(Graphics g)			//画棋子
  {
  		int i,j;
  		for(i=0;i<N;i++)
  			for(j=0;j<N;j++)
  			{
  				if(isChessOn[i][j]==BLACK_ONE)
  				{
  					blackchess.paintIcon(this,g,w/N*i,h/N*j);
  				}
  				else if(isChessOn[i][j]==WHITE_ONE)
  				{
  					whitechess.paintIcon(this,g,w/N*i,h/N*j);
  				}	
  			}
  }
	}

⌨️ 快捷键说明

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