这篇文章主要为大家详细介绍了java实现连连看游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下
代码会实现共享的,这个是截图
代码:package com.lr.bean;
import java.util.scanner;
import java.util.random;
import com.lr.bean.point;
public class link{
public static void main(string[] args){
scanner sc=new scanner(system.in);
system.out.println("==========================");
system.out.println("\t\t连连看小游戏");
system.out.println("\t\t版权:lr");
system.out.println("==========================");
system.out.println("请先输入图片数量(难度系数 1~9):");
int picnum=sc.nextint();
system.out.println("请输入棋盘的行数:");
int rows=sc.nextint();
int cols=0; //列数
int count=0; //计数器
do{
if (count>0){
system.out.println("输入有误,列数必须大于0!");
}
system.out.println("请输入棋盘列数:");
cols=sc.nextint();
count++;
}while( cols<1 || cols%2!=0);
//创建二维数组,生成棋盘,列数+2的原因:做出边框的效果 数组刚刚生成时,每个元素都是0
int[][] chessboard=new int[ rows+2 ][ cols+2];
//随机生成的图片数值存入这个二维数组中,注意:边框不存值,任为0
initboard( chessboard ,picnum);
system.out.println("初始化后的棋盘为:");
showboard2( chessboard);
//打乱棋盘
shuffle( chessboard );
//输出
system.out.println("打乱后的棋盘为:");
showboard2( chessboard);
//实现消除业务
// 1.定义两个point对象
point p1=new point();
point p2=new point();
// 2.游戏状态 isgameover
boolean isgameover=false;
do{
// 3.循环输入两个点 do...while
system.out.println("请输入两个点的坐标");
p1.x=sc.nextint();
p1.y=sc.nextint();
p2.x=sc.nextint();
p2.y=sc.nextint();
// 4.判断这两个数是否可以消除
if( iserazeok( chessboard,p1,p2)){
//如果可以消除,将这两个点在chessboard 中的值都设为0
chessboard[p1.x][p1.y]=0;
chessboard[p2.x][p2.y]=0;
if( checkgameover( chessboard )){
isgameover=true;
}
}
//显示消除后的棋盘
showboard2( chessboard );
}while( !isgameover );
system.out.println("游戏结束!");
}
//判断是否能消除的业务
public static boolean iserazeok(int[][] chessboard ,point p1,point p2){
// 1.两个点不是同一个
if( p1.equals( p2) ){
system.out.println("输入的两个点位置不能相同!");
}
// 2。两个点的值是否相等
if(chessboard[p1.x][p1.y] !=chessboard[p2.x][p2.y]){
system.out.println("输入的两个点值不相同!请重新输入");
return false;
}
// 3.判断两个点的连线情况
if( dooneline(chessboard,p1,p2) || dotwoline(chessboard,p1,p2) || dothreeline(chessboard,p1,p2)){
return true;
}
return false;
}
// 1连线
public static boolean dooneline(int[][] chessboard,point p1,point p2){
//定义最大值和最小值
int max=0;
int min=0;
//判断是循环行还是循环列
if( p1.x==p2.x){
//找y的最大值、找y的最小值、循环从 min+1 至 max-1、判断是否为0、如果中间有一个不为0,则返回 false
max=p1.y>p2.y?p1.y:p2.y;
min=p1.y<p2.y?p1.y:p2.y;
for(int i=min+1;i<max;i++){
if(chessboard[p1.x][i]!=0){
return false;
}
}
return true;
}else if( p1.y==p2.y){
//找x的最大值、找x的最小值、循环从 min+1 至 max-1、判断是否为0、如果中间有一个不为0,则返回 false
max=p1.x>p2.x?p1.x:p2.x;
min=p1.x<p2.x?p1.x:p2.x;
for(int i=min+1;i<max;i++){
if(chessboard[i][p1.y]!=0){
return false;
}
}
return true;
}
return false;
}
// 2连线
public static boolean dotwoline(int[][] chessboard,point p1,point p2){
//定义两个临时点
point t1=new point();
t1.x=p1.x;
t1.y=p2.y;
point t2=new point();
t2.x=p2.x;
t2.y=p1.y;
if( chessboard[t1.x][t1.y]==0 && dooneline(chessboard, p1,t1 ) && dooneline(chessboard, t1,p2) ){
return true;
}
if( chessboard[t2.x][t2.y]==0 && dooneline(chessboard, p1,t2 ) && dooneline(chessboard, t2,p2) ){
return true;
}
return false;
}
// 3连线
public static boolean dothreeline(int[][] chessboard,point p1,point p2){
//先循环行 :x
for( int i=0;i<chessboard.length;i++){
point t=new point();
t.x=i;
t.y=p1.y;
if( chessboard[t.x][t.y]==0 && dooneline(chessboard,t, p1) && dotwoline(chessboard, t,p2) ){
return true;
}
}
//再循环列 :y
for( int i=0;i<chessboard.length;i++){
point t=new point();
t.x=p1.x;
t.y=i;
if( chessboard[t.x][t.y]==0 && dooneline(chessboard,t, p1) && dotwoline(chessboard, t,p2) ){
return true;
}
}
return false;
}
//判断游戏是否结束:循环这个数组,判断所有的位置都为0
public static boolean checkgameover(int[][] chessboard){
for(int i=1;i<chessboard.length-1;i++){
for(int j=1;i<chessboard[i].length-1;j++){
if( chessboard[i][j]!=0 ){
return false;
}
}
}
return true;
}
public static void initboard(int[][] chessboard,int picnum){
random r=new random();
for( int i=1;i<chessboard.length-1;i++){
for(int j=1;j<chessboard[i].length-1;j=j+2){
int pic=r.nextint( picnum )+1;
chessboard[i][j]=pic;
chessboard[i][j+1]=pic;
}
}
}
//打乱棋盘,只能对中间的值打乱,而不能打扰边框
//交换数组的两个值 ,随机生成的四个下标,每个下标表示一个数 x1,y1 x2,y2 =》 chessboard【x2】【y1】 将上面两个数交换
//概率:棋盘越大,交换越多
public static void shuffle(int[][] chessboard ){
random r=new random();
int x1=0;
int y1=0;
int x2=0;
int y2=0;
int temp=0;
for(int i=0;i<chessboard.length*chessboard[0].length*10;i++){
//生成的四个下标,不能为0,也不能为 length-1
x1=r.nextint( chessboard.length-2 )+1;
y1=r.nextint( chessboard[0].length-2 )+1;
x2=r.nextint( chessboard.length-2 )+1;
y2=r.nextint( chessboard[0].length-2 )+1;
//完成交换
temp=chessboard[x1][y1];
chessboard[x1][y1]=chessboard[x2][y2];
chessboard[x2][y2]=temp;
}
}
//简单的输出
public static void showboard(int[][] chessboard){
for(int i=0;i<chessboard.length;i++){
for(int j=0;j<chessboard[i].length;j++){
system.out.print(chessboard[i][j]+"\t");
}
system.out.println();
}
}
//私有方法:专门用来输出棋盘最上面和最下面要出现的列号
private static void showcolsnum( int[][] chessboard ){
for(int i=0;i<chessboard[0].length;i++){
if( i==0 || i==chessboard[i].length-1){
system.out.print("\t");
}else{
system.out.print("*"+i+"\t");
}
}
system.out.println();
}
//带行列提示的输出
public static void showboard2( int[][] chessboard){
showcolsnum( chessboard );//输出error:列号
//中间完成棋盘
for(int i=0;i<chessboard.length;i++ ){
//加入前面行号的输出
if( i==0 || i==chessboard[i].length-1){
system.out.print(" ");
}else{
system.out.print(""+i);
}
for(int j=0;j<chessboard[i].length;j++){
//边框要用 * 来修饰
if( i==0 || j==0 || i==chessboard.length-1 || j==chessboard[i].length-1){
if( j==chessboard[i].length-1){
system.out.print(" # ");
}else{
system.out.print(" #\t");
}
}else{//不是边框,就输出数组中对应的数字
if( chessboard[i][j]==0){
system.out.print(" \t");
}else{
system.out.print(" "+chessboard[i][j]+"\t");
}
}
}
//加入后面的行号
if( i==0 || i==chessboard.length-1){
system.out.print(" ");
}else{
system.out.print(""+i);
}
system.out.println();
}
showcolsnum( chessboard );//输出列号
}
} point类没有写出来了,比较简单,里面就存了两个数据,表示数字的行和列,就不上图了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家。
原文链接:https://blog.csdn.net/emilyRR/article/details/40596647
|