用Java swing写一个简单象棋程序的心里历程(1)

自己基本上写完了整个程序,可能会有小问题,没有时间也不准备看了。上传到了github的18845143731的用户里,需要的可以自己看看

  本来这一篇博客最开始是打算等完全把程序写出来后再写的,但是发现自己的程序要改的实在是太多了,很有可能改着改着就会忘记自己以前的思路,忘记以前写过的是什么样的,也就忘记了遇到的问题和解决的办法。所以还是从现在开始就记录自己的过程吧。
  我现在是怎么想的呢?先是需要一个JFrame,当窗口,这个直接把它放在Main里面。一个JPanel,名字叫GamePanel,把这个JPanel加载到前面的JFrame里,然后所有主要的操作都在这个JPanel上来进行。然后把每一个棋子当作一个类,黑方和红方的棋子是不同的类,分别把它们建一个class,然后把这些棋子加载到JPanel上。
在这里插入图片描述
上面是类和image的图示,感觉每一个棋子当一个类有点重复了吧。但是我又想到每一个棋子都有自己不同的走法,可以在类里面来规定它们各自的走法,也不重复哈。下面是BB类(也就是象)的源码:

package com.myChess;

import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;

public class BB extends JButton implements MouseListener{
	
	private int CurrentX;
	private int CurrentY;
	Boolean sFlag = false;
	public BB(int x,int y) {
		// TODO Auto-generated constructor stub
		init();
		this.CurrentX = x;
		this.CurrentY = y;
		this.addMouseListener(this);
	}
	
	public void init() {	
		//设定透明效果
		this.setOpaque(false);  
		//去掉背景点击效果
		this.setContentAreaFilled(false);  
		//去掉聚焦线
		this.setFocusPainted(false);
		//去掉边框
		this.setBorder(null);
		ImageIcon icon = new ImageIcon("src\\images\\BB.GIF");
		this.setIcon(icon);
	}
	
	public int[] BBmouseXY2legal(int[] XY) {
		int[] legalXY = new int[2];
		legalXY[0] = 20;
		legalXY[1] = 20;
		return legalXY;
	}

	@Override
	public void setLocation(int X, int Y) {
		// TODO Auto-generated method stub
		
		if(CurrentX == 2)
		this.move(X, Y);
		
		
	}
	@Override
	public void mouseClicked(MouseEvent var1) {
		// TODO Auto-generated method stub
		int c = var1.getButton();// 得到按下的鼠标键
		String mouseInfo = null;// 接收信息
		if (c == MouseEvent.BUTTON1)// 推断是鼠标左键按下
		{
			if(sFlag == false ) {
				ImageIcon icon = new ImageIcon("src\\images\\BBS.GIF");
				this.setIcon(icon);
				Data.selectPiece = (JButton)this;
				sFlag = !sFlag;
				
			}
			else if(sFlag == true) {
				ImageIcon icon = new ImageIcon("src\\images\\BB.GIF");
				this.setIcon(icon);
				sFlag = !sFlag;
			}
			
		}
	}

	@Override
	public void mousePressed(MouseEvent var1) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent var1) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent var1) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent var1) {
		// TODO Auto-generated method stub
		
	}
}

其实就是继承了一个JButton,然后把Icon设置成了的图片。再就是进行了鼠标监听,会在鼠标点一下的时候换成另外一张Icon,一张被选中的Icon,等会可以看后面的图。
GamePanel里的代码:

