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,下一次放置看计数器的值,为奇数将棋子设置为黑,为偶数设置为白色。
一个简单的五子棋项目就完成了,当然,这里面还有许多不完善的地方,但是基本框架
思路已经是有了,剩下的就是不断完善。