2048小游戏源代码

Java课程设计写错了益智游戏让写人机取火柴小游戏结果我不知道然后写了2048这个益智游戏不过好歹老师松口说也可以用。

代码一:窗口主界面代码这个很好理解就是最初写的时候不知道有这么个形式,以为是要用框架来写出窗口,不过还好java右JFrame这个接口可以显示窗体就很方便。

public class Game2048 {
    public static JFrame gameFrame;//窗口

    public static void main(String[] args) {
        //显示窗体
        gameFrame = new JFrame();

        //大小名字
        gameFrame.setSize(370,400);
        gameFrame.setTitle("2048小游戏");
        gameFrame.setLocationRelativeTo(null);//居中

        //面板内容
        gameFrame.add(new GamePanel());

//显示
        gameFrame.setVisible(true);
    }
}

代码二:这是这个代码核心功能,因为玩2048这个游戏只有四个简单操作,而写的时候我发现四个操作也要思考很多,比如向上移动,第一排不能移动,还要考虑卡片上的数字是不是0,非0则移动,0则返回。其次考虑合并相同数字,采用方法递归,而在递归方法里面又设计到如何为0,如何领卡片数字翻倍且上移。在写的时候上移动最好写,再写下左右时还经常写出数组越界,因为没有考虑好移动的范围与判断式。

//向上
 public  void moveUpCard(){
        for (int i=1;i<4;i++){
            for (int j=0;j<4;j++){
                Card card=allcards[i][j];
                if(card.num!=0){
                    card.moveUp(allcards);
                }
            }
        }
    }
// 
 public void moveUp(Card[][] allcards){
          if(this.i==0){
              return;
          }
          Card preCard=allcards[i-1][j];//上一个卡片
          //赋值之后卡片变成0
          if(preCard.num==0){
              preCard.num=this.num;
              this.num=0;
              preCard.moveUp(allcards);
          }else if(preCard.num==this.num && !preCard.hebing){//合并数字
              preCard.hebing = true;
              preCard.num *= 2;
              this.num = 0;
          }

代码三:这是代码的监听与操作方式WASD与↑↓←→,加一个打印则可以看出自己刚才的执行步骤。重点是每执行一次操作要刷新卡片还是采用方法的调用。

  Game2048.gameFrame.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {

            }

            @Override
            public void keyPressed(KeyEvent e) {
                for (int i = 0; i <4; i++) {
                    for (int j = 0; j < 4; j++) {
                        Card card =allcards[i][j];
                        card.hebing = false;
                    }
                }

                int code =e.getKeyCode();
            switch (code){
                case KeyEvent.VK_UP:
                case KeyEvent.VK_W:
                    moveUpCard();
                    System.out.println("上");
                    break;
                case KeyEvent.VK_DOWN:
                case KeyEvent.VK_S:
                    System.out.println("下");
                    moveDownCard();
                    break;
                case KeyEvent.VK_LEFT:
                case KeyEvent.VK_A:
                    System.out.println("左");
                    moveLeftCard();
                    break;
                case KeyEvent.VK_RIGHT:
                case KeyEvent.VK_D:
                    System.out.println("右");
                    moveRightCrad();
                    break;
            }
            //创建卡片
                createNewCard();
            //刷新
                repaint();
                //游戏结束
                isgameOver();
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }
        });
    }

最后整个代码块分为三个一个是Card类,一个是GamePenel类,一个是Game2048主类

Game2048主类

    public class Game2048 {
    public static JFrame gameFrame;//窗口

    public static void main(String[] args) {
        //显示窗体
        gameFrame = new JFrame();

        //大小名字
        gameFrame.setSize(370,400);
        gameFrame.setTitle("2048小游戏");
        gameFrame.setLocationRelativeTo(null);//居中

        //面板内容
        gameFrame.add(new GamePanel());

//显示
        gameFrame.setVisible(true);
    }
}

GamePenel类

