Swing界面之五子棋小结



        我写五子棋界面与画图板的方法相类似,也是用到了JFrame中创建窗体的方法,并且用JButton创建“悔棋”按键对象,添加到窗体上(我在窗体右边添加了一个JPanel对象来放置按键)。既然要实现下棋,那就需要用到监听器,我创建了一个Listener类,继承了MouseListener 和ActionListener(获得按钮的名字),分别添加到窗体上和按键上。也是因为重绘的原因,需要重写重绘的方法(里面包括重绘棋盘和棋子的方法)。当然为了保存棋子,也需要一个数组队列,与画图板保存图形的方法相似,创建了一个包含了棋子颜色,位置的类,并用这个类创建数组队列。下棋子的同时还需要标志已下棋子的位置,避免同一个位置可以重复下棋。

       上述的都是和画图板类似的,因为实践过一次了,所以感觉难度不大。而困难的地方还是在于判断输赢的方法。我曾经设想过一些判断方法,譬如从判断所下的那颗棋子的哪一行(列)的第一颗开始判断是否有相连的五颗,或者把黑棋(1)白棋(-1)的值相加,如果大于等于±5,就获胜,但是这些都没能实现,最后还是参照了书上的方法,并自己做了一些调整

	//判断输赢
	public int win(int r ,int c){
		int win = 0;
		int count = 0;
		//判断行
		for(int i=c+1;i<qu.chesses.length;i++){
			if(qu.chesses[r][i]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}
		for(int i=c;i>0;i--){
			if(qu.chesses[r][i]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}			
		if(count>=5){
			win=1;
			count=0;
		}
		else{
			count=0;
		}
		//判断列
		for(int i=r+1;i<qu.chesses.length;i++){
			if(qu.chesses[i][c]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}
		for(int i=r;i>0;i--){
			if(qu.chesses[i][c]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}

		if(count>=5){
			win=1;
			count=0;
		}
		else{
			count=0;
		}
		//判断左上到右下
		for(int i=r+1,j=c+1;i<qu.chesses.length&&j<qu.chesses.length;i++,j++){
			if(qu.chesses[i][j]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}
		for(int i=r,j=c;i>0&&j>0;i--,j--){
			if(qu.chesses[i][j]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}			
		if(count>=5){
			win=1;
			count=0;
		}
		else{
			count=0;
		}
		//判断左下到右上
		for(int i=r-1,j=c+1;i>0&&j<qu.chesses.length;i--,j++){
			if(qu.chesses[i][j]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}
		for(int i=r+1,j=c-1;i<qu.chesses.length&&j>0;i++,j--){
			if(qu.chesses[i][j]==qu.chesses[r][c]){
				count++;
			}
			else{
				break;
			}
		}			
		if(count>=4){
			win=1;
			count=0;
		}
		else{
			count=0;
		}
		return win;
	}

 我将判断输赢写成了一个方法,并且会返回一个值,如果值为真就是赢。这样做也更方便在每一次下棋后调用,不用重复写代码。

       悔棋对我来说也是一个难点,之前我一直不懂如何才能正确识别“悔棋”按钮,加入使用MouseListener,每次点击都会和下棋一样判断按键的坐标,但是按键的坐标从右上角(0,0)算起,由于是与画板添加同一个监听器的缘故,都会误下棋子。后来雄哥教我说为只需要为按键添加ActionListener就行方才恍然大悟,并且把悔棋的方法也写进了ActionListener的方法里头。其实悔棋的方法并不难,只需要在数组队列里面添加一个删除最后一个元素的方法,并在点击“悔棋”后调用,然后使用窗体的repaint方法来重绘画图板即可。

      通过这几天的学习,觉得学得比以前的都要多,虽然五子棋仅仅是写了一个简简单单的界面,而且还没有人机算法,但是我希望通过以后的学习,能够不断地完善这个五子棋这个工程和掌握相关的知识点。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值