java n*n自定义围棋分享 打劫处理

部分源码参考:

package com.wq3;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class Weiqi extends Applet{

	private Qipan qipan;
	
	public void init()   //初始化
	{
		qipan=new Qipan();
		setLayout(new BorderLayout());
		setSize(qipan.getSize());
		add(qipan,"Center");
	}
	public int getWidth()   //得到宽度值
	{
		return qipan.getWidth();
	}
	public int getHeight()   //得到宽度值
	{
		return qipan.getHeight();
	}
	public static void main(String[] args) 
	{
		Frame f=new Frame("围棋");
		f.setResizable(false);
		f.setLayout(new BorderLayout());
		//正中----以前---错误
//		f.setSize(500, 500);
//		f.setLocationRelativeTo(null);
		
		Weiqi weiqi=new Weiqi();
		weiqi.init();
		weiqi.start();
		
		f.setSize(weiqi.getWidth(), 20+weiqi.getHeight());
		f.add(weiqi, "Center");
		f.setLocationRelativeTo(null);//当前居中显示
		f.setVisible(true);
		//退出
		f.addWindowListener(
				new WindowAdapter()
				{
					public void windowClosing(WindowEvent e)
					{
						System.exit(0);
					}
				});
	}

}
package com.wq3;

public class Qizi {

	public static int _black=0;
	public static int white=1;
	 
	protected int x;
	protected int y;
	protected int color;
	
	public Qizi(int i,int j,int c)
	{
		x=i;
		y=j;
		color=c;
		
	}
	public String toString()//--重写
	{
		String c=(color==_black?"black":"white");
		return"["+x+","+y+"]:"+c;
	}
}
package com.wq3;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Point;
import java.util.Vector;

public class Qipan extends Panel{

	public static final int _rectnum=18,_rectlen=18;
	protected Vector qizis;
	protected int num;//已下数目
	protected int currentTurn;//轮到谁
	protected int rectnum,rectlen;//方格长度及数目
	protected int qizilen;//棋子的直径
	protected Qizi[][] map;//在棋盘上的所有棋子
	protected Image offscreen;
	protected Graphics offg;
	protected int size;//棋盘的宽度及高度
	protected int top,left;//棋盘左边 上边的边距
	protected Point mouseLoc;//鼠标的位置,即map数组中的下标
	protected ControlPanel controlPanel;//控制面板
	
	public static int[] xdir={0,0,1,-1};
	public static int[] ydir={1,-1,0,0};
	
