Java学习日记:你会下五子棋,那你会用Java做五子棋吗?

Java学习日记:你会下五子棋,那你会做五子棋吗?

目录:
1. 实现棋盘,以及可以将棋子整齐放入棋盘。
第一步、第二步、第三步

2. 加入判断机制。
第四步

五子棋规则简介:
(1)对局双方各执一色棋子。
(2)空棋盘开局。
(3)黑先、白后,交替下子,每次只能下一子。
(4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
(5)黑方的第一枚棋子可下在棋盘任意交叉点上。
(6)轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)。
(7)先形成五子连线者获胜。

按照规定,棋盘应当是15 * 15。但我们是正在学习制作,因此,我们采用11 * 11,后面将所有流程熟练以后,更改为15 * 15。

1. 实现棋盘,以及可以将棋子整齐放入棋盘。

第一步:
在界面上绘制横、竖各11条线:

for (int i=0;i<101;i+=10) {
	g.drawLine(100, 100+4*i, 500, 100+4*i);
	g.drawLine(100+4*i, 100, 100+4*i, 500);
}

棋盘线与线间的间隔为40。
第二步:
给棋盘设置颜色,棋子为黑、白。因此,将棋盘设置其它颜色会让我们的棋盘更加美观。

this.setBackground(Color.yellow);//如果是继承JFrame类
//或者 
JFrame jf=new JFrame();
jf.setBackground(Color.yellow);

第三步:
向棋盘上放置棋子,这里我们需要用到监听器来监听我们的鼠标操作。监听器的操作前面的系列已讲述,这里不再赘述。由于我们需要将棋子放到特定的位置(线与线的交点),但是我们的鼠标并不能精确的点到那一个点。因此我们需要给定一个范围,这个范围以内都是那一个点的。

public void mouseReleased(MouseEvent e) {
	 int x=e.getX();//获取点击坐标
	 int y=e.getY();
	 //棋子:
	 //棋盘范围(100,100)-(500,500)
	 int keyX=(int) Math.floor((x-100)/40)*40+100;//点:100、140、180...
	 int keyY=(int) Math.floor((y-100)/40)*40+100;
	 if(x<=520&&x>=80&&y<=520&&y>=80) {//确保有效点击位置在棋盘范围内
	 if((x-100)%40<=20&&(y-100)%40<=20) {//计算点在每一个小正方形的位置,然后绘制棋子
		 
	 g.fillOval(keyX-20, keyY-20,40,40); 
	 }
	 else if((x-100)%40<=20&&(y-100)%40>20) {
		 
		 g.fillOval(keyX-20, keyY+20,40,40); 
		 }
	 else if((x-100)%40>20&&(y-100)%40>20) {
		 
		 g.fillOval(keyX+20, keyY+20,40,40); 
		 }
	 else if((x-100)%40>20&&(y-100)%40<20) {
		 
		 g.fillOval(keyX+20, keyY-20,40,40); 
		 }
	 }
 }

到此,一个能整齐放置棋子的棋盘就做好了。

2. 加入判断机制。

第四步:
加入判断机制,我们需要为已放置棋子的位置作上标记,标识其已有棋子、是什么棋子。当我们完成这一步以后,每放置一颗棋子以前,判断该位置是否为空。放置以后,以该位置为起始点,向各个方向判断是否已有五个同色棋子相连成一线。
方法:
创建一个大小为格子数的数组,将黑子标识为1,白子标识为-1,空白为0。每次放置前检验该位置的值,放置后检验附近格子的值。

放置棋子: 在上面的基础上做了一些修改。

public void laychess(int x,int y) {
		//落棋点坐标
		int keyX=(int) Math.floor((x-100)/40)*40+100;
		int keyY=(int) Math.floor((y-100)/40)*40+100;
		g.setColor(Color.black);
		
		//计数点
		float a=((x-100)%40);
		a=a/40;
		if(a>=0.5) {
			ix=(int) Math.floor((x-100)/40)+1;
		}
		else if(a<0.5) {
			ix=(int) Math.floor((x-100)/40);
		}
		
		float b=((y-100)%40);
		b=b/40;
		if(b>=0.5) {
			iy=(int) Math.floor((y-100)/40)+1;
			
		}
		else if(b<0.5) {
			iy=(int) Math.floor((y-100)/40);
		}

		System.out.println(ix+""+iy);
		
		if(chess[ix][iy]==0&&x<=520&&x>=80&&y<=520&&y>=80) {
			if((x-100)%40<=20&&(y-100)%40<=20) {
				g.fillOval(keyX-20, keyY-20,40,40);
				
			}
			else if((x-100)%40<=20&&(y-100)%40>20) {
				 
				 g.fillOval(keyX-20, keyY+20,40,40); 
				 }
			else if((x-100)%40>20&&(y-100)%40>20) {
				 
				 g.fillOval(keyX+20, keyY+20,40,40); 
				 }
			else if((x-100)%40>20&&(y-100)%40<20) {
				 
				 g.fillOval(keyX+20, keyY-20,40,40); 
				 }

			chess[ix][iy]=1;	
			
		}
		checkRow(ix,iy);
	}

检验: 这里只是一种思路展示,因此只加入了黑棋,但是相信你可以把它完善。

public void checkRow(int ix,int iy) {
		int count=0;
		for(int i=ix+1;i<chess.length-1;i++) {//向右检验
			if (chess[i][iy]==chess[ix][iy]) {
				count++; //计数器
			}			
			else {
				break;
			}			
		}
		for(int i=ix;i>0;i--) {//向左
			if (chess[i][iy]==chess[ix][iy]) {
				count++;
			}
			else {
				break;
			}			
		}		
		for(int i=iy+1;i<chess.length-1;i++) {//向下
			if (chess[ix][iy]==chess[ix][i+1]) {
				count++;
			}
			else {
				break;
			}			
		}
		for(int i=iy;i>0;i--) {//向上
			if (chess[ix][iy]==chess[ix][i]) {
				count++;
			}
			else {
				break;
			}
			
		} 
		System.out.println("count"+count);
		if(count==5) {
			System.out.println("黑棋胜利");
		}
	}

现在还差的便是分别放置黑白棋,两种思路:

  1. 利用按钮,点击对应按钮,改变颜色。
  2. 利用计数器,每次放置后加1,下一次放置看计数器的值,为奇数将棋子设置为黑,为偶数设置为白色。

一个简单的五子棋项目就完成了,当然,这里面还有许多不完善的地方,但是基本框架
思路已经是有了,剩下的就是不断完善。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值