java基础五子棋练习题
五子棋难的是扫描,我将5子棋分成4种扫描每种扫描方式都可以看成成一种k(斜率)相同的直线函数4种方式为:
(1) 横向扫描:
(2) 竖向扫描
(3) 斜杠扫描
(4) 反斜杠扫描
package com.zy.Demo;
import java.util.Scanner;
/*
* 五子棋,可以通过直线函数实现
*/
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
//定义一个二维数组来存棋盘
int [][] checkerboard = new int[15][15];
//行数
int y =0;
//列数
int x = 0;
int n = 0;
int m = 0;//给数组赋值
for(int i = 0;i<checkerboard.length;i++) {
for(int j = 0;j<checkerboard.length;j++) {
checkerboard[i][j] = 0;
System.out.print(checkerboard[i][j]);
}
System.out.println();
}
while(true) {
System.out.println("黑方请输入x:");
int blackX = scanner.nextInt();
System.out.println("黑方请输入y:");
int blacky = scanner.nextInt();
checkerboard[blacky][ blackX] = 1;
//黑方
//第一种横向扫描,可以用y=|b|来控制横纵指标,b的取值范围为(-14,0)
for(int b = 0;b<checkerboard.length;b++) {
y=b;
for(int i = 0;i<checkerboard.length;i++) {
x=i;
//n为累计数
if(checkerboard[y][x]==1) {
n++;
if(n==5) {
System.out.println("黑方获胜");
break;
}
}else {//如果有一次不为1就重新开始
n=0;
}
}
}
//第二种竖向扫描,可用x=b来控制横纵指标,b的取值范围为(0,14)
for(int b = 0;b<checkerboard.length;b++) {
x=b;
for(int i = 0;i<checkerboard.length;i++) {
y=i;
//n为累计数
if(checkerboard[y][x]==1) {
n++;
if(n==5) {
System.out.println("黑方获胜");
break;
}
}else {//如果有一次不为1就重新开始
n=0;
}
}
}
//第3种为斜杠扫描y=x+b;b的范围是(-24,-4),当b的范围是(-14,-4)时x的范围(0,|b|),当b的范围是(-15,-24)时x的时候的范围(14+b,14)
for(int b = -4;b>=-14;b--) {//当b的范围是(-14,-4)时x的范围(0,|b|),
for(int i = 0;i<=Math.abs(b);i++) {
x = i;
y = Math.abs(x+b);//y取绝对值
if(checkerboard[y][x]==1) {
n++;
if(n==5) {
System.out.println("黑方获胜");
break;
}
}else {//如果有一次不为1就重新开始
n=0;
}
}
}
for(int b = -15;b<=-24;b--) {//当b的范围是(-15,-24)时x的时候的范围(14+b,14)
for(int i = 14+b;i<=14;i++) {
x = i;
y = Math.abs(x+b);//y取绝对值
if(checkerboard[y][x]==1) {
n++;
if(n==5) {
System.out.println("黑方获胜");
break;
}
}else {//如果有一次不为1就重新开始
n=0;
}
}
}
//第四种为反斜杠扫描y=-x+n;b的范围是(-10,10);当b的范围是(-10,0)时x的范围是(0,14+b),当b的范围是(1,10)时x的范围是(b,14)
for(int b = -10;b<=0;b++) {//当b的范围是(-10,0)时x的范围是(0,14)
for(int i = 0;i<=14+b;i++) {
x = i;
y = Math.abs(-x+b);//y取绝对值
if(checkerboard[y][x]==1) {
n++;
if(n==5) {
System.out.println("黑方获胜");
break;
}
}else {//如果有一次不为1就重新开始
n=0;
}
}
}
for(int b = 1;b<=10;b++) {//当b的范围是(1,10)时x的范围是(b,14)
for(int i = b;i<=14;i++) {
x = i;
y = Math.abs(-x+b);//y取绝对值
if(checkerboard[y][x]==1) {
n++;
if(n==5) {
System.out.println("黑方获胜");
break;
}
}else {//如果有一次不为1就重新开始
n=0;
}
}
}
//白方
System.out.println("白方请输入x:");
int whiteX = scanner.nextInt();
System.out.println("白方请输入y:");
int whitey = scanner.nextInt();
checkerboard[whitey][whiteX] = 2;
//第一种横向扫描,可以用y=|b|来控制横纵指标,b的取值范围为(-14,0)
for(int b = 0;b<checkerboard.length;b++) {
y=b;
for(int i = 0;i<checkerboard.length;i++) {
x=i;
if(checkerboard[y][x]==2) {
m++;
if(m==5) {
System.out.println("白方获胜");
break;
}
}else {//如果有一次不为2就重新开始
m=0;
}
}
}
//第二种竖向扫描,可以用x=b来控制横纵指标,b的取值范围为(0,14)
for(int b = 0;b<checkerboard.length;b++) {
x=b;
for(int i = 0;i<checkerboard.length;i++) {
y=i;
//n为累计数
if(checkerboard[y][x]==2) {
m++;
if(m==5) {
System.out.println("白方获胜");
break;
}
}else {//如果有一次不为2就重新开始
m=0;
}
}
}
//第3种为斜杠扫描y=x+b;b的范围是(-24,-4),当b的范围是(-14,-4)时x的范围(0,|b|),当b的范围是(-15,-24)时x的时候的范围(14+b,14)
for(int b = -4;b<=-14;b--) {//当b的范围是(-14,-4)时x的范围(0,|b|)
for(int i = 0;i<=Math.abs(b);i++) {
x = i;
y = Math.abs(x+b);//y取绝对值
if(checkerboard[y][x]==2) {
m++;
if(m==5) {
System.out.println("白方获胜");
break;
}
}else {//如果有一次不为2就重新开始
m=0;
}
}
}
for(int b = -15;b<=-24;b--) {//当b的范围是(-15,-24)时x的时候的范围(14+b,14)
for(int i = 14+b;i<=14;i++) {
x = i;
y = Math.abs(x+b);//y取绝对值
if(checkerboard[y][x]==2) {
m++;
if(m==5) {
System.out.println("白方获胜");
break;
}
}else {//如果有一次不为2就重新开始
m=0;
}
}
}
//第四种为反斜杠扫描y=-x+n;b的范围是(-10,10);当b的范围是(-10,0)时x的范围是(0,14),当b的范围是(1,10)时x的范围是(b,14)
for(int b = -10;b<=0;b++) {//当b的范围是(-10,0)时x的范围是(0,14)
for(int i = 0;i<=14+b;i++) {
x = i;
y = Math.abs(-x+b);//y取绝对值
if(checkerboard[y][x]==2) {
m++;
if(m==5) {
System.out.println("白方获胜");
break;
}
}else {//如果有一次不为2就重新开始
m=0;
}
}
}
for(int b = 1;b<=10;b++) {//当b的范围是(1,10)时x的范围是(b,14)
for(int i = b;i<=14;i++) {
x = i;
y = Math.abs(-x+b);//y取绝对值
if(checkerboard[y][x]==2) {
m++;
if(m==5) {
System.out.println("白方获胜");
break;
}
}else {//如果有一次不为2就重新开始
m=0;
}
}
}
}
}//看到这里的朋友其实我是不建议这么写代码的,我写的代码可读性不太行,我想提供的是一种方式,朋友们可以把我这当成反面教材,在写代码的时候一个参考!
}