package com.myChess;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class GamePannel extends JPanel implements MouseListener{
	
	GamePannel() {
		init();
		this.setBounds(0, 0, 400, 400);
		this.setBackground(Color.red);
		this.setVisible(true);
		this.addMouseListener(this);
	}
	
	public void init() {		

		
		
		BK bk = new BK(189,30);
		BA ba1 = new BA(148,30);
		BA ba2 = new BA(148,30);
		BB bb1 = new BB(271,20);
		BB bb2 = new BB(107,20);
		BN bn1 = new BN(66,20);
		BN bn2= new BN(66,20);
		BR br1 = new BR(189,20);
		BR br2 = new BR(189,20);
		BC bc1 = new BC(25,20);
		BC bc2 = new BC(25,20);
		BP bp1 = new BP(148,20);
		BP bp2 = new BP(148,20);
		BP bp3 = new BP(148,20);
		BP bp4 = new BP(148,20);
		BP bp5 = new BP(148,20);
		
		this.add(br1);//黑子
		br1.setBounds(353, 20, Data.chessWidth, Data.chessHeigth);
		this.add(bn1);
		bn1.setBounds(312, 20, Data.chessWidth, Data.chessHeigth);
		this.add(bb1);
		bb1.setBounds(271, 20, Data.chessWidth, Data.chessHeigth);
		this.add(ba1);
		ba1.setBounds(230, 20, Data.chessWidth, Data.chessHeigth);
		this.add(bk);
		bk.setBounds(189, 20, Data.chessWidth, Data.chessHeigth);
		this.add(ba2);
		ba2.setBounds(148, 20, Data.chessWidth, Data.chessHeigth);
		this.add(bb2);
		bb2.setBounds(107, 20, Data.chessWidth, Data.chessHeigth);
		this.add(bn2);
		bn2.setBounds(66, 20, Data.chessWidth, Data.chessHeigth);
		this.add(br2);
		br2.setBounds(25, 20, Data.chessWidth, Data.chessHeigth);
		this.add(bc1);
		bc1.setBounds(312, 102, Data.chessWidth, Data.chessHeigth);
		this.add(bc2);
		bc2.setBounds(66, 102, Data.chessWidth, Data.chessHeigth);
		this.add(bp1);
		bp1.setBounds(353, 143, Data.chessWidth, Data.chessHeigth);
		this.add(bp2);
		bp2.setBounds(271, 143, Data.chessWidth, Data.chessHeigth);
		this.add(bp3);
		bp3.setBounds(189, 143, Data.chessWidth, Data.chessHeigth);
		this.add(bp4);
		bp4.setBounds(107, 143, Data.chessWidth, Data.chessHeigth);
		this.add(bp5);
		bp5.setBounds(25, 143, Data.chessWidth, Data.chessHeigth);
		
		
		RK rk = new RK(189,30);//红子
		RA ra1 = new RA(148,30);
		RA ra2 = new RA(148,30);
		RB rb1 = new RB(107,200);
		RB rb2 = new RB(107,200);
		RN rn1 = new RN(66,20);
		RN rn2 = new RN(66,20);
		RR rr1 = new RR(189,20);
		RR rr2 = new RR(189,20);
		RC rc1 = new RC(25,20);
		RC rc2 = new RC(25,20);
		RP rp1 = new RP(148,20);
		RP rp2 = new RP(148,20);
		RP rp3 = new RP(148,20);
		RP rp4 = new RP(148,20);
		RP rp5 = new RP(148,20);
	
		this.add(rr1);
		rr1.setBounds(353, 389, Data.chessWidth, Data.chessHeigth);
		this.add(rn1);
		rn1.setBounds(312, 389, Data.chessWidth, Data.chessHeigth);
		this.add(rb1);
		rb1.setBounds(271, 389, Data.chessWidth, Data.chessHeigth);
		this.add(ra1);
		ra1.setBounds(230, 389, Data.chessWidth, Data.chessHeigth);
		this.add(rk);
		rk.setBounds(189, 389, Data.chessWidth, Data.chessHeigth);
		this.add(ra2);
		ra2.setBounds(148, 389, Data.chessWidth, Data.chessHeigth);
		this.add(rb2);
		rb2.setBounds(107, 389, Data.chessWidth, Data.chessHeigth);
		this.add(rn2);
		rn2.setBounds(66, 389, Data.chessWidth, Data.chessHeigth);
		this.add(rr2);
		rr2.setBounds(25, 389, Data.chessWidth, Data.chessHeigth);
		this.add(rc1);
		rc1.setBounds(312, 307, Data.chessWidth, Data.chessHeigth);
		this.add(rc2);
		rc2.setBounds(66, 307, Data.chessWidth, Data.chessHeigth);
		this.add(rp1);
		rp1.setBounds(353, 266, Data.chessWidth, Data.chessHeigth);
		this.add(rp2);
		rp2.setBounds(271, 266, Data.chessWidth, Data.chessHeigth);
		this.add(rp3);
		rp3.setBounds(189, 266, Data.chessWidth, Data.chessHeigth);
		this.add(rp4);
		rp4.setBounds(107, 266, Data.chessWidth, Data.chessHeigth);
		this.add(rp5);
		rp5.setBounds(25, 266, Data.chessWidth, Data.chessHeigth);
	
	}
	

	@Override
	public void mouseClicked(MouseEvent var1) {
		// TODO Auto-generated method stub
		int c = var1.getButton();// 得到按下的鼠标键
		int mouseX = var1.getX();
		int mouseY = var1.getY();
		String mouseInfo = null;// 接收信息
		if (c == MouseEvent.BUTTON1)// 推断是鼠标左键按下
		{			
			Data.selectPiece.setLocation(mouseX, mouseY);
			Data.selectPiece = null;
		}
	
	
	}

	@Override
	public void mouseEntered(MouseEvent var1) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent var1) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent var1) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent var1) {
		// TODO Auto-generated method stub
		
	}

	 

}

好长啊~,其实大部分代码就是不断的把棋子添到GamePanel上去。32个棋子呢,还要设置坐标。这里有个要注意的地方,我本来想的是直接在构造函数里直接把棋子的坐标和大小给初始化了,但是发现在构造函数里设坐标大小,我的棋子就显示不出来了。只有实例化以后用setBounds方法才可以让棋子显示出来。对了,还要设置布局,下面是从网上界来的一张图意思好像是说我用setBound方法或setSize方法的话,它会默认长宽为0,所以就显示不出来啦。上面的GamePanel也设置了鼠标监听事件,当鼠标点到某一点时,会把已经选中的那个棋子移到鼠标当前位置。
在这里插入图片描述Data类里面打算存些通用的东西

package com.myChess;

import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;

public class Data {
	public static Boolean sFlag = false;
	public static JButton selectPiece = null;
	public static final int chessWidth = 41;
	public static final int chessHeigth = 41;
}

这里现在用到了selectPiece,就是代表选中的那个棋子.可以看一下BB.class(象那个类),里面的监听到鼠标按下时会有 Data.SelectPiece = this;,就是指向自己嘛,代表自己被选中。这里的chessWidth是final的,一般字母要全部大写额,记着什么时候改过来看一下演示图
在这里插入图片描述
运行完后报了一堆异常,以后慢慢看吧。。。。当然还有好多要改进的士怎么可能那么走。慢慢来吧,下面打算在每个棋子的类里面得到棋子的当前坐标,然后通过当前坐标,规定下一步只能走哪几个地方。还有那个坐标,太难看了吧,几百几的。找个办法,把坐标换成0,1,2,3,就好啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值