//面板设计(开始)
public class GamePanel extends JPanel {
    Random rand=new Random();
    //卡片4*4
       Card[][] allcards=new Card[4][4];

    //初始化界面
    public  GamePanel() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                Card card = new Card(i, j);
                allcards[i][j] = card;
            }
        }
        createNewCard();
       //游戏操作(监听操作)
        Game2048.gameFrame.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {

            }

            @Override
            public void keyPressed(KeyEvent e) {
                for (int i = 0; i <4; i++) {
                    for (int j = 0; j < 4; j++) {
                        Card card =allcards[i][j];
                        card.hebing = false;
                    }
                }

                int code =e.getKeyCode();
            switch (code){
                case KeyEvent.VK_UP:
                case KeyEvent.VK_W:
                    moveUpCard();
                    System.out.println("上");
                    break;
                case KeyEvent.VK_DOWN:
                case KeyEvent.VK_S:
                    System.out.println("下");
                    moveDownCard();
                    break;
                case KeyEvent.VK_LEFT:
                case KeyEvent.VK_A:
                    System.out.println("左");
                    moveLeftCard();
                    break;
                case KeyEvent.VK_RIGHT:
                case KeyEvent.VK_D:
                    System.out.println("右");
                    moveRightCrad();
                    break;
            }
            //创建卡片
                createNewCard();
            //刷新
                repaint();
                //游戏结束
                isgameOver();
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }
        });
    }

    //判断游戏结束
    private void isgameOver() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4 ; j++) {
                if(allcards[i][j].num == 2048){//其中有个数字是2048
                    JOptionPane.showMessageDialog(null,"赢了!","恭喜",JOptionPane.WARNING_MESSAGE);
                    return;
                }else if(isFull()){//位置满了
                    JOptionPane.showMessageDialog(null,"游戏结束!","很遗憾",JOptionPane.WARNING_MESSAGE);
                    return;
                }
            }
        }
    }
    //判断格子满不满
    private boolean isFull() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if(allcards[i][j].num == 0){
                    return false;
                }
            }
        }
        return true;
    }

    //向上
    public  void moveUpCard(){
        for (int i=1;i<4;i++){
            for (int j=0;j<4;j++){
                Card card=allcards[i][j];
                if(card.num!=0){
                    card.moveUp(allcards);
                }
            }
        }
    }
    //向下
    public  void moveDownCard(){
        for (int i=2;i>=0;i--){
            for (int j=0;j<4;j++){
                Card card=allcards[i][j];
            if(card.num!=0){
                card.moveDown(allcards);
            }
        }
    }
}
    //向左
    public  void moveLeftCard(){
    for (int i=0;i<4;i++){
        for (int j=1;j<4;j++){
            Card card=allcards[i][j];
            if(card.num!=0){
                card.moveLeft(allcards);
            }
        }
    }
}
    //向右
    public  void moveRightCrad(){
    for (int i=0;i<4;i++){
        for (int j=2;j>=0;j--){
            Card card=allcards[i][j];
            if(card.num!=0){
                card.moveRight(allcards);
            }
        }
    }
}

    //随机生成数字
    public void createNewCard(){

        //数字生成
        int num;
        int id=rand.nextInt(5);
        if(id==4||id==3){
            num=4;
        }
        else {num=2;}
       Card card= randCrad();
        card.num=num;
    }

    //卡片生在空位置
    public Card randCrad(){
        int j=rand.nextInt(4);
        int i=rand.nextInt(4);
        Card card =allcards[i][j];
     if(card.num==0){
         return card;
     }
     else{//!=0
         return  randCrad();
     }
    }

    //绘图
 public void paint(Graphics graphics) {
     super.paint(graphics);
     //16个卡片位置
     for (int i = 0; i < 4; i++) {
         for (int j = 0; j < 4; j++) {
             Card card = allcards[i][j];
             //卡片设计
             graphics.setColor(getColor(card.num));//颜色
             graphics.fillRect(card.x, card.y, 80, 80);//尺寸
                if(card.num!=0){
             //设置卡片上的数字颜色大小
             graphics.setColor(new Color(125,78,51));
             graphics.setFont(new Font("宋体",Font.BOLD,35));
             //数字坐标
             //字符长度决定数字位置在中央
             int x=card.x;
             if(card.num<10){
                 x=x+32;
             } else if(card.num<100){
                 x=x+20;
             } else if(card.num<1000){
                 x=x+8;
             } else{
                 x=x+2;
             }

             int y=card.y+50;
             graphics.drawString(card.num+"",x,y);}

         }
     }
 }
     //num决定颜色
     public Color getColor(int num) {
         Color color ;
         switch (num) {
             case 0:
                 color = new Color(92, 151, 117);
                 break;
             case 2:
                 color = new Color(242, 230, 56);
                 break;
             case 4:
                 color = new Color(55, 236, 130);
                 break;
             case 8:
                 color = new Color(174, 213, 130);
                 break;
             case 16:
                 color = new Color(142, 201, 75);
                 break;
             case 32:
                 color = new Color(111, 148, 48);
                 break;
             case 64:
                 color = new Color(76, 174, 124);
                 break;
             case 128:
                 color = new Color(60, 182, 144);
                 break;
             case 256:
                 color = new Color(45, 130, 120);
                 break;
             case 512:
                 color = new Color(9, 97, 26);
                 break;
             case 1024:
                 color = new Color(242, 177, 121);
                 break;
             case 2048:
                 color = new Color(223, 185, 0);
                 break;
             default:
                 color=null;
         }
         return color;
     }



 }

