部分源码参考:
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();
}
}
}
以上源码仅供学习者进行参考,如需对程序进一步服务或者其他需求,请联系本人: