當(dāng)前位置:首頁 > IT技術(shù) > 編程語言 > 正文

java實(shí)現(xiàn)中國象棋1:界面的制作
2021-12-01 22:51:50



java實(shí)現(xiàn)中國象棋1:界面的制作


前言

中國象棋的界面主要有三個(gè)部分:棋盤,棋子和按鈕。棋盤在網(wǎng)上可以找到許多相關(guān)的圖片,但是棋子和按鈕就找不到,或者找到的棋子圖片很丑,因此我就自己用PS畫了棋子和按鈕,有需要的朋友可以加我微信,我會(huì)把我的微信號(hào)放在文章最后面。注:我們把所有的圖片都放在包的下面。例如Package的名字為Chinesechess,那么就在此Package下新建一個(gè)名為Chinesechess.image的package,并把圖片放入,不然程序?qū)⒄也坏綀D片。(作者使用的IDE為Eclipse,不同的IDE可能會(huì)有不同的引入圖片的方法。請大家根據(jù)自己所使用的IDE選擇合適的方法引入圖片)

界面思路

棋盤

棋盤的圖片在網(wǎng)上找一張自己覺得好看的就好,直接在百度圖片里就可以找到許多種類的棋盤圖片。我的思路是用JPanel的Paint方法把圖片畫到面板上,面板繼承JPanel類。代碼如下:

// DrawUI.java

public class DrawUI extends JPanel {
public void initui() {
// 創(chuàng)建面板
JFrame jf = new JFrame();
// 設(shè)置面板屬性
jf.setSize(1240, 860);
jf.setTitle("中國象棋");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);// 設(shè)置關(guān)閉窗體即清除進(jìn)程
jf.getContentPane().setBackground(Color.WHITE);// 設(shè)置背景顏色為白色
jf.setLocationRelativeTo(null);// 窗口
jf.setResizable(false);// 設(shè)置窗體不可放縮
this.setBackground(Color.white);
jf.add(this);
jf.setVisible(true);
}

