建议在Eclipse中运行,控制台输出可能会出现排版问题。
Eclipse控制台字号建议为小四。
程序运行截图:
程序源代码:
import java.util.Random;
import java.util.Scanner;
/**
* Eliminate - 十二生肖版本 版本号 1.3.1
* @author CSDN-Spixii
* 2016-8-19
*/
public class Eliminate {
public static void main(String[] args){
Random ra = new Random();
Scanner sc = new Scanner(System.in);
/* 运算变量定义 */
int arrSize;//后设-矩阵尺寸
int chNum;//后设-字符类型数量
int point = 0;//回合计分
int totalPoints = 0;//总分
int life = 0;//设置 - 生命值
int time = 0;//回合数
int tempInt = 0;//测试 - 行列号
int testTime = -1;//测试 - 运算次数
boolean pass;//判断消除完成
int bomb;//炸弹累计
boolean start = true;//判断游戏是否开始
boolean delay = true;//开关 - 延时特效
boolean test = false;//开关 - 测试模式
if(test){delay = false;}//测试模式禁用延时效果
if(test){life = 100000;}//测试模式解除生命限制
/* 交互变量定义 */
int num1 = 0;//行列数1
int num2 = 0;//行列数2
int h1 = 0;//行数1
int l1 = 0;//列数1
int h2 = 0;//行数2
int l2 = 0;//列数2
String tempExchange = "";//元素临时交换用
System.out.println("=====================");
System.out.println(" - Eliminate - ");
System.out.println("=====================\n");
if(test){System.out.println(" - Test Mode - \n");}
/* 游戏属性设置 */
while(true){
System.out.print("> 请设置矩阵尺寸[3~10]:");
arrSize = Integer.parseInt(sc.next());//设置-矩阵大小[3~10]
if(arrSize<3 || arrSize>10){
System.out.println("*设定范围外的输入!");
continue;
}
System.out.print("> 请设置游戏难度[3~12]:");
chNum = Integer.parseInt(sc.next());//设置-游戏难度/字符类型数 [3~12]
System.out.println();
if(chNum<3 || chNum>12){
System.out.println("*设定范围外的输入!");
continue;
}
break;
}
/* 创建游戏矩阵 */
String [][]arr = new String [arrSize][];
for(int i=0; i
j-3; k--){//元素下落 - x轴遍历
for(int l=i; l>0; l--){//元素下落 - y轴操作
arr[l][k] = arr[l-1][k];//元素下落
}
}
/* 顶部补充元素 */
arr[0][j] = getCharacter(ra.nextInt(chNum),true);
arr[0][j-1] = getCharacter(ra.nextInt(chNum),true);
arr[0][j-2] = getCharacter(ra.nextInt(chNum),true);
if(test){System.out.println("
X轴出现消除,行号:"+i);}
point ++;
pass = false;
/* 横向触发爆炸检测-触发点数:6 */
int tempI = 0;
if(!start && i>0){//扫描坠落天花板/主动碰撞触发
tempI = i;
for (int k=j-2; k
2; l--){//元素下落 - x轴操作
arr[l][j] = arr[l-3][j];//元素下落
}
/* 顶部补充元素 */
arr[0][j] = getCharacter(ra.nextInt(chNum),true);
arr[1][j] = getCharacter(ra.nextInt(chNum),true);
arr[2][j] = getCharacter(ra.nextInt(chNum),true);
if(test){System.out.println("
Y轴出现消除,列号:"+j);}
point ++;
pass = false;
/* 纵向触发爆炸检测-触发点数:2 */
int tempI = 0;
if(!start && i-2>0){//炸点不在地板时/主动碰撞触发
tempI = i;
if(!start && detonate(arr,tempI,j,arrSize)){//碰撞位 上一点 炸弹检测
point ++;
bomb ++;
printArray(arr,arrSize,delay);
//元素下落
elementsFall(arr, chNum);
//break;
}
}
if(!start && i<9){//炸点不在天花板时/被动碰撞触发
tempI = i+1;
if(!start && detonate(arr,tempI,j,arrSize)){//碰撞位 下一点 炸弹检测
point ++;
bomb ++;
printArray(arr,arrSize,delay);
//元素下落
elementsFall(arr, chNum);
//break;
}
}
}else{
temp2 = temp1;
temp1 = arr[i][j];
}
}else{
temp1 = arr[i][j];
temp2 = "";
}
}
}
}while(!pass);
if(test){System.out.println("\ntestTime:"+testTime+" tempInt:"+tempInt+" bomb:"+bomb+"\n");}
/* 分数计算与结束判断 */
if(start){//判断是否刚刚开始
totalPoints = 0;
point = 0;
start = false;
}else{
if(point == 0){
life --;
//tempExchange = arr[h1][l1];//高生命值-交换返回
//arr[h1][l1] = arr[h2][l2];
//arr[h2][l2] = tempExchange;
if(life == -1){
System.out.println("=====[GAME OVER]=====");
System.out.println("总分:"+totalPoints+" 回合:"+time); //运算次数测试
System.out.println("=====================");
sc.close();
return;
}
}
totalPoints += point;
if(delay){for(int t=0; t<10000000; t++){}}//延时特效
System.out.println("=====================");
if(delay){for(int t=0; t<500000000; t++){}}//延时特效
System.out.println(" 得分:"+point+" 总分:"+totalPoints+" 回合:"+time); //运算次数测试
if(delay){for(int t=0; t<500000000; t++){}}//延时特效
System.out.println("=====================");
if(delay){for(int t=0; t<500000000; t++){}}//延时特效
}
/* 交互 - 显示矩阵 */
printArray(arr,arrSize,delay);
/* 交互 - 用户输入 */
while(true){
num1 = importOperand(1,arrSize);
num2 = importOperand(2,arrSize);
if(num1==num2){
System.out.println("*请勿输入相同的行列数!");
continue;
}
//响应操作
h1 = num1/10;
l1 = num1%10;
h2 = num2/10;
l2 = num2%10;
if(test||((h1 == h2)&&(l1-l2 == -1||l1-l2 == 0||l1-l2 == 1))||((l1 == l2)&&(h1-h2 == -1||h1-h2 == 0||h1-h2 == 1))){
tempExchange = arr[h1][l1];//交换
arr[h1][l1] = arr[h2][l2];
arr[h2][l2] = tempExchange;
time ++;
System.out.println();
break;
}else{
System.out.println("*请输入相邻的元素行列数!");
continue;
}
}
}/* -restart-*/
}
/**
* 用户输入
* @param id //形参
* @return int
*/
@SuppressWarnings("resource")//解除Scanner无关闭警告
static int importOperand(int id, int arrSize){
int num;//输入数字
while(true){
Scanner sc = new Scanner(System.in);
System.out.print("> 请输入元素"+id+"的行列号:");
num = Integer.parseInt(sc.next());
if(num/100>0){
System.out.println("*错误的输入!请输入两个字节");
continue;
}
int h = num/10;
int l = num%10;
if(h>=arrSize || l>=arrSize){
System.out.println("*错误的输入!请输入矩阵范围内的行列数");
continue;
}
return num;
}
}
/**
* 打印矩阵
* @param arr
* @param arrSize
* @param delay
*/
static void printArray(String[][] arr, int arrSize, boolean delay){
System.out.print(" 0 1 2");//行号
for(int i=0; i
0){
arr[x-1][y] = strX;
if(y>0){arr[x-1][y-1] = strX;}
if(y
0){arr[x+1][y-1] = strX;}
if(y
0){arr[x][y-1] = strX;} if(y
0; i--){ arr[i][x] = arr[i-1][x]; } arr[0][x] = charX;// } } } for(int i=0; i
使用到的Java基础知识点:
- Random
- Scanner
- String处理
- 静态方法使用
- 二维数组操作
- 多重循环嵌套与处理
实现的功能:
- 随机生成二维矩阵
- 控制台输入设置矩阵大小(游戏尺寸)与元素种类(游戏难度)
- 横向与纵向检测消除项目(三连消除)
- 消除后的元素下落
- 四种类型炸弹 (纵:纵向爆破、横:横向爆破、鬼:3*3矩阵爆破、神:十字爆破)
- 延时“特效”
- 测试模式
*如运行过程中出现异常抛出,请将异常发至文章评论_(:з」∠)_