这里的是用面向对象的思维做的,比前面的那个强太多了,这里用到了一线 二线 三线消除其实也学到了,做项目不要一次性把所有要做的东西全部搞出来,最好是把它分成好多小块,这样问题就会慢慢的解决了,也会变得更加容易解决。。。。。。。。。。
import java.util.Scanner;
import java.util.Random;//放在开头,跟Scanner 一样。
import com.yc.biz.Erase;
importcom.yc.bean.Point;
public class Test2{
public static void main(String []args){
//输入行和列
int rows=0;//行
int cols=0;//列
Scanner sc =new Scanner(System.in);
do{System.out.println("请输入行:");
rows=sc.nextInt();
sc.nextLine();
}while(rows<2);
do{System.out.println("请输入列:");
cols=sc.nextInt();
sc.nextLine();
}while(cols<2||cols%2!=0);
int level;
do{System.out.println("请输入游戏等级(5--20):");
level=sc.nextInt();
sc.nextLine();
}while(level<5||level>20);
//创建二维数组
int [][] board=new int[rows+2][cols+2];
System.out.println("显示原始棋盘:");
showBoard( board);
//随机生成数据
genBoard( board,level);
System.out.println("显示随机生成后的棋盘:");
showBoard( board);
//打乱
shuffle( board);
System.out.println("显示打乱后的棋盘:");
showBoard2( board);
boolean isGameOver=false;
Erase erase=new Erase();
do{
//循环请用户输入四个下标
System.out.println("请输入四个下标值格式(0 0 0 0)");
int x1=sc.nextInt();
int y1=sc.nextInt();
int x2=sc.nextInt();
int y2=sc.nextInt();
//将四个下标组成两个点(点的类,x,y)
Point p1=new Point();
p1.x=x1;
p1.y=y1;
Point p2=new Point();
p2.x=x2;
p2.y=y2;
//判断是否能消除(不能是同一个点,两个点的值要相等)
if(erase.doCheck(board,p1,p2)){
//将这两个点的值改为0;
board[p1.x][p1.y]=0;
board[p2.x][p2.y]=0;
}
//重新显示棋盘
showBoard2(board);
//判断游戏是否继续
isGameOver=erase.isGameOver(board);
}while(isGameOver==false);
}
//显示棋盘
public static void showBoard(int[][] board){
for(int i=0;i
for(int j=0;j
System.out.print(board[i][j]+"\t");
}
System.out.println();
}
}
public static void showBoard2(int[][] board){
showCols( board);
for(int i=0;i
for(int j=0;j
if(i==0||j==0||i==board.length-1||j==board.length-1){
//决断是否为第一列
if((i==0&&j==0)||(i==0&&j==board[i].length-1)||(i==board.length-1&&j==0)||(i==board.length-1&&j==board[i].length-1)){
System.out.print("\t");
}
else if(i!=0&& i!=board.length-1 && j==0){
System.out.print(i+"*\t");
}else if(i!=0&& i!=board.length-1 && j==board[i].length-1){
System.out.print("*"+i);
}
else{
System.out.print("********");//一个 /t 是八格
}
}
else if(board[i][j]==0){
System.out.print("\t");
}else{
System.out.print(board[i][j]+"\t");
}
}
System.out.println();
}
showCols( board);
}
//输出列号
public static void showCols( int [][] board){
for(int i=0;i
if(i==0){
System.out.print("\t");
}else{
System.out.print(i+"\t");
}
}
System.out.println();
}
//随机生成棋盘的数据 注意 第一行,列 不生成 ,最后一行 列不生成
//一次生成两个相同的数据 ,相邻的两列
public static void genBoard( int[][] board,int level){
if(board==null){
return;
}
Random r=new Random();
for(int i=1;i
for(int j=1;j
board[i][j]=r.nextInt(level)+1;
board[i][j+1]=board[i][j];
}
}
}
//打乱这个棋盘 每次随机生成两个棋子的下标,再将这两个棋子交换 循环交换(注意循环的终止。。。。。)
public static void shuffle( int[][] board){
//循环的次数与行 列有关
int x1;
int y1;
int x2;
int y2;
int temp;
Random r=new Random();
for(int i=0;i
x1= r.nextInt( board.length-2 )+1;//保证第一行不会被交换
y1= r.nextInt( board[0].length-2 )+1;
x2= r.nextInt( board.length-2 )+1;
y2= r.nextInt( board[0].length-2 )+1;
temp=board[x1][y1];
board[x1][y1]=board[x2][y2];
board[x2][y2]=temp;
}
类Erase
package com.yc.biz; //biz:business 业务 消除业务
import com.yc.bean.Point; //注意package 必须是类文的第一句,而这里用到列porint 所以必须导入,但在package 之后
public class Erase{
//判断游戏结束
public boolean isGameOver(int[][]board){
for(int i=1;i
for(int j=1;j
if(board[i][j]!=0){
return false;
}
}
}
return true;
}
public boolean doCheck(int[][]board,Point p1,Point p2){
//检查是否可以消
//if((p1.x==p2.x&&p1.y==p2.y){
//System.out.println("您输的为同一点所以不能消除!");
//return false;
if(p1.equals(p2)){
return false;
}
if(equals(board,p1,p2)){
return false;
}
if(doOneLine(board,p1,p2)||doTowLine(board,p1,p2)||doThreeLine(board,p1,p2)){
return true;
}
return false;
}
private boolean equals(int [][]board,Point p1,Point p2){
if(board[p1.x][p1.y]!=board[p2.x][p2.y]){
return true;
}else{
return false;
}
}
private boolean doOneLine (int [][]board, Point p1,Point p2){
int min;
int max;
if(p1.x==p2.x){
min=p1.y
max=p1.y>p2.y?p1.y:p2.y;
for(int i=min+1;i
if(board[p1.x][i]!=0){
return false;
}
}
return true;
}else if(p1.y==p2.y){
min=p1.x
max=p1.x>p2.x?p1.x:p2.x;
for(int i=min+1;i
if(board[i][p1.y]!=0){
return false;
}
}
return true;
}
return false;
}
private boolean doTowLine (int [][]board, Point p1,Point p2){
Point temp1=new Point();
temp1.x=p1.x;
temp1.y=p2.y;
Point temp2=new Point();
temp2.x=p2.x;
temp2.y=p1.y;
if(doOneLine(board,p1,temp1)&&doOneLine(board,temp1,p2)&&board[temp1.x][temp1.y]==0||doOneLine(board,p1,temp2)&&doOneLine(board,temp2,p2)&&board[temp2.x][temp2.y]==0){
return true;
}
return false;
}
private boolean doThreeLine (int [][]board, Point p1,Point p2){
Point temp;
for(int i=0;i
if(i==p1.x){
continue;
}
temp=new Point();
temp.x=i;
temp.y=p1.y;
if(doOneLine(board,p1,temp)&&doTowLine(board,temp,p2)&&board[temp.x][temp.y]==0){
return true;
}
}
for(int i=0;i
if(i==p1.y){
continue;
}
temp=new Point();
temp.x=p1.x;
temp.y=i;
if(doOneLine(board,p1,temp)&&doTowLine(board,temp,p2)&&board[temp.x][temp.y]==0){
return true;
}
}
return false;
}
}
类Point
package com.yc.bean;
public class Point{
public int x;
public int y;
//Point p1=new Point();
//Point p2=new Point();
public boolean equals(Point p){
if(this.x == p.x && this.y==p.y){
System.out.println("您输的为同一点所以不能消除!");
return true;
}else{
return false;
}
}
}