// 重繪
public void paint(Graphics g) {
super.paint(g);
// 畫棋盤
g.drawImage(new ImageIcon(getClass().getResource("image\"+"棋盤.jpg")).getImage(), 90, 60, 625, 700, this);
}

public static void main(String args[]) {
DrawUI ui = new DrawUI();
ui.initui();
}
}

此時(shí)界面如下:

java實(shí)現(xiàn)中國象棋1:界面的制作_ico

棋子

因?yàn)槲覀冃枰獙ζ灞P上的棋子進(jìn)行點(diǎn)擊操作,只要一個(gè)DrawUI類是肯定不夠的,所以我們新建一個(gè)監(jiān)聽器的類,在這個(gè)類里面我們對棋子進(jìn)行操作。我的思路是建立一個(gè)二維數(shù)組,每種棋子用一個(gè)數(shù)字來表示,例如“將”我用數(shù)字5表示,“卒”我都用7表示。詳細(xì)表示為:

java實(shí)現(xiàn)中國象棋1:界面的制作_中國象棋_02

接下來我們需要對棋盤的起始點(diǎn)和棋盤的格子的大小進(jìn)行測量,并自己定義要畫的棋子的大小,寫在init的接口里。

代碼如下:

//init.java

public interface init {
public int x00 = 70;
public int x0 = 105;
public int y0 = 100;
public int row = 10;
public int column = 9;
public int chesssize = 67;
public int size = 76;
}
// Listener.java

public class Listener extends MouseAdapter implements ActionListener {
int[][] flag = new int[][]{ { 1, 2, 3, 4, 5, 4, 3, 2, 1 }, { 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 },
{ 77, 0, 77, 0, 77, 0, 77, 0, 77 }, { 0, 66, 0, 0, 0, 0, 0, 66, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 11, 22, 33, 44, 55, 44, 33, 22, 11 } }; // 初始化棋盤

// 將畫布傳遞過來
public void setG(Graphics g) {
this.g = g;
}

public void setUI(DrawUI ui) {
this.ui = ui;
}

public void actionPerformed(ActionEvent e) {

}
}
// DrawUI.java

public class DrawUI extends JPanel {

Listener ls = new Listener();

public void initui() {
// 創(chuàng)建面板
JFrame jf = new JFrame();
// 設(shè)置面板屬性
jf.setSize(1240, 860);
jf.setTitle("中國象棋");
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);// 設(shè)置關(guān)閉窗體即清除進(jìn)程
jf.getContentPane().setBackground(Color.WHITE);// 設(shè)置背景顏色為白色
jf.setLocationRelativeTo(null);// 窗口
jf.setResizable(false);// 設(shè)置窗體不可放縮
// 把this添加到JFrame中
this.setBackground(Color.white);
jf.add(this);
jf.setVisible(true);
// 給畫板添加監(jiān)聽器
jf.addMouseListener(ls);
Graphics g = jf.getGraphics();
ls.setG(g);
ls.setUI(this);
}

// 重繪
public void paint(Graphics g) {
super.paint(g);
// 畫棋盤
g.drawImage(new ImageIcon(getClass().getResource("image\" + "棋盤.jpg")).getImage(), 90, 60, 625, 700, this);
// 根據(jù)flag畫棋子
for (int i = 0; i < init.row; i++) {
for (int j = 0; j < init.column; j++) {
if (ls.flag[i][j] > 0) {
g.drawImage(new ImageIcon(getClass().getResource("image\"+(Integer.toString(ls.flag[i][j])) + ".png")).getImage(), init.y0 + j * init.size - init.chesssize / 2,init.x00 + i * init.size - init.chesssize / 2,init.chesssize, init.chesssize, this);
}
}
}
}

public static void main(String args[]) {
DrawUI ui = new DrawUI();
ui.initui();
}
}

此時(shí)的界面如下:

java實(shí)現(xiàn)中國象棋1:界面的制作_ico_03

按鈕和Logo

和一般的添加按鈕的不同是我們需要通過使用JButton的Paint方法來對按鈕進(jìn)行添加圖片的操作,并且用setBounds方法設(shè)置按鈕的位置,一定要把JPanel的布局設(shè)置為 n u l l null null,不然無效。我們新建一個(gè)JPanel對象,用來添加按鈕。并且為了好看,我又在右上角加了個(gè)Logo。代碼如下:

// 添加JPanel
JPanel jp = new JPanel();
jp.setPreferredSize(new Dimension(450, 1));
jp.setBackground(Color.white);
jp.setLayout(null);
jf.add(jp, BorderLayout.EAST);

// 添加按鈕
String[] ShapeBtn = { "開始游戲", "重新開始", "悔棋" };
for (int i = 0; i < ShapeBtn.length; i++) {
String name = ShapeBtn[i];
JButton jbt = new JButton(name) {
private static final long serialVersionUID = 1L;
Image jbti = new ImageIcon(this.getClass().getResource("image\" + name + ".png")).getImage();

public void paint(Graphics g) {
g.drawImage(jbti, 0, 0, 250, 100, null);
}
};
jbt.setBounds(100, 260 + 150 * i, 250, 100);
jbt.addActionListener(ls);
jp.add(jbt);
}

// 添加JLabel
JLabel jl = new JLabel("中國象棋") {
private static final long serialVersionUID = 1L;
Image jli = new ImageIcon(this.getClass().getResource("image\" + "中國象棋.png")).getImage();

public void paint(Graphics g) {
g.drawImage(jli, 0, 0, 400, 204, null);
}
};
jl.setBounds(0, 0, 400, 204);
jp.add(jl);

現(xiàn)在效果如下:

java實(shí)現(xiàn)中國象棋1:界面的制作_ide_04

現(xiàn)在我們的界面已經(jīng)做好了,接下來就要進(jìn)行重要的監(jiān)聽器部分。

關(guān)注微信公眾號(hào):圖靈完備,回復(fù)中國象棋即可獲得圖片及代碼資源。

微信號(hào):YonminMa


本文摘自 :https://blog.51cto.com/u

開通會(huì)員,享受整站包年服務(wù)立即開通 >