五子棋人人对战

费力我好大的劲我终于搞定五子棋人人对战了,关于五子棋人人对战对于我来说,最头疼的是斜线连珠问题,我开始用了两个for循环,可是怎么也搞不出来,于是就用一个for循环,竟然出来了,无语啊。这是喜剧还是悲剧啊。
对于人人对战我感觉我们还是在练习重绘以及实例化,思路如下:
1:在接口中定义了五子棋的一些基本常量,
2:画五子棋棋板以及画棋子,最关键的是重绘的问题,其实在这里我用最不熟练的就是返回值的问题,关于返回值我有一个比较形象的比喻,就是:一个东西在盒子里,我们得把它拿出来才能用啊。
3:判断输赢,横纵是很好判断的,但是斜线就有点考验脑细胞了,用一个for循环就可以搞定。
这是关于判断输赢的类:
public class Win {
// 定义一个数组属性
private int[][] data;

/**
* 定义一个带参数的构造器
*/
public Win(int[][] data) {
this.data = data;

}

/**
* 定义四个不同的方法来判断输赢
*/
public boolean winRow(int r, int c) {
// 用来标记输赢的状态
boolean state = false;

int count = 1;// 计数器从一开始
int value = data[r][c];// 取出单元格的坐标
// 循环二维数组的列,往右判断
for (int j = c + 1; j < data[r].length; j++) {
// 如果棋子是同一个颜色,则计数器加一
if (value == data[r][j]) {
count++;
} else
break;

}
for (int j = c - 1; j >= 0; j--) {
if (value == data[r][j]) {
count++;
} else
break;
}

// 判断计数器是否为五,如果是就五子连珠,赢了
if (count >= 5) {
state = true;
}
return state;
}

public boolean winColumn(int r, int c) {
// 用来标记输赢的状态
boolean state = false;
int count = 1;

int value = data[r][c];// 取出坐标
// 循环二维数组的行,往下判断
for (int i = r + 1; i < data[c].length; i++) {
// 如果是同一颜色则计数器加一
if (value == data[i][c]) {
count++;
} else
break;
}
for (int i = r - 1; i >= 0; i--) {
// 如果是同一颜色则计数器加一
if (value == data[i][c]) {
count++;
} else
break;
}
if (count >= 5) {
state = true;
}
return state;

}

public boolean winLeft(int r, int c) {
// 用来标记输赢的
boolean state = false;
int count1 = 1;
int count2 = 1;
// int value = data[r][c];// 取出坐标
// // 循环
// for (int i = c + 1; i < data[r].length; i++) {
// for (int j = r + 1; j < data[c].length; j++) {
// if (value == data[i][j]) {
// count1++;
// } else
// break;
// }
// }
// for (int i = c - 1; i >= 0; i--) {
// for (int j = r - 1; j >= 0; j--) {
// if (value == data[i][j]) {
// count2++;
// } else
// break;
// }
// }
// if ((count1 + count2) >= 5) {
// state = true;
// }
int value = data[r][c];// 取出坐标
for (int j = c + 1, i = r + 1; j < data[r].length && i < data[c].length; j++, i++) {
if (value == data[i][j]) {
count1++;

} else
break;
}
for (int j = c - 1, i = r - 1; j >= 0 && i >= 0; j--, i--) {
if (value == data[i][j]) {
count2++;
}
}
if ((count1 + count2) >= 5) {
state = true;
}

return state;

}

public boolean winRight(int r, int c) {
boolean state = false;
int count1 = 1;
int count2 = 1;
int value = data[r][c];
for (int j = c + 1, i = r - 1; j < data[r].length && i >= 0; j++, i--) {
if (value == data[i][j]){
count1++;
}
}
for (int j = c - 1, i = r + 1; j >= 0 && i < data[c].length; j--, i++) {
if (value == data[i][j]) {
count2++;

}
}
if ((count1 + count2) >= 5) {
state = true;
}

return state;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值