在基本绘制出五子棋之后,我们发现,拖动窗体之后,五子棋会消失,并且可以在同一位置下多个棋子,今天就来解决以下问题:
1.重绘功能
2.怎么判断某一个位置上有没有棋子
方法:
- 1.使用二维数组,将表格上的棋子转换为数组中的数据进行判定,运用chessType,为0时可以落子,为1,2时都不能落子
- 2.运用该二维数组中的0,1,2数据,进行棋子的重新绘制,实现重绘功能
public class GoBangUI{
GoListener gl=new GoListener();
public void showUI(){
GoFrame gf=new GoFrame();
gf.setTitle("五子棋v1.0");
gf.setSize(850,900);
gf.setLocation(500,100);
gf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gf.setVisible(true);
gf.addMouseListener(gl);
gl.g=gf.getGraphics;
}
public static void main(String[]args){
GoBangUI goBangUI=new GoBangUI();
goBangUI.showUI();
}
}
public class GoFrame extends JFrame{
public void paint(Graphics g){//重写Paint方法
super.paint(g);
//绘制棋盘
GoUtils.drawChessPad(g);
GoUtils.drawAllChess(g);
}
}
public class GoUtils{
static final int X=50;
static final int Y=75;
static final int ROW=15;
static final int COL=15;
static final int SIZE=50;//间距
static int [][]chessArray=new int[ROW+1][COL+1];
static int chessType=1;
//static 静态,程序一开始时就开始执行;final,常量,不可变
public static void drawChessPad(Graphics g){
Color color=new Color(194, 188, 126);//设置背景颜色
g.setColor(color);
g.fillRect(X-SIZE/2,Y-SIZE/2,(COL+1)*SIZE,(ROW+1)*SIZE);
g.setColor(Color.BLACK);
for(int i=0;i<=COL;i++){
g.drawLine(X+i*SIZE,Y,X+i*SIZE,Y+ROW*SIZE);
g.drawLine(X,Y+i*SIZE,X+COL*SIZE,Y+i*SIZE);
}
}
public static void drawAllChess(Graphics g){
for(int i=0;i<=ROW;i++){
for(int j=0;j<=COL;j++){
int n=chessArray[i][j];
if(n!=0){
if(n==1){
g.setColor(Color.BLACK);
}else{
g.setColor(Color.WHITE);
}
//还原标准坐标
int chessX=j*SIZE+X-SIZE/2;
int chessY=i*SIZE+Y-SIZE/2;
g.fillOval(chessX,chessY,SIZE,SIZE);
}
}
}
}
}
public class GoListener extends GoUtils implements MouseListener{
Graphics g;
//int chessType=1;//1:黑棋,2:白棋,0,不能落子
@Override
public void mousePressed(MouseEvent e) {
int x=e.getX();
int y=e.getY();
//换算行列值
int c=(x-X+SIZE/2)/SIZE;
int r=(y-Y+SIZE/2)/SIZE;
//验证落子的范围
if(c>COL||r>ROW||x<X-SIZE/2||y<Y-SIZE/2){
JOptionPane.showMessageDialog(null,"请在棋盘内落子");
return;
}
//看在r行c列的数据标识如果不为零,那么在这个地方已经有棋子存在,不能再落子
if(chessArray[r][c]!=0){
JOptionPane.showMessageDialog(null,"不能重复落子");
}
//chessArray是与棋盘同等规格大小的整数数组,16*16,所有元素初始默认值都为0,将0看成空位,将1看成黑棋,2看成白棋
//r.c为行列值,取值范围是0-15,正好与数组的下标吻合,我们可以直接以r,c为数组的下标存储当前棋子所对应的数字标识
chessArray[r][c]=chessType;//用0,1,2表示棋子
for (int i = 0; i <=ROW; i++) {//打印出数组
for (int j = 0; j <=COL; j++) {
System.out.print(chessArray[i][j]+" ");
}
System.out.println();
}
//交替落子
if (chessType == 1) {
g.setColor(Color.BLACK);
chessType = 2;
} else if (chessType == 2) {
g.setColor(Color.WHITE);
chessType = 1;
}
//还原标准坐标
int chessX=c*SIZE+X-SIZE/2;
int chessY=r*SIZE+Y-SIZE/2;
g.fillOval(chessX,chessY,SIZE,SIZE);
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}
标签:int,五子棋,v2.0,final,gf,static,public,SIZE
From: https://blog.csdn.net/lxyfight/article/details/144187474