c语言编程五子棋人人对战,五子棋人人对战

费力我好大的劲我终于搞定五子棋人人对战了,关于五子棋人人对战对于我来说,最头疼的是斜线连珠问题,我开始用了两个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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值