	public int getWidth()
	{//棋盘宽度+控制面板宽度+35边距
		return size+controlPanel.getWidth()+35;
	}
	public int getHeight()
	{
		return size=380;//自己设置
	}
	public Qipan()
	{
		//棋盘外观
		top=left=20;
		rectnum=_rectnum;
		rectlen=_rectlen;
		qizilen=rectlen*9/10;
		size=2*left+rectnum*rectlen;
		//-----------------监听
		this.addMouseListener(new ML(this));
		this.addMouseMotionListener(new MML(this));
		//-----------------
		setLayout(new BorderLayout());
		controlPanel=new ControlPanel(this);
		setSize(getWidth(),size);
		add(controlPanel,"East");
		//---初始化
		start();
		
	}
	//重复开始游戏
	public void start()
	{
		qizis=new Vector();
		num=0;
		map=new Qizi[rectnum+1][rectnum+1];//第二次写入
		currentTurn=Qizi._black;//第四次
		controlPanel.setLabel();
		repaint();
	}
	public void addNotify()
	{
		super.addNotify();
		offscreen=createImage(size,size);//画布大小
		offg=offscreen.getGraphics();
	}
	public void paint(Graphics g)
	{
		offg.setColor(new Color(180,150,100));//棋盘背景颜色---木板色
		offg.fillRect(0, 0, size, size);
		//-------------画棋盘格子
		offg.setColor(Color.black);//棋盘颜色
		for(int i=0;i<rectnum+1;i++)
		{
			int x1=left+i*rectlen;
			int x2=x1;
			int y1=top;
			int y2=top+rectnum*rectlen;
			offg.drawLine(x1, y1, x2, y2);//画出竖线
			x1=left;
			x2=left+rectnum*rectlen;
			y1=top+i*rectlen;
			y2=y1;
			offg.drawLine(x1, y1, x2, y2);//画出横线
		}
		//---------------------------------------------画出棋子
		for(int i=0;i<rectnum+1;i++)
		{
			for(int j=0;j<rectnum+1;j++)
			{
				if(map[i][j]==null)
				{
					continue;
				}
				offg.setColor(map[i][j].color==Qizi._black?Color.black:Color.white);
				offg.fillOval(left+i*rectlen-qizilen/2, top+j*rectlen-qizilen/2, qizilen, qizilen);
			}
		}
		//----------画出鼠标的位置,及下一步要下的位置
		if(mouseLoc!=null)
		{
			offg.setColor(currentTurn==Qizi._black? Color.gray :new Color(200,200,250));
			offg.fillOval(left+mouseLoc.x*rectlen-qizilen/2, top+mouseLoc.y*rectlen-qizilen/2, qizilen, qizilen);
		}
		//----------画出画面
		g.drawImage(offscreen, 0, 0, this);//显示出来线
	}
	public void update(Graphics g)
	{//更新
		paint(g);
	}
	//--------------第三次-----------------------
	//----判断[x,y]落子后是否可以踢掉对方的棋子----------
	public void tizi(int x,int y)
	{
		Qizi qizi=map[x][y];
		if(qizi==null)
		{
			return;
		}
		int color=qizi.color;
		//----取得当前棋子周围的棋子的颜色----
		Vector v=around(qizi);
		
		for(int l=0;l<v.size();l++)
		{
			Qizi q=(Qizi)(v.elementAt(l));
			if(q.color==color)
			{
				continue;
			}
			//----若颜色不同,取得和q连在一起的所有已死的子
			//----若没有已死的棋子则返回一个空的Vector
			Vector dead=allDead(q);
			//移去所有的已死的棋子
			removeAll(dead);
			//------若造成提子,则保存所有被提掉的棋子
			if(dead.size() !=0)
			{
				Object obj=qizis.elementAt(num-1);
				if(obj instanceof Qizi)
				{
					qizi=(Qizi) (qizis.elementAt(num-1));
					dead.addElement(qizi);
				}
				else
				{
					Vector vector=(Vector) obj;
					for(int i=0;i<vector.size();i++)
					{
						dead.addElement(vector.elementAt(i));
					}
				}
				//-----更新Vector qizis 中的num元素
				qizis.setElementAt(dead, num-1);
			}
		}
		repaint();
	}
	//--------------第三次------------------------
	public boolean sideByBlank(Qizi qizi)//判断qizi周围是否有空白
	{
		for(int l=0;l<xdir.length;l++)
		{
			int xl=qizi.x+xdir[l];
			int yl=qizi.y+ydir[l];
			if(xl<0|| xl>rectnum || yl<0 || yl >rectnum)
			{
				continue;
			}
			if(map[xl][yl]==null)
			{
				return true;
			}
		}
		return false;
	}
	//--------------第三次------------------------
	//取得qizi周围的几个子
	public Vector around(Qizi qizi)
	{
		Vector v=new Vector();
		for(int l=0; l<xdir.length;l++)
		{
			int xl=qizi.x+xdir[l];
			int yl=qizi.y+ydir[l];
			if(xl<0 || xl>rectnum || yl<0 || yl>rectnum || map[xl][yl] == null)
			{
				continue;
			}
			v.addElement(map[xl][yl]);
		}
		return v;
	}
	//--------------第三次------------------------
	//取得和q连在一起的所有已死的棋子
	//若没有已死的棋子则返回一个空的Vector
	public Vector allDead(Qizi q)
	{
		Vector v=new  Vector();
		v.addElement(q);
		int count=0;
		while(true)
		{
			int origsize=v.size();
			for(int i=count;i<origsize;i++)
			{
				Qizi qizi=(Qizi) (v.elementAt(i));
				if(sideByBlank(qizi))
				{
					return new Vector();
				}
				Vector around=around(qizi);
				for(int j=0;j<around.size();j++)
				{
					Qizi a=(Qizi) (around.elementAt(j));
					if(a.color !=qizi.color)
					{
						continue;
					}
					if(v.indexOf(a)<0)
					{
						v.addElement(a);
					}
				}
			}
			if(origsize==v.size())
			{
				break;
				
			}
			else
			{
				count=origsize;
			}
		}
		return v;
	}
	//--------------第三次------------------------
	public void removeAll(Vector v)
	{
		for(int i=0; i<v.size();i++)
		{
			Qizi q=(Qizi) (v.elementAt(i));
			map[q.x][q.y]=null;
		}
	}
	//---------------悔棋-----------------
	public void back()
	{
		if(num==0)
		{
			controlPanel.setMsg("无子可悔");
			return;
		}
		Object obj=qizis.elementAt(--num);
		if(obj instanceof Qizi)
		{
			Qizi qizi=(Qizi) obj;
			map[qizi.x][qizi.y]=null;
			currentTurn=qizi.color;
		}
		else
		{
			Vector v=(Vector) obj;
			for (int i=0;i<v.size();i++)
			{
				Qizi q=(Qizi) (v.elementAt(i));
				if(i==v.size()-1)
				{
					map[q.x][q.y]=null;
					int index=qizis.indexOf(v);
					qizis.setElementAt(q, index);
					currentTurn=q.color;
				}
				else
				{
					map[q.x][q.y]=q;
				}
			}
		}
		controlPanel.setLabel();
		repaint();
	}
	//--------悔棋后前进两次
	public void forward()
	{
		if(num==qizis.size())
		{
			controlPanel.setMsg("不能前进");
			return;
		}
		Object obj=qizis.elementAt(num++);
		Qizi qizi;
		if(obj instanceof Qizi)
		{
			qizi=(Qizi) (obj);
			map[qizi.x][qizi.y]=qizi;
		}
		else
		{
			Vector v=(Vector) obj;
			qizi=(Qizi) (v.elementAt(v.size()-1));
			map[qizi.x][qizi.y]=qizi;
		}
		if(qizi.color==Qizi._black)
		{
			currentTurn=Qizi.white;
		}
		else
		{
			currentTurn=Qizi._black;
		}
		tizi(qizi.x,qizi.y);
		controlPanel.setLabel();
		repaint();
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
package com.wq3;

import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

public class MML extends MouseMotionAdapter //取得将要落子的位置
{
	private Qipan qipan;
	public MML(Qipan qipan)
	{
		this.qipan=qipan;
		
	}
	public  void mouseMoved(MouseEvent evt)
	{
		int xoff=qipan.left/2;
		int yoff=qipan.top/2;
		int x=(evt.getX()-xoff)/qipan.rectlen;
		int y=(evt.getY()-yoff)/qipan.rectlen;
		if(x<0 || x>qipan.rectnum || y<0 || y>qipan.rectnum)
		{//判断书否在棋盘外面,返回
			return;
		}
		if(qipan.map[x][y] !=null)
		{//判断这已经有棋子,返回
			return;
		}
		qipan.mouseLoc=new Point(x,y);
		qipan.repaint();
	}
}
package com.wq3;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class ML extends MouseAdapter{ //继承鼠标监听器

	public Qipan qipan;
	public ML(Qipan qipan)
	{
		this.qipan=qipan;
	}
	//摁下鼠标调用方法
	public void mousePressed(MouseEvent evt)
	{
		int xoff=qipan.left/2;
		int yoff=qipan.top/2;
		evt.getX();
		int x=(evt.getX()-xoff)/qipan.rectlen;
		int y=(evt.getY()-xoff)/qipan.rectlen;
		if(x<0 || x>qipan.rectnum || y<0 || y>qipan.rectnum)
		{
			return;
		}
		if(qipan.map[x][y] !=null)
		{
			return;
		}
		//--------------清除多余棋子
		if(qipan.num<qipan.qizis.size())//qizis用于存储棋子的轨迹
		{
			int size=qipan.qizis.size();
			for(int i=size-1;i>=qipan.num;i--)
			{
				qipan.qizis.removeElementAt(i);
			}
		}
		Qizi qizi=new Qizi(x,y,qipan.currentTurn);
		qipan.map[x][y]=qizi;
		qipan.qizis.addElement(qizi);
		qipan.num++;
		if(qipan.currentTurn==Qizi._black)
		{
			qipan.currentTurn=Qizi.white;
			
		}
		else
		{
			qipan.currentTurn=Qizi._black;
		}
		//--第三次-------判断[x,y]落子后是否可以提掉对方的子--------------------------------------
		qipan.tizi(x, y);
		//--第三次-------判断是否挤死了自己,若是则以落的子无效
		if(qipan.allDead(qizi).size()!=0)
		{
			qipan.map[x][y]=null;
			qipan.repaint();
			qipan.controlPanel.setMsg("不能下子");
			//----------------back-------
			qipan.qizis.removeElement(qizi);
			qipan.num--;
			if(qipan.currentTurn==Qizi._black)
			{
				qipan.currentTurn=Qizi.white;
			}
			else
			{
				qipan.currentTurn=Qizi._black;
			}
			return;
		}
		///---------------------------------------------------------------------------
		qipan.mouseLoc=null;
		//更新控制面板
		qipan.controlPanel.setLabel();
	}
	public void mouseExited(MouseEvent evt)//鼠标退出是,清除将要落子的位置
	{
		qipan.mouseLoc=null;
		qipan.repaint();
	}
	
}
package com.wq3;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class IL implements ItemListener //下棋动作
{
	private Qipan qipan;
	
	public IL(Qipan qipan)
	{
		this.qipan=qipan;
	}
	

	@Override
	public void itemStateChanged(ItemEvent evt) 
	{

		String s=(String) (evt.getItem());
		int rects=Integer.parseInt(s.substring(0,2).trim())-1;
		if(rects!=qipan.rectnum)
		{
			qipan.rectlen=(qipan._rectlen*qipan._rectnum)/rects;
			qipan.qizilen=qipan.rectlen*9/10;
			qipan.rectnum=rects;
			qipan.start();
		}
	}

}

以上源码仅供学习者进行参考,如需对程序进一步服务或者其他需求,请联系本人:

https://pan.baidu.com/s/1aFNohw3xMVbkwvQmBP1_OA

发布了36 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_36812792/article/details/89038560
今日推荐