暑假复习篇之五子棋①
五子棋项目步骤:
1、创建界面【界面必要因素:界面标题、尺寸、位置、关闭方式】
2、创建面板(控制面板与棋盘面板)【面板可以改变面板背景、面板的固定尺寸使用Dimension】
3、在控制面板上添加按钮【可以改变按钮的颜色,以及尺寸(Dimension)】
4、将面板添加到界面上面
5、界面可视化
6、主函数调用界面方法
7、创建监听器类,在界面方法的最前面添加上监听器,棋盘面板加上鼠标监听器,创建棋子类chessFlag是棋子类型
8、监听器类中actionPerformed(ActionEvent e) 实现按钮功能
9、自定义类GoService 用于管理游戏的核心逻辑,先规定棋盘的各项数据【坐标,尺寸,行,列,游戏流程控制变量,定义棋盘二维数组chessArr 在定义一个二维数组chessList储存棋盘的历史记录,chessIndex是chessList的索引】,画棋盘棋子
package lfx250629;import javax.swing.*;
import java.awt.*;import static java.awt.BorderLayout.*;public class GoBangUI {//添加监听器GoBangLinstener goBangLinstener = new GoBangLinstener();public GoBangUI(){//创建一个五子棋界面,添加:界面名字、尺寸、位置、关闭方式JFrame jf = new JFrame();jf.setTitle("五子棋");jf.setSize(1000,1000);jf.setLocationRelativeTo(null);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//添加两块面板,分别是棋盘面板和控制面板JPanel chessPanel = new JPanel();JPanel controlPanel = new JPanel();//设置面板背景chessPanel.setBackground(Color.CYAN);controlPanel.setBackground(Color.white);//设置控制面板的固定尺寸Dimension dimension = new Dimension(120,0);controlPanel.setPreferredSize(dimension);//添加按钮String[] btmStr ={"开始游戏","悔棋","人人对战"};for (int i = 0;i<btmStr.length;i++){JButton jButton = new JButton(btmStr[i]);controlPanel.add(jButton);//将按钮添加到控制面板上jButton.setBackground(Color.GREEN);jButton.setPreferredSize(new Dimension(100,30));//设置按钮的优先尺寸}jf.add(chessPanel, EAST);jf.add(controlPanel, WEST);jf.setVisible(true);//在棋盘面板上添加鼠标监听器chessPanel.addMouseListener(goBangLinstener);}public static void main(String[] args) {new GoBangUI();}
}
注意:如果定义棋盘面板是ChessPanel chessPanel = new ChessPanel();则需要创建一个ChessPanel使其继承JPanel
package lfx250629;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;public class GoBangLinstener implements MouseListener, ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {//实现按钮功能String ac = e.getActionCommand();if (ac.equals("开始游戏")){//(JButton)是一个强制转换符 将object转化为JButton//e.getSource();作用:返回触发事件对象,其返回类型为objectJButton jButton = (JButton) e.getSource();jButton.setText("结束对局");jButton.setBackground(Color.RED);} else if (ac.equals("悔棋")) {} else if (ac.equals("人人对战")) {JButton jButton = (JButton) e.getSource();jButton.setText("开始游戏");jButton.setBackground(Color.GREEN);}}@Overridepublic void mouseClicked(MouseEvent e) {int x = e.getX();int y = e.getY();System.out.println("x:"+x+"y:"+y);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}
}
package lfx250629;import java.awt.*;
import java.awt.image.BufferedImage;public class GoService {//GoService 是一个自定义类,通常用于管理游戏的核心逻辑//规定好棋盘的数据static final int X = 50;static final int Y = 50;static final int SIZE = 50;static final int ROW = 15;//行static final int COL = 15;//列//游戏流程控制变量int chessFlog = 0;//图形渲染Graphics g;//游戏数据static int[][] chessArr = new int[ROW+1][COL+1];//[ROW+1][COL+1]表示二维数组的长度static Chess[] chessList = new Chess[(ROW+1)*(COL+1)];//chessList储存棋盘中棋子的数据,是棋盘的历史记录final int chessIndex = 0;//chessIndex为chessList的索引//画棋盘public static void drawChessPad(Graphics g){//缓冲绘图BufferedImage bufferedImage = new BufferedImage(880,1000,2);Graphics ig = bufferedImage.getGraphics();//从缓冲绘图上获得画笔//绘制棋盘背景ig.setColor(Color.pink); //画笔颜色ig.fillRect(X-SIZE/2,Y-SIZE/2,SIZE*(COL+1),SIZE*(ROW+1));//先画棋盘最外面的框框//绘制棋盘的线ig.setColor(Color.BLACK);for (int i = 0;i <= COL;i++){ig.drawLine(X,Y+SIZE*1,X+SIZE*COL,Y+SIZE*i);ig.drawLine(X+SIZE*1,Y,X+SIZE*i,Y+SIZE*ROW);}g.drawImage(bufferedImage,0,0,null);}//自定义开始游戏public void initGame(){chessFlog = 1;//数据重置chessArr = new int[ROW+1][COL+1];drawChessPad(g);}//画棋子public static void drawAllChess(Graphics g){}}
package lfx250629;public class Chess {int r,c;int chessFlag;public Chess(int r, int c, int chessFlag){this.r = r ;this.c = c ;this.chessFlag = chessFlag;}
}
知识点回顾加补充
1、BorderLayout布局有东西南北中四个部分,面板使用该布局添加到界面上的时候
格式:jf.add(chessPanel , BorderLayout . 方位)
东EAST 西WEST 南SOUTH 北NORTH 中CENTER
2、动作监听器与鼠标监听器的方法
@Overridepublic void actionPerformed(ActionEvent e) {// 处理按钮点击事件String ac = e.getActionCommand();//获取按钮的文本信息}
public interface MouseListener extends EventListener {void mouseClicked(MouseEvent e); // 鼠标点击(按下并释放)void mousePressed(MouseEvent e); // 鼠标按下void mouseReleased(MouseEvent e); // 鼠标释放void mouseEntered(MouseEvent e); // 鼠标进入组件区域void mouseExited(MouseEvent e); // 鼠标离开组件区域
}
3、上面代码中的:
①e.getSource();返回触发事件对象,其返回类型为object
②(JButton)强制转换符 将object类型转换为JButton【①② 适用于多个按钮共同使用一个监听器,用于区别出发了什么事件】
③BufferedImage:图像缓冲区,本质是一个存储像素数据的内存区域
构造方法:BufferedImage(int width,int height,int ImageType[图像类型])
常用方法:int getWidth/int get height()获得图像宽度,高度
int getRGB(int x, int y)获得指定坐标像素颜色
④chessIndex:计数器,记录当前棋盘上棋子的数目
⑤Graphics常用方法
单词:
default 默认,违约,缺席
close 关闭,停止,完成
operation 运作,实施,行动
preferredsize 优先位置
dimension 大小,维度,范围
border 边界,包边,花带,国境