与五子棋类似,编写中国象棋代码时先构造两个类,并添加监听。
public void ShowUI()
{
setTitle("中国象棋");
setSize(1200,875);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);
JButton btn1=new JButton("开启一局新的游戏");
btn1.setBounds(1025,100,100,35);
add(btn1);
setVisible(true);
addMouseListener(cheListener);
btn1.addActionListener(cheListener);
Graphics g=getGraphics();
cheListener.g=g;
cheListener.ui=this;
}
public static void main(String[] args)
{
Chess chessUI=new Chess();
chessUI.ShowUI();
}
在画布中绘画棋盘与初始棋子。根据在数列中定义的数字判定该位置的棋子类型。将图片存入固定位置便于调用。
public void paint(Graphics g)
{
Color color=new Color(175, 129, 36);
g.setColor(color);
g.fillRect(0,0,getWidth(),getHeight());
int X=50,Y=75,SIZE=50;
g.setColor(Color.BLACK);
for (int i=0;i<10;i++)
{
g.drawLine(X,Y+i*SIZE,X+8*SIZE,Y+i*SIZE);
if (i==0||i==8)
{
g.drawLine(X+i*SIZE,Y,X+i*SIZE,Y+9*SIZE);
}
if (i>=1&&i<=7)
{
g.drawLine(X+i*SIZE,Y,X+i*SIZE,Y+4*SIZE);
g.drawLine(X+i*SIZE,Y+5*SIZE,X+i*SIZE,Y+9*SIZE);
}
}
g.drawLine(X+3*SIZE,Y,X+5*SIZE,Y+2*SIZE);
g.drawLine(X+3*SIZE,Y+2*SIZE,X+5*SIZE,Y);
g.drawLine(X+3*SIZE,Y+7*SIZE,X+5*SIZE,Y+9*SIZE);
g.drawLine(X+3*SIZE,Y+9*SIZE,X+5*SIZE,Y+7*SIZE);
for (int i=0;i<=8;i++)
{
for (int j=0;j<=9;j++)
{
//红兵1,黑卒2,红炮3,黑砲4,红車5,黑車6,红馬7,黑馬8,红相9,黑象10,红仕11,黑士12,红帅13,黑将14.
//g.drawString填字
int sc = cheListener.Chessarr[i][j];
g.setColor(Color.red);
if (sc == 1) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\红兵.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 3) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\红炮.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 5) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\红车.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 7) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\红马.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 9) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\红象.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 11) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\红仕.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 13) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\红帅.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
g.setColor(Color.black);
if (sc == 2) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\黑卒.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 4) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\黑炮.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 6) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\黑车.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 8) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\黑马.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 10) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\黑象.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 12) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\黑士.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
if (sc == 14) {
BufferedImage image1= readImage ("D:\\CodeProgram\\IdeaProjects\\Pro23-07\\src\\com\\ly0805\\photo\\黑将.jpg");
g.drawImage (image1, X-20 + i * SIZE, Y-20 + j * SIZE, 40,40,null);
}
}
}
}
在监听类中构造数列,定义初始数字,读取按钮文字编写代码。
public Chess ui;
Graphics g;
int[][]Chessarr =new int [9][10];
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println("按钮被点击");
String btnStr=e.getActionCommand();
JButton btn=(JButton) e.getSource();
int X=50,Y=75,r=20;
if (btnStr.equals("开启一局新的游戏"))
{
btn.setText("结束对局");
for (int a=0;a<=8;a++)
{
if (a%2==0)
{
Chessarr[a][6]=1;
Chessarr[a][3]=2;
}
}
Chessarr[1][7]=3; Chessarr[7][7]=3;
Chessarr[1][2]=4; Chessarr[7][2]=4;
Chessarr[0][9]=5; Chessarr[8][9]=5;
Chessarr[0][0]=6; Chessarr[8][0]=6;
Chessarr[1][9]=7; Chessarr[7][9]=7;
Chessarr[1][0]=8; Chessarr[7][0]=8;
Chessarr[2][9]=9; Chessarr[6][9]=9;
Chessarr[2][0]=10; Chessarr[6][0]=10;
Chessarr[3][9]=11; Chessarr[5][9]=11;
Chessarr[3][0]=12; Chessarr[5][0]=12;
Chessarr[4][9]=13; Chessarr[4][0]=14;
}
if (btnStr.equals("结束对局"))
{
btn.setText("开启一局新的游戏");
for (int i=0;i<=8;i++)
{
for (int j=0;j<=9;j++)
{
Chessarr[i][j]=0;
}
}
}
定义相关数字判断当前状态使得棋子顺利移动。
int index=1;
int temp;
int ord=1;
public void mouseClicked(MouseEvent e)
{
int x=e.getX();
int y=e.getY();
System.out.println("x="+x+"y="+y);
int c=(x-50+25)/50;
int r=(y-75+25)/50;
System.out.println("c="+c+"r="+r);
if (index==1) {
if (ord == 1) {
if (Chessarr[c][r] % 2 == 0 && Chessarr[c][r] > 0) {
System.out.println("当前为红方先手");
JOptionPane.showMessageDialog(null, "当前为红方先手");
} else {
temp = Chessarr[c][r];
Chessarr[c][r] = 0;
}
ord = 2;
} else {
if (Chessarr[c][r] % 2 == 1) {
System.out.println("当前为黑棋先手");
JOptionPane.showMessageDialog(null, "当前为黑方先手");
} else {
temp = Chessarr[c][r];
Chessarr[c][r] = 0;
}
ord = 1;
}
}
else
{
Chessarr[c][r]=temp;
}
index=index%2+1;
ui.repaint();
}