五子棋:
- 界面
- 鼠标监听器
- 画图 重绘
- 数组存储棋子
- 判断输赢
import javax.swing.*;
import java.awt.*;
/**
* 创建界面:
* 1:用JFrame 创建对象
* 2:继承JFrame 直接调用到继承到的方法
* 3:绘制的棋盘 以及棋子 需要在界面刷新的时候重新绘制
* - 如何保存对象数据 传递对象
*/
public class GoBangUI extends JFrame{
/**
* 创建对象时调用的
* 可以加参数 参数可以初始化对象的属性
*/
public GoBangUI(){
setTitle ("五子棋 V1.0");
setSize (1000, 950);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setVisible (true);
// 加载鼠标监听器
GoListener gl = new GoListener ();
this.addMouseListener (gl);
// 获取Graphics
Graphics g = this.getGraphics ();
gl.gr = g;// 讲画笔对象传入监听器对象中
}
/**
* 绘制棋盘
* paint方法 重写的父类的刷新绘制方法
* 在界面初始化的时候直接调用
* 改变窗体时(拖动 最小/大化 移动等情况下调用这个绘制方法)
*
* @param g
*/
@Override
public void paint(Graphics g){
super.paint (g);
g.setColor (new Color (211, 141, 38));
g.fillRect (75, 75, 750, 750);
g.setColor (Color.BLACK);
// 绘制棋盘
for(int i = 0; i < 15; i++){
g.drawLine (100, 100 + i * 50, 800, 100 + i * 50);
g.drawLine (100 + i * 50, 100, 100 + i * 50, 800);
}
}
public static void main(String[] args){
new GoBangUI ();// 创建对象 也就是直接调用构造方法
}
}
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class GoListener implements MouseListener{
Graphics gr;
int chessFlag = 1;// 0是 不下棋 1 是 黑棋 2 是白棋
// 创建一个存储棋子的二维数组
int[][] chessArr = new int[14][14];
// GoBangIsWin
GoBangIsWin gowin = new GoBangIsWin ();
/**
* 按下时下棋
*
* @param e
*/
@Override
public void mousePressed(MouseEvent e){
// 获取按下时的下标
int x = e.getX ();
int y = e.getY ();
// 校正棋子坐标
int m = (x - 100) / 50; // 列
int n = (y - 100) / 50; // 行
System.out.println ("m: " + m + "n: " + n);
// 要注意什么时候才可以下棋
if(chessFlag == 0 || chessArr[n][m] != 0 || m >= 14 || n >= 14){
return;
}
// 存储棋子:0 1 2
chessArr[n][m] = chessFlag;
//判断输赢
int chessX = 100 + (m * 50);
int chessY = 100 + (n * 50);
if(chessFlag == 1){
gr.setColor (Color.BLACK);
// 判断输赢
if(gowin.isWin (chessArr, n, m)){
System.out.println ("黑棋胜利!!");
}
chessFlag = 2;
} else if(chessFlag == 2){
gr.setColor (Color.WHITE);
// 判断输赢
if(gowin.isWin (chessArr, n, m)){
System.out.println ("白棋胜利!!");
}
chessFlag = 1;
}
// 绘制棋子
gr.fillOval (chessX, chessY, 50, 50);
}
@Override
public void mouseClicked(MouseEvent e){
}
@Override
public void mouseReleased(MouseEvent e){
}
@Override
public void mouseEntered(MouseEvent e){
}
@Override
public void mouseExited(MouseEvent e){
}
}
public class GoBangIsWin{
// 判断是否有五子连棋
public boolean isWin(int[][] chessArr, int n, int m){
if(row (chessArr, n, m) >= 5){
return true;
}
return false;
}
/**
*
* @param chessArr 存储的棋子数组 0 1 2
* @param n 遍历的起点坐标
* @param m
* @return 返回连棋数
*/
private int row(int[][] chessArr, int n, int m){
int count = 0;
// 遍历两个小方向来查找相连棋子数
return count;
}
}