Card类


  //卡片设计
public class Card {
    int x,y;//坐标
    int num;//显示数字
    int i,j;//数组下标
      boolean hebing = false;//判断合并
      public Card(int i, int j) {
          this.i = i;
          this.j = j;

          //卡片位置
          this.x=5+80*j+5*(j+1);
          this.y=5+80*i+5*(i+1);
      }
      //上
      public void moveUp(Card[][] allcards){
          if(this.i==0){
              return;
          }
          Card preCard=allcards[i-1][j];//上一个卡片
          //赋值之后卡片变成0
          if(preCard.num==0){
              preCard.num=this.num;
              this.num=0;
              preCard.moveUp(allcards);
          }else if(preCard.num==this.num && !preCard.hebing){//合并数字
              preCard.hebing = true;
              preCard.num *= 2;
              this.num = 0;
          }

          }
      //下
      public void  moveDown(Card[][] allcards){
          if(this.i==3){
              return;
          }
          Card downCard = allcards[i+1][j];
          if(downCard.num == 0){//把数字移动
              downCard.num = this.num;
              this.num = 0;

              downCard.moveDown(allcards);
          }else if(downCard.num==this.num && !downCard.hebing){//合并数字
              downCard.hebing = true;
              downCard.num *= 2;
              this.num = 0;
          }
      }

      //左
      public void moveLeft(Card[][] allcards){
          if(this.j==0){
              return;
          }
          //左边的卡片
          Card leftCard = allcards[i][j-1];
          if(leftCard.num == 0){//把数字移动上去
              leftCard.num = this.num;
              this.num = 0;

              leftCard.moveLeft(allcards);
          }else if(leftCard.num==this.num && !leftCard.hebing){//合并数字
              leftCard.hebing = true;
              leftCard.num *= 2;
              this.num = 0;
          }
      }
      //右
      public void moveRight(Card[][] allcards) {
          if (this.j == 3) {
              return;
          }
          Card rightCard = allcards[i][j + 1];
          if (rightCard.num == 0) {//把数字移动上去
              rightCard.num = this.num;
              this.num = 0;

              rightCard.moveRight(allcards);
          } else if (rightCard.num == this.num && !rightCard.hebing) {//合并数字
              rightCard.hebing = true;
              rightCard.num *= 2;
              this.num = 0;
          }
      }}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值