用Java实现的2048(没UI)

来源:互联网 发布:自建淘宝客网站模板 编辑:程序博客网 时间:2024/06/05 11:55

设计思路:
用0,1,2,3表示事件向左,右,上,下;然后是判断游戏结束标志:

  1. 游戏出现2048时,赢得游戏而退出;
  2. 游戏画板满了,并且左右上下移动都不能再合并任何元素时,那么游戏已经进入了死胡同不可能再有解,所以判断输了而结束游戏;

游戏实现:
用二维数组来储存游戏画板;
1.每次捕捉事件前,先将每个元素向指定的方向移动,
将他们之间空白的元素去掉,
2.然后按照他们时间的方向的的反方向去没两个相邻的元素比较,如果相同就相加复制给前一个元素,后一个元素置零(表示空白);
3.重复1;

下面是代码,有注释,大家可以看看,欢迎拍砖;
代码工程已发布在https://github.com/BrightenYim/2048inJava
欢迎大家拍砖:

package brighten.demo;/* * @author  BrightenYim 2015.4.12 * @mailto  brightenyim@qq.com */import java.util.Random;import java.util.Scanner;public class Game2048 {    public final static int  n=4;    int[][]  array = new int[n][n];    void  initial(){//初始化这个数组  开始时初始化    for(int p = 0;p < 4;p++)//默认 0?是否需要初始化        for(int q =0;q < 4;q++){            array[p][q]  = 0;        }    Random random = new Random();    int  j  =random.nextInt(4);    int k  = random.nextInt(4);    array[j][k] = 2;    }    void again(){//合并事件后 随机生成2        Random random = new Random();       while(true){        int   j  = random.nextInt(4);        int k  = random.nextInt(4);        if(array[j][k] == 0){            array[j][k] = 2;break;        }        else {            continue;        }       }    }    void display(){//显示数组        for(int i = 0;i < 4;i++)            for(int j = 0;j < 4 ;j++){                if(j==3){                    System.out.println(array[i][j]);                    }                else {                    System.out.printf("%d ",array[i][j]);                }                }            }    /*void swap(int  i, int  j){//交换           //caution 形参            int  temp;            temp  = i;                    i   = j;                    j  = temp;    }*/    //remov 下面的函数时消去数值间的0数值    void up_remove_blank(){  //上面的那个为空   交换 靠上集合        int i,j,k;          for(j=0;j<4;j++){              for(i=1;i<4;i++){                  k=i;                  while(k-1>=0&&array[k-1][j]==0){                   //  swap(array[k][j],array[k-1][j]);                      int temp;                    temp = array[k][j];array[k][j] =array[k-1][j];array[k-1][j] =temp;                    k--;                  }              }          }      }      void down_remove_blank(){  //下面的那个为空   交换 靠下集合        int i,j,k;          for(j=0;j<4;j++){              for(i=2;i>=0;i--){                  k=i;                  while(k+1<=3&&array[k+1][j]==0){                     //swap(array[k][j],array[k+1][j]);                      int temp;                    temp=array[k][j];                    array[k][j] = array[k+1][j];                    array[k+1][j] = temp;                    k++;                      }              }          }      }      void left_remove_blank(){  //左面的那个为空   交换 靠左集合        int i,j,k;          for(i=0;i<4;i++){              for(j=1;j<4;j++){                  k=j;                  while(k-1>=0&&array[i][k-1]==0){                    //swap(array[i][k],array[i][k-1]);                      int temp = array[i][k];                    array[i][k] =array[i][k-1];                    array[i][k-1] = temp;                    k--;                  }                 }          }     }       void right_remove_blank(){  //右面的那个为空   交换 靠右集合        int i,j,k;          for(i=0;i<4;i++){              for(j=2;j>=0;j--){                  k=j;                  while(k+1<=3&&array[i][k+1]==0){                    //  swap(array[i][k],array[i][k+1]);                      int temp =array[i][k];                    array[i][k] =array[i][k+1];                    array[i][k+1] =temp;                    k++;                      }                 }          }         }      //事件       void toLeft(){         left_remove_blank();        int i,j;          for(i=0;i<4;i++){  //每一行            for(j=0;j<3;j++){                  if(array[i][j]==array[i][j+1]){                      array[i][j]+=array[i][j+1];                      array[i][j+1]=0;                     left_remove_blank();                }              }          }        // left_remove_blank();      }        void toRight(){            right_remove_blank();            int i,j;              for(i=0;i<4;i++){                  for(j=3;j>=1;j--){                      if(array[i][j]==array[i][j-1]){                          array[i][j]+=array[i][j-1];                          array[i][j-1]=0;                         right_remove_blank();                     }                  }              }          //   right_remove_blank();         }       void  toUp(){          up_remove_blank();          int i,j;              for(j=0;j<4;j++){//每一列                for(i=0;i<3;i++){                      if(array[i][j]==array[i+1][j]){                          array[i][j]=array[i][j]+array[i+1][j];                          array[i+1][j]=0;                          up_remove_blank();                       }                  }               }        }      void toDown(){          down_remove_blank();          int i,j;          for(j=0;j<4;j++){                for(i=3;i>=1;i--){                      if(array[i][j]==array[i-1][j]){                          array[i][j]=array[i][j]+array[i-1][j];                          array[i-1][j]=0;                          down_remove_blank();                    }                }          }      }//下面是游戏结束判断 //Dead如过数组满了 并且 左右都不能合并 那么游戏结束  //win 如过出先2048 那么赢了游戏   boolean isFull(){//数组满了       boolean T =true;       for(int i =0;i<4;i++)           for(int j=0;j<4;j++){               if(array[i][j] == 0){                   T =false;break;               }           }       return T;   }   boolean nearEquals(){//相邻没有相等的        int i , j;        boolean T=false;        for(i =0;i<=2;i++)//上下比             for(j=0;j<4;j++){                if(array[i][j] == array[i+1][j]){                T=true;break;                }            }        for(i =0;i<4;i++)//左右比              for(j=0;j<=2;j++){                if(array[i][j] == array[i][j+1]){                T =true;break;                }            }         return T;     } boolean dead(){//如果数组满了&& 相邻没有相等的 那么这个数组已经无法操作      boolean T =false;     if(isFull()==true&&nearEquals()==false){         T =true;     }     return T; } boolean getWin(){//Judge 是否 赢了        boolean T =false;        for(int j =0;j<4;j++)        for(int k=0;k<4;k++){            if(array[j][k] == 2048){                T = true;            return T;            }        }        return  T;      }    public static void main(String arg[]){        Game2048 game = new Game2048();        Scanner  input = new Scanner(System.in);        game.initial();        game.display();        System.out.println("输入数字来表示你想进行的操作:\n"                + "0表示向左滑动\n"                + "1表示向右滑动\n"                + "2表示向上滑动\n"                + "3表示向下滑动");        while(true){            if(game.getWin() == true){//注意和dead的判断顺序                System.out.println("2048!You Win!");                input.close();                break;                }            if(game.dead() ==true){                System.out.println("Game Over!");                input.close();                break;            }        int  i  =input.nextInt();        if(i == 0){        //game.left_remove_blank();        game.toLeft();        if(game.isFull() ==false){//fun时不能再加入2  否者会死循环        game.again();}        game.display();        }        else if(i == 1){            game.toRight();            if(game.isFull() ==false){            game.again();}            game.display();            }        else if(i == 2){            game.toUp();            if(game.isFull() ==false){            game.again();}            game.display();            }        else if(i ==3){                game.toDown();                if(game.isFull() ==false){                game.again();}                game.display();                }        else{            System.out.println("请输入0-3的数字来表示方向,重新输入吧-_-");            continue ;            }        }    }}
0 0
原创粉丝点击