代码:
public class StartChessJFrame extends JFrame {
private ChessBoard chessBoard;//对战面板
private JPanel toolbar;//工具条面板
private JButton startButton, backButton, exitButton;
//重新开始按钮,悔棋按钮,和退出按钮
private JMenuBar menuBar;//菜单栏
private JMenu sysMenu;//系统菜单
private JMenuItem startMenuItem, exitMenuItem, backMenuItem; //重新开始,退出,和悔棋菜单项
public StartChessJFrame() { setTitle("简易版双人对战五子棋");
//设置标题
chessBoard= new ChessBoard();
// 创建和添加菜单
menuBar = new JMenuBar();
//初始化菜单栏
sysMenu= new JMenu("系统");
//初始化菜单
startMenuItem =new JMenuItem("重新开始");
exitMenuItem= new JMenuItem("退出");
backMenuItem= new JMenuItem("悔棋");
//初始化菜单项
sysMenu.add(startMenuItem);
//将三个菜单项添加到菜单上
sysMenu.add(backMenuItem);
sysMenu.add(exitMenuItem);
MyItemListener lis = new MBeanListener();//初始化按钮事件监听器内部类
this.startMenuItem.addActionListener(lis);
//将三个菜单项注册到事件监听器上
backMenuItem.addActionListener(lis);
exitMenuItem.addActionListener(lis);
}
MenuBar.add(sysMenu);
//将系统菜单添加到菜单栏上
setJMenuBar(menuBar);
// 将 menuBar 设置为菜单栏
toolbar =new JPanel();
//工具面板栏实例化
startButton= new JButton("重新开始");
//三个按钮初始化
backButton= new JButton("悔棋");
exitButton= new JButton("退出");
toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));
// 将 工 具 面 板 按 钮 用FlowLayout 布局
toolbar.add(startButton);
//将三个按钮添加到工具面板上
toolbar.add(backButton);
toolbar.add(exitButton);
startButton.addActionListener(lis);
//将三个按钮注册监听事件
backButton.addActionListener(lis);
exitButton.addActionListener(lis);
add(toolbar,BorderLayout.SOUTH);
//将工具面板布局到界面下面
add(chessBoard);
//将面板对象添加到窗体上
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置界面关闭事件
//setSize(800,800);
pack(); // 自适应大小
}
private class MyItemListenerimplementsActionListener{//事件监听器内部类
public void actionPerformed(ActionEvent e){ Object obj =e.getSource();
// 取得事件源
if(obj == StartChessJFrame.this.startMenuItem || obj== startButton){ // 重新开始
// JFiveFrame.this 内部类引用外部类
System.out.println("重新开始...");
chessBoard.restartGame();
}else if(obj == exitMenuItem || obj== exitButton) { System.exit(0);
//结束应用程序
}else if(obj == backMenuItem|| obj == backButton) {// 悔棋
System.out.println("悔棋..."); chessBoard.goback(); }
}
}
public static void main(String[] args) {
StartChessJFrame f =new StartChessJFrame();
// 创建主框架
f.setVisible(true);
// 显示主框架 }
}
}
代码:
public class Point {
private int x; // 棋盘中的 x 索引
private int y; // 棋盘中的 y 索引
private Color color;//颜色
public static final int DIAMETER = 30;//直径
public Point(int x, int y, Color color) {
this.x= x;
this.y= y;
this.color= color;
}
public int getX(){// 拿到棋盘中的 x 索引
return x;
}
public int getY(){// 拿到棋盘中的 Y 索引
return y;
}
public Color getColor(){//得到颜色
return color;
}
}
代码:
public class ChessBoard extends JPanel implements MouseListener {
public static final int MARGIN =30; // 边距
public static final int GRID_SPAN= 35;// 网格间距
public static final int ROWS =15;//棋盘行数
public static final int COLS = 15;//棋盘列数
Point[] chessList = new Point[(ROWS +1) *(COLS + 1)]; // 初始每个数组元素为 null
boolean isBlack =true;//默然开始是黑棋先下
boolean gameOver =false;// 游戏是否结束
int chessCount; // 当前棋盘的棋子个数
int xIndex, yIndex;// 当前刚下的棋子的索引
public ChessBoard() { setBackground(Color.ORANGE);//设置背景颜色为橘黄色
addMouseListener(this);// 添加监听器
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
int x1 = (e.getX()- MARGIN +GRID_SPAN/ 2)/ GRID_SPAN; // 将鼠标点击的坐标位置转换成网格索引。
int y1 = (e.getY()- MARGIN +GRID_SPAN/ 2)/ GRID_SPAN;
if(x1 <0|| x1 >ROWS || y1< 0|| y1> COLS || gameOver || findChess(x1, y1)) setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
// 设置成默认形状
else
setCursor(new Cursor(Cursor.HAND_CURSOR)); // 设置成手型
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent( g); // 画棋盘
for (int i= 0; i<= ROWS; i++){// 画横线
g.drawLine(MARGIN, MARGIN +i *GRID_SPAN,MARGIN +COLS *GRID_SPAN, MARGIN+ i *GRID_SPAN);
}
for (int i= 0; i<= COLS; i++){// 画直线
g.drawLine(MARGIN + i * GRID_SPAN, MARGIN, MARGIN + i * GRID_SPAN, MARGIN+ ROWS *GRID_SPAN);
}
// 画棋子
for (int i= 0; i< chessCount; i++) {
int xPos = (int) (chessList[i].getX() * GRID_SPAN + MARGIN); // 网格交叉点的 x 坐 标
int yPos = (int) (chessList[i].getY() *GRID_SPAN+ MARGIN);//网格交叉点的y坐标
g.setColor(chessList[i].getColor());// 设置颜色
g.fillOval(xPos - Point.DIAMETER / 2, yPos - Point.DIAMETER /2, Point.DIAMETER, Point.DIAMETER); // 标记最后一个棋子的红矩形框
if(i== chessCount - 1) {// 最后一个棋子
g.setColor(Color.red); g.drawRect(xPos - Point.DIAMETER/ 2, yPos - Point.DIAMETER /2, Point.DIAMETER, Point.DIAMETER);
}
}
}
public void mousePressed(MouseEvent e){
// 鼠标按键在组件上按下时调用。
// 游戏已经结束,不能下
if(gameOver) return;
String colorName = isBlack ? "黑棋" : "白棋";
xIndex = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;
yIndex= (e.getY()- MARGIN +GRID_SPAN/ 2)/ GRID_SPAN;
// 落在棋盘外,不能下
if(xIndex <0|| xIndex >ROWS || yIndex< 0|| yIndex> COLS) return;
//x,y 位置已经有棋子存在,不能下
if(findChess(xIndex, yIndex)) return;
Point ch = new Point(xIndex, yIndex, isBlack ? Color.black: Color.white); chessList[chessCount++]= ch; repaint();
if(isWin()){ // 给出胜利信息,不能再继续下棋
String msg= String.format("恭喜,%s 赢了!", colorName);
JOptionPane.showMessageDialog(this, msg);
gameOver =true;
}
isBlack= !isBlack;
}
// 覆盖 MouseListener 的方法
public void mouseClicked(MouseEvent e){ } // 鼠标按键在组件上单击(按下并释放)时调用。
public void mouseEntered(MouseEvent e){
}// 鼠标进入到组件上时调用。
public void mouseExited(MouseEvent e){ }// 鼠标离开组件时调用。
public void mouseReleased(MouseEvent e){ } // 鼠标按钮在组件上释放时调用。
// 在棋子数组中查找是否有索引为 x,y 的棋子存在
private boolean findChess(int x, int y){
for (Point c :chessList) {
if(c!= null &&c.getX()== x&&c.getY() == y)
return true;
}
return false;
}
private boolean isWin(){
//判断那方赢
int continueCount = 1;
// 连续棋子的个数
// 横向向右寻找
for (int x=xIndex - 1; x>= 0; x--) {
Color c = isBlack? Color.black: Color.white;
if(getChess(x, yIndex, c)!= null){
continueCount++;
}
else break;
}
// 横向向左寻找
for (int x=xIndex +1; x<= ROWS; x++) {
Color c = isBlack? Color.black: Color.white;
if(getChess(x, yIndex, c)!= null){
continueCount++;
}
else break;
}
if(continueCount>= 5){
return true;
}
else continueCount = 1;
// 继续另一种情况的搜索: 纵向
// 纵向向上寻找
for (int y=yIndex - 1; y>= 0; y--) {
Color c = isBlack? Color.black: Color.white;
if(getChess(xIndex, y, c) != null){
continueCount++;
}
else break;
} // 纵向向下寻找
for (int y=yIndex +1; y<= ROWS; y++) {
Color c = isBlack? Color.black: Color.white;
if(getChess(xIndex, y, c) != null){
continueCount++;
}else break;
} if(continueCount>= 5){
return true;
}else continueCount = 1;
//继续另一种情况的搜索: 纵向
// 纵向向上寻找
for (int y=yIndex - 1; y>= 0; y--) {
Color c = isBlack? Color.black: Color.white;
if(getChess(xIndex, y, c) != null){ continueCount++; }else break;
}
// 纵向向下寻找
for (int y=yIndex +1; y<= ROWS; y++) {
Color c = isBlack? Color.black: Color.white;
if(getChess(xIndex, y, c) != null)
{
continueCount++;
}
else break;
}
if(continueCount>= 5){
return true;
}
else continueCount = 1;
//继续另一种情况的搜索: 斜向
// 左上寻找
for (int x=xIndex +1, y= yIndex- 1; y>= 0&&x<= COLS; x++, y--){
Color c = isBlack? Color.black: Color.white;
if(getChess(x, y, c) != null) {
continueCount++;
}
else break;
}
// 左下寻找
for (int x=xIndex - 1, y=yIndex +1; y<= ROWS &&x>= 0; x--, y++) {
Color c = isBlack? Color.black: Color.white;
if(getChess(x, y, c) != null) {
continueCount++;
}
else break;
}
if(continueCount>= 5){
return true;
}
else
continueCount = 1;
//继续另一种情况的搜索: 斜向
// 右上寻找
for (int x=xIndex - 1, y=yIndex - 1; y>= 0&&x>= 0; x--, y--){
Color c = isBlack? Color.black: Color.white;
if(getChess(x, y, c) != null)
{
continueCount++;
}
else break;
} // 右下寻找
for (int x=xIndex +1, y= yIndex+ 1; y<= ROWS &&x<= COLS; x++, y++){
Color c = isBlack? Color.black: Color.white;
if(getChess(x, y, c) != null) {
continueCount++;
}
else break;
}
if(continueCount>= 5){
return true;
}else continueCount = 1;
return false;
}
private Point getChess(int xIndex, int yIndex, Color color){
for (Point c :chessList) {
if(c!= null &&c.getX()== xIndex&&c.getY()== yIndex
&&c.getColor()== color)
return c;
}
return null;
}
public void restartGame(){
// 清除棋子
for (int i= 0; i< chessList.length; i++)
chessList[i]= null;
isBlack= true; gameOver= false;//游戏是否结束
chessCount= 0; // 当前棋盘的棋子个数
repaint();
}
// 悔棋
public void goback() {
if(chessCount == 0)
return;
chessList[chessCount - 1]= null; chessCount--;
if(chessCount > 0){
xIndex= chessList[chessCount - 1].getX();
yIndex= chessList[chessCount - 1].getY();
}
isBlack= !isBlack; repaint();
}
// Dimension: 矩形
public Dimension getPreferredSize(){
return new Dimension(MARGIN *2+GRID_SPAN*COLS, MARGIN *2 + GRID_SPAN*ROWS);
}
}