连连看第二更

这里的是用面向对象的思维做的,比前面的那个强太多了,这里用到了一线 二线 三线消除其实也学到了,做项目不要一次性把所有要做的东西全部搞出来,最好是把它分成好多小块,这样问题就会慢慢的解决了,也会变得更加容易解决。。。。。。。。。。

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;

    }

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值