ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

象棋棋盘的布局实现

象棋棋盘的布局实现 象棋棋盘的布局实现组成程序入口代码实现XQ.java画布代码MyFrame的代码实现运行结果组成GoBangUI.java程序的入口负责程序的启动、主窗体的创建以及基本属性的配置MyFrame.java界面的画布继承自 JFrame重写了 paint 方法负责绘制棋盘背景、网格线以及调用棋子绘制逻辑XQ.java:数据的载体:定义了棋盘的二维数组结构存储了每个交叉点上的棋子信息程序入口代码实现程序入口packagelzy0815;importjavax.swing.*;publicclassGoBangUI{publicvoidshowUI(){MyFramejfnewMyFrame();// 实例化自定义窗体jf.setTitle(象棋);jf.setSize(900,900);// 设置窗口大小jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setVisible(true);// 关键让窗口可见触发paint方法}publicstaticvoidmain(){GoBangUIuinewGoBangUI();ui.showUI();}}XQ.java画布代码核心数据结构二维数组chessData代码publicclassXQ{// 定义棋盘数组10行9列// 0代表空位非0数字代表不同的棋子int[][]chessDatanewint[10][9];// 定义棋子常量增强代码可读性publicstaticfinalintBLACK_CAR1;// 黑车publicstaticfinalintBLACK_HORSE2;// 黑马// ...以此类推publicXQ(){initChess();// 构造时初始化布局}}好的没问题。在CSDN技术博客中将数据结构XQ.java与图形绘制MyFrame.java解耦是体现编程思维的关键点。针对你要求的“只讲XQ.java棋子实现”我为你撰写了以下博客章节。这段内容专注于如何用二维数组抽象棋盘状态你可以直接将其作为博客的“数据模型设计”部分。二、数据模型设计XQ.java 与二维数组的奥秘在图形界面显示之前我们需要先在内存中构建一个“虚拟棋盘”。这就是 XQ.java 的核心职责。它不关心棋子长什么样只关心“谁在哪里”。. 核心数据结构二维数组 chessData中国象棋棋盘是一个××10 的网格9条竖线10条横线。在Java中最完美的对应结构就是二维整型数组。在 XQ.java 中我们通常这样定义javapublic class XQ {// 定义棋盘数组10行9列// 0代表空位非0数字代表不同的棋子int[][] chessData new int[10][9];// 定义棋子常量增强代码可读性 public static final int BLACK_CAR 1; // 黑车 public static final int BLACK_HORSE 2; // 黑马 // ...以此类推 public XQ() { initChess(); // 构造时初始化布局 }}初始化布局initChess() 方法数组下标 [i][j]i 代表行数y轴j 代表列数x轴packagelzy0815;importjava.awt.*;publicclassXQ{intX80,Y100,SIZE80,ROW9,COL8;int[][]initChessArr{{5,4,3,2,1,2,3,4,5},{0,0,0,0,0,0,0,0,0},{0,6,0,0,0,0,0,6,0},{7,0,7,0,7,0,7,0,7},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0}};// 棋盘初始化棋子publicvoidinitChess(Graphicsg){for(inti0;i10;i){for(intj0;j9;j){intnuminitChessArr[i][j];if(num!0){drawChess(g,num,i,j);}}}}publicvoiddrawChess(Graphicsg,intnum,inti,intj){Stringstr;switch(num){case1-str帅;case2-str仕;case3-str相;case4-str车;case5-str马;case6-str炮;case7-str兵;}intcxj*SIZEX-SIZE/2;intcyi*SIZEY-SIZE/2;g.setColor(Color.ORANGE);g.fillOval(cx,cy,SIZE,SIZE);g.setColor(Color.BLACK);FontfontnewFont(微软雅黑,Font.BOLD,45);g.setFont(font);g.drawString(str,cxSIZE/6,cy55);}}MyFrame的代码实现核心机制重写 paint(Graphics g)在 Java Swing 中所有的界面绘制都不是由程序员手动调用的而是由系统在窗口刷新时自动触发的我们需要重写 paint 方法并严格遵守绘制顺序先画背景再画网格如果需要最后画棋子// 重写paint方法 窗体被改变尺寸时 会自动调用Overridepublicvoidpaint(Graphicsg){super.paint(g);// 绘制原本的窗体中的白板// System.out.println(hello);难点突破从“数组下标”到“屏幕坐标”的转换逻辑坐标在 XQ.java 中我们用 chessData[i][j] 表示第 i 行第 j 列。物理坐标在屏幕上像素是以 (x, y) 计算的。我们需要建立一个映射公式。假设棋盘左上角第一个交叉点的像素坐标是 (offsetX, offsetY)每个格子的间距是 space棋子 X 坐标 offsetX j * space 列号 j 决定横向位置棋子 Y 坐标 offsetY i * space 行号 i 决定纵向位置面向对象的思想MyFrame 不需要知道每个棋子长什么样它只需要告诉棋子“你在 (x,y)你自己画自己”g.drawImage(img.getImage(),0,0,900,900,null);// g.setColor(Color.ORANGE);// g.fillRect(X-SIZE/2,Y-SIZE/2,SIZE*COLSIZE,ROW*SIZESIZE);g.setColor(Color.BLACK);for(inti0;iROW;i){g.drawLine(X,Yi*SIZE,XCOL*SIZE,Yi*SIZE);}for(inti0;iCOL;i){g.drawLine(Xi*SIZE,Y,Xi*SIZE,YROW*SIZE);}// 绘制楚河汉界g.setColor(Color.WHITE);g.fillRect(X1,YSIZE*4,SIZE*8-2,SIZE-2);g.setColor(Color.BLACK);Stringstr1楚,str2河,str3汉,str4界;FontfontnewFont(微软雅黑,Font.BOLD,60);g.setFont(font);g.drawString(str1,XSIZE,YSIZE*5-20);g.drawString(str2,XSIZE*2,YSIZE*5-20);g.drawString(str3,XSIZE*5,YSIZE*5-20);g.drawString(str4,XSIZE*6,YSIZE*5-20);g.drawLine(XSIZE*3,Y,XSIZE*5,YSIZE*2);g.drawLine(XSIZE*5,Y,XSIZE*3,YSIZE*2);g.drawLine(XSIZE*3,YSIZE*9,XSIZE*5,YSIZE*7);g.drawLine(XSIZE*3,YSIZE*7,XSIZE*5,YSIZE*9);xq.initChess(g);// 绘制棋子}}运行结果结果
返回列表