package object2;
import java.util.Random;
import java.util.Scanner;
public class object2{
/*
* 还需要叠加的计算 完成
* 还需要随即在零位出现2(每走一步)完成
* 到2048时结束游戏 完成
* 优化:加入步数计算器
* 存在bug:无论是否有发生叠加都可以产生随即2 完成
*除零 存在bug 已经修复
*
* */
public static void main(String[] args) {
int count = 0;
int[][] a = {
{0,2,2,2},
{0,0,0,2},
{0,0,0,2},
{0,0,2,4}
};
Scanner sc = new Scanner(System.in);
loop:while (true){
show(a);
String select = sc.next();
int[][] lasta = generateArray(a);
switch (select){
case "w"->{
a=deleteZero_Up(a);
//show(a);
}
case "s"->{
a=deleteZero_Down(a);
//show(a);
}
case "a"->{
a=deleteZero_left(a);
a=addMove_left(a);
a=deleteZero_left(a);
//show(a);
}
case "d"->{
a=deleteZero_right(a);
a=addMove_right(a);
a=deleteZero_right(a);
//show(a);
}
case "q"->{break loop;}
default -> {System.out.println("请重新输入!");}
}
if(!compareTwoArray(lasta,a)){
a = randomInt(a);
count++;
}
if (win(a)){
System.out.println("你胜利了!");
System.out.println("你一共走了"+count+"步!");
break;
}
if(lose(a)){
System.out.println("你输了!");
System.out.println("你一共走了"+count+"步!");
break;
}
}
}
//比对两个二维数组是否一致
public static int[][] generateArray(int[][]a){
int[][] b = new int[4][4];
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
b[i][j]=a[i][j];
}
}
return b;
}
public static boolean compareTwoArray(int[][]a,int[][]b){
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
if(a[i][j]!=b[i][j]){
return false;
}
}
}
return true;
}
//随即加入一个2
public static int[][] randomInt(int[][] args){
int[][] ra = new int[4][4];
Random r = new Random();
while (true){
int indexi = r.nextInt(args.length);
int indexj = r.nextInt(args[indexi].length);
if(args[indexi][indexj]==0){
for (int i = 0; i < args.length; i++) {
for (int j = 0; j < args[i].length; j++) {
if(i==indexi&&j==indexj){
ra[i][j]=2;
}else {
ra[i][j]=args[i][j];
}
}
}
break;
}
}
return ra;
}
//判断胜利跟失败
public static boolean win(int[][] a){
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
if(a[i][j]==2048){
return true;
}
}
}
return false;
}
public static boolean lose(int[][] a){
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
if(a[i][j]==0){
return false;
}
}
}
return true;
}
//1.显示二维数组
public static void show(int[][] a){
for (int i = 0; i < a.length; i++) {
//System.out.print("[");
for (int j = 0; j < a[i].length; j++) {
System.out.print(a[i][j]+" ");
// if(j==a[i].length-1){
// System.out.print(a[i][j]+"]");
// }else System.out.print(a[i][j]+"\t\t");
}
System.out.println();
}
}
//2.除零后左移的方法
public static int[][] deleteZero_left(int[][] a){
int[][] b = new int[4][4];
for (int i = 0; i < a.length; i++) {
int index = 0;
for (int j = 0; j < a[i].length; j++) {
if(a[i][j]!=0){
b[i][index] = a[i][j];
index++;
}
}
}
return b;
}
//3.除零后右移的方法
public static int[][] deleteZero_right(int[][] a){
int[][] b = new int[4][4];
for (int i = 0; i < a.length; i++) {
int index = a.length-1;
for (int j = a[i].length-1; j >= 0; j--) {
if(a[i][j]!=0){
b[i][index] = a[i][j];
index--;
}
}
}
return b;
}
//4.除零后上移的方法+叠加
public static int[][] deleteZero_Up(int[][] a){
int[][] args = new int[4][4];
for (int i = 0; i < args.length; i++) {
for (int j = 0; j < args[i].length; j++) {
args[i][j] = a[j][i];
}
}
args = deleteZero_left(args);//bug1
args = addMove_left(args);
args = deleteZero_left(args);
int[][] args2 = new int[4][4];
for (int i = 0; i < args2.length; i++) {
for (int j = 0; j < args2[i].length; j++) {
args2[i][j] = args[j][i];
}
}
return args2;
}
//5.除零后下移方法+叠加
public static int[][] deleteZero_Down(int[][] a){
int[][] args = new int[4][4];
for (int i = 0; i < args.length; i++) {
for (int j = 0; j < args[i].length; j++) {
args[i][j] = a[j][i];
}
}
args = deleteZero_right(args);//bug1
args = addMove_right(args);
args = deleteZero_right(args);
int[][] args2 = new int[4][4];
for (int i = 0; i < args2.length; i++) {
for (int j = 0; j < args2[i].length; j++) {
args2[i][j] = args[j][i];
}
}
return args2;
}
//6.正向叠加
public static int[][] addMove_left(int[][] args){
int[][] args2 = new int[4][4];
for (int i = 0; i < args.length; i++) {
args2[i] = veryifyArray_left(args[i]);
}
return args2;
}
public static int[][] addMove_right(int[][] args){
int[][] args2 = new int[4][4];
for (int i = 0; i < args.length; i++) {
args2[i] = veryifyArray_right(args[i]);
}
return args2;
}
public static int[] veryifyArray_left(int[] args){
int[] args2 = new int[args.length];
for (int i = 0; i < args.length-1; i++) {
if(args[i]==args[i+1]&&args[i]!=0&&args[i+1]!=0){
args2[i] = args[i] + args[i+1];
args = toZeroArray(args,i+1);
}else {
args2[i] = args[i];
args2[i+1] = args[i+1];
}
}
return args2;
}
public static int[] veryifyArray_right(int[] args){
int[] args2 = new int[args.length];
for (int i = args.length-1; i > 0; i--) {
if(args[i]==args[i-1]){
args2[i] = args[i] + args[i-1];
args = toZeroArray(args,i-1);
}else {
args2[i] = args[i];
args2[i-1] = args[i-1];
}
}
return args2;
}
public static int[] toZeroArray(int[] args,int index){
int[] args2 = new int[args.length];
for (int i = 0; i < args.length; i++) {
if(i==index){
args2[i] = 0;
}else{
args2[i] = args[i];
}
}
return args2;
}
}
java 2048
最新推荐文章于 2023-07-18 18:46:10 发布