首页 > 开发 > Java > 正文

java实现的2048游戏完整实例

2024-07-13 10:15:53
字体:
来源:转载
供稿:网友

本文实例讲述了java实现的2048游戏。分享给大家供大家参考,具体如下:

先来看看运行效果:

java,2048游戏

具体代码如下:

package awtDemo;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.*;@SuppressWarnings("serial")public class Game2048 extends JApplet{  @SuppressWarnings("unused") private static final int UP=0,DOWN=1,LEFT=2,RIGHT=3;  private static final int WID=150,SP=10;  @SuppressWarnings("unused") private int scores=0;  private static JLabel scoreLabel;  private boolean change,CheckMode=false,gameOverFlag=false,successFlag=false;  private int[] label={2,4,8,16,32,64,128};  private Color[] clo={      new Color(200,200,200),new Color(228,228,160),new Color(214,163,92),      new Color(234,124,72),new Color(240,84,77),new Color(255,68,53),new Color(200,200,64)  };  @SuppressWarnings("rawtypes") private Map cmap=new HashMap();  public static RectObject[][] rset=new RectObject[4][4];  public RectObject[][] list=new RectObject[4][4];  private My2048Panel myp;  @SuppressWarnings("rawtypes") private LinkedList saveList=new LinkedList();  private JButton goBackButton;  KeyListener kl=new KeyListener(){    public void keyPressed(KeyEvent e){      saveTheStep();      goBackButton.setVisible(true);      if(gameOverFlag==true){        return;      }      if(!aDirAble()){        gameOver();      }      int key=e.getKeyCode();      switch(key){      case KeyEvent.VK_UP:        change=false;        moveUp(true);        if(change==true){          getARandomRect();          //saveTheStep();        }        break;      case KeyEvent.VK_DOWN:        change=false;        moveDown(true);        if(change==true){          getARandomRect();          //saveTheStep();        }        break;      case KeyEvent.VK_LEFT:        change=false;        moveLeft(true);        if(change==true){          getARandomRect();          //saveTheStep();        }        break;      case KeyEvent.VK_RIGHT:        change=false;        moveRight(true);        if(change==true){          getARandomRect();          //saveTheStep();        }        break;      }      //saveTheStep();    }    public void keyTyped(KeyEvent e){}    public void keyReleased(KeyEvent e){}  };  class RectObject{    private int value;    public RectObject(){      value=0;    }    public RectObject(RectObject obj){      value=obj.value;    }    public boolean equals(Object inobj){      RectObject obj=(RectObject)inobj;      if(obj.value==value){        return true;      }      return false;    }  }  class Point{    int x;    int y;    public Point(int i,int j){      x=i;      y=j;    }  }  class My2048Panel extends JPanel{    private int[] xindex={SP,2*SP+WID,3*SP+2*WID,4*SP+3*WID};    private int[] yindex={SP,2*SP+WID,3*SP+2*WID,4*SP+3*WID};    @SuppressWarnings("deprecation") public void paintComponent(Graphics g){      //background      super.paintComponent(g);      for(int i=0;i<xindex.length;i++){        for(int j=0;j<yindex.length;j++){          g.setColor(Color.WHITE);          g.drawRoundRect(xindex[i], yindex[j], WID, WID, WID/5, WID/5);          g.setColor(new Color(197,183,129));          g.fillRoundRect(xindex[i], yindex[j], WID, WID, WID/5, WID/5);        }      }      //paint rectangle      for(int i=0;i<4;i++){        for(int j=0;j<4;j++){          if(rset[i][j]!=null){            g.setColor(Color.WHITE);            g.drawRoundRect(yindex[j], xindex[i], WID, WID, WID/5, WID/5);            if(rset[i][j].value<128){              g.setColor((Color)cmap.get(rset[i][j].value));            }else{              g.setColor((Color)cmap.get(128));            }            g.fillRoundRect(yindex[j], xindex[i], WID, WID, WID/5, WID/5);            g.setColor(Color.BLACK);            Font font=new Font("TimesRoman",Font.BOLD,50);            g.setFont(font);            FontMetrics fm=Toolkit.getDefaultToolkit().getFontMetrics(font);            int len=fm.stringWidth(""+rset[i][j].value);            int hg=fm.getHeight();            g.drawString(""+rset[i][j].value, yindex[j]+WID/2-len/2, xindex[i]+WID/2+hg/4);            if(rset[i][j].value==2048 && successFlag==false){              successFlag=true;              gameSuccess();            }          }        }      }    }  }  class GameOverPane extends JPanel{    public GameOverPane(int w,int h){      setSize(w,h);      //setOpaque(false);    }    @SuppressWarnings("deprecation") public void paintComponent(Graphics g){      super.paintComponent(g);      Font font=new Font("TimesRoman",Font.BOLD,80);      g.setFont(font);      FontMetrics fm=Toolkit.getDefaultToolkit().getFontMetrics(font);      int width=fm.stringWidth("Game Over");      int height=fm.getHeight();      g.setColor(new Color(255,0,0));      g.drawString("Game Over!", getWidth()/2-width/2, getHeight()/2-height/2);    }  }  class SuccessPane extends JPanel{    public SuccessPane(int w,int h){      setSize(w,h);      //setOpaque(false);    }    public void paintComponent(Graphics g){      super.paintComponent(g);      Font font=new Font("TimesRoman",Font.BOLD,80);      g.setFont(font);      @SuppressWarnings("deprecation")  FontMetrics fm=Toolkit.getDefaultToolkit().getFontMetrics(font);      int width=fm.stringWidth("Success!");      int height=fm.getHeight();      g.setColor(new Color(255,0,0));      g.drawString("Success!", getWidth()/2-width/2, getHeight()/2-height/2);    }  }  class LOGO extends JPanel{    public LOGO(int w ,int h){      setSize(w,h);    }    @SuppressWarnings("unused") public void paintComponent(Graphics g){      super.paintComponent(g);      Font font=new Font("TimesRoman",Font.BOLD,60);      g.setFont(font);      @SuppressWarnings("deprecation")  FontMetrics fm=Toolkit.getDefaultToolkit().getFontMetrics(font);      int width=fm.stringWidth("2048");      int height=fm.getHeight();      g.setColor(new Color(255,0,0));      g.drawString("2048", 20, getHeight()/2+20);    }  }  public class goBackListener implements ActionListener{    @SuppressWarnings("rawtypes") public void actionPerformed(ActionEvent e){      if(saveList.size()==0){        goBackButton.setVisible(false);        return;      }      ArrayList arr=(ArrayList)saveList.getLast();      scoreLabel.setText(""+arr.get(0));      for(int i=0;i<4;i++){        for(int j=0;j<4;j++){          int num=(int)arr.get(4*i+j+1);          if(num!=0){            rset[i][j]=new RectObject();            rset[i][j].value=num;          }else{            rset[i][j]=null;          }        }      }      saveList.removeLast();      repaint();    }  }  public class resetListener implements ActionListener{    public void actionPerformed(ActionEvent e){      refreshBest();      for(int i=0;i<4;i++){        for(int j=0;j<4;j++){          rset[i][j]=null;        }      }      scoreLabel.setText("0");      repaint();      getARandomRect();      getARandomRect();    }  }  //the applet init  public void init(){    Container cp=getContentPane();    cp.setLayout(null);    cp.setFocusable(true);    cp.addKeyListener(kl);    Font font=new Font("TimesNewman",Font.BOLD,30);    JLabel sl=new JLabel();    sl.setLayout(new GridLayout(2,1));    JLabel sllb=new JLabel("Scores");    sllb.setFont(font);    scoreLabel=new JLabel("0");    scoreLabel.setFont(font);    sl.add(sllb);    sl.add(scoreLabel);    int best=0;    try{      File file=new File("BestRecord");      if(file.exists()){        RandomAccessFile f=new RandomAccessFile(file,"rw");        best=f.readInt();        f.close();      }    }catch(FileNotFoundException e){      best=0;      e.printStackTrace();    }catch(IOException e){      best=0;      e.printStackTrace();    }    JLabel bsl=new JLabel();    bsl.setLayout(new GridLayout(2,1));    JLabel jl=new JLabel("Best");    jl.setFont(font);    JLabel jl1=new JLabel(""+best);    jl1.setFont(font);    bsl.add(jl);    bsl.add(jl1);    myp=new My2048Panel();    LOGO logo=new LOGO(0,0);    goBackButton=new JButton("UNDO");    goBackButton.setFont(font);    goBackButton.addActionListener(new goBackListener());    goBackButton.addKeyListener(kl);    JButton jb=new JButton("RESET");    jb.setFont(font);    jb.addActionListener(new resetListener());    jb.addKeyListener(kl);    sl.setBounds(500,20,200,80);    bsl.setBounds(300,20,200,80);    logo.setBounds(0, 0, 600, 100);    myp.setBounds(0,90,700,700);    goBackButton.setBounds(700,250,150,60);    jb.setBounds(700,450,150,60);    cp.add(sl);    cp.add(bsl);    cp.add(logo);    cp.add(myp);    cp.add(goBackButton);    cp.add(jb);    File f=new File("LASTRECORD");    if(f.exists()){      try{        RandomAccessFile file=new RandomAccessFile(f,"rw");        int num=file.readInt();        scoreLabel.setText(""+num);        for(int i=0;i<4;i++){          for(int j=0;j<4;j++){            num=file.readInt();            if(num!=0){              rset[i][j]=new RectObject();              rset[i][j].value=num;            }          }        }        file.close();      }catch(FileNotFoundException e){        e.printStackTrace();      }catch(IOException e){        e.printStackTrace();      }    }else{      getARandomRect();      getARandomRect();    }  }  @SuppressWarnings("unchecked") public Game2048(){    //saveTheStep();    for(int i=0;i<7;i++){      cmap.put(label[i], clo[i]);    }  }  //moveLeft  public void moveLeft(boolean flag){    clearList(list);    for(int i=0;i<4;i++){      int k=0;      for(int j=0;j<4;j++){        if(rset[i][j]!=null){          list[i][k++]=new RectObject(rset[i][j]);        }      }    }    for(int i=0;i<4 && flag;i++){      for(int j=0;j<3;j++){        if(list[i][j]!=null && list[i][j+1]!=null && list[i][j].value==list[i][j+1].value){          list[i][j].value*=2;          if(CheckMode==false){            int sum=Integer.parseInt(scoreLabel.getText());            sum+=list[i][j].value;            scoreLabel.setText(""+sum);          }          list[i][j+1]=null;          j++;        }      }    }    if(isChange()){      if(CheckMode==false){        copySet(rset,list);        repaint();        moveLeft(false);      }      change=true;    }else{      repaint();    }  }  //moveRight  public void moveRight(boolean flag){    clearList(list);    for(int i=0;i<4;i++){      int k=3;      for(int j=3;j>-1;j--){        if(rset[i][j]!=null){          list[i][k--]=new RectObject(rset[i][j]);        }      }    }    for(int i=0;i<4 && flag;i++){      for(int j=3;j>0;j--){        if(list[i][j]!=null && list[i][j-1]!=null && list[i][j].value==list[i][j-1].value){          list[i][j].value*=2;          if(CheckMode==false){            int sum=Integer.parseInt(scoreLabel.getText());            sum+=list[i][j].value;            scoreLabel.setText(""+sum);          }          list[i][j-1]=null;          j--;        }      }    }    if(isChange()){      if(CheckMode==false){        copySet(rset,list);        repaint();        moveRight(false);      }      change=true;    }else{      repaint();    }  }  //moveup  public void moveUp(boolean flag){    clearList(list);    for(int j=0;j<4;j++){      int k=0;      for(int i=0;i<4;i++){        if(rset[i][j]!=null){          list[k++][j]=new RectObject(rset[i][j]);        }      }    }    for(int j=0;j<4 && flag;j++){      for(int i=0;i<3;i++){        if(list[i][j]!=null && list[i+1][j]!=null && list[i][j].value==list[i+1][j].value){          list[i][j].value*=2;          if(CheckMode==false){            int sum=Integer.parseInt(scoreLabel.getText());            sum+=list[i][j].value;            scoreLabel.setText(""+sum);          }          list[i+1][j]=null;          i++;        }      }    }    if(isChange()){      if(CheckMode==false){        copySet(rset,list);        repaint();        moveUp(false);      }      change=true;    }else{      repaint();    }  }  //movedown  public void moveDown(boolean flag){    clearList(list);    for(int j=0;j<4;j++){      int k=3;      for(int i=3;i>-1;i--){        if(rset[i][j]!=null){          list[k--][j]=new RectObject(rset[i][j]);        }      }    }    for(int j=0;j<4 && flag;j++){      for(int i=3;i>0;i--){        if(list[i][j]!=null && list[i-1][j]!=null && list[i][j].value==list[i-1][j].value){          list[i][j].value*=2;          if(CheckMode==false){            int sum=Integer.parseInt(scoreLabel.getText());            sum+=list[i][j].value;            scoreLabel.setText(""+sum);          }          list[i-1][j]=null;          i--;        }      }    }    if(isChange()){      if(CheckMode==false){        copySet(rset,list);        repaint();        moveDown(false);      }      change=true;    }else{      repaint();    }  }  //other functions  private void copySet(RectObject[][] dst, RectObject[][] src){    for(int i=0;i<4;i++){      for(int j=0;j<4;j++){        dst[i][j]=src[i][j];      }    }  }  //detect whether rset is different from list or not  private boolean isChange(){    for(int i=0;i<4;i++){      for(int j=0;j<4;j++){        if(rset[i][j]!=null && list[i][j]!=null && !rset[i][j].equals(list[i][j])){          return true;        }        if(rset[i][j]!=null && list[i][j]==null){          return true;        }        if(rset[i][j]==null && list[i][j]!=null){          return true;        }      }    }    return false;  }  private void clearList(RectObject[][] s){    for(int i=0;i<s.length;i++){      for(int j=0;j<s[i].length;j++){        s[i][j]=null;      }    }  }  //get a random rectangle  @SuppressWarnings({ "unchecked", "rawtypes" }) public void getARandomRect(){    ArrayList list=new ArrayList();    for(int i=0;i<4;i++){      for(int j=0;j<4;j++){        if(rset[i][j]==null){          list.add(new Point(i,j));        }      }    }    if(list.size()==0 && !aDirAble()){      gameOver();      return;    }    Random rand=new Random();    int index=rand.nextInt(list.size());    Point loc=(Point)list.get(index);    index=rand.nextInt(2);    rset[loc.x][loc.y]=new RectObject();    if(index==1){      rset[loc.x][loc.y].value=4;    }else{      rset[loc.x][loc.y].value=2;    }  }  //detect whether there are other steps or not  public boolean aDirAble(){    CheckMode=true;    change=false;    moveLeft(true);    moveRight(true);    moveDown(true);    moveUp(true);    CheckMode=false;    if(change==true){      return true;    }else{      return false;    }  }  public void gameOver(){    gameOverFlag=true;    JPanel jl=new GameOverPane(myp.getWidth(),myp.getHeight());    jl.setBounds(0, 0, 700, 700);    JButton jb1=new JButton("Again");    Font font=new Font("TimesRoman",Font.BOLD,30);    jb1.setOpaque(false);    jb1.setFont(font);    JButton jb2=new JButton("Close");    jb2.setSize(jb1.getSize());    jb2.setOpaque(false);    jb2.setFont(font);    jb1.addActionListener(new ActionListener(){      public void actionPerformed(ActionEvent e){        scoreLabel.setText("0");        myp.remove(jl);        clearList(rset);        myp.validate();        getARandomRect();        getARandomRect();        repaint();        gameOverFlag=false;        refreshBest();      }    });    jb2.addActionListener(new ActionListener(){      public void actionPerformed(ActionEvent e){        refreshBest();        File f=new File("LASTRECORD");        if(f.exists()){          f.delete();        }        System.exit(0);      }    });    jl.add(jb1);    jl.add(jb2);    myp.add(jl);    jl.validate();  }  public void gameSuccess(){    JPanel jl=new SuccessPane(myp.getWidth(),myp.getHeight());    jl.setOpaque(false);    jl.setBounds(0, 0, 700, 700);    JButton jb1=new JButton("Continue");    Font font=new Font("TimesRoman",Font.BOLD,30);    jb1.setOpaque(false);    jb1.setFont(font);    JButton jb2=new JButton("Close");    jb2.setSize(jb1.getSize());    jb2.setOpaque(false);    jb2.setFont(font);    jb1.addActionListener(new ActionListener(){      public void actionPerformed(ActionEvent e){        myp.remove(jl);        myp.validate();        repaint();      }    });    jb2.addActionListener(new ActionListener(){      public void actionPerformed(ActionEvent e){        refreshBest();        System.exit(0);      }    });    jl.add(jb1);    jl.add(jb2);    myp.add(jl);    jl.validate();  }  @SuppressWarnings("unchecked") public void saveTheStep(){    if(saveList.size()<20){      @SuppressWarnings("rawtypes")  ArrayList arr=new ArrayList();      int score=Integer.parseInt(scoreLabel.getText());      arr.add(score);      for(int i=0;i<4;i++){        for(int j=0;j<4;j++){          if(rset[i][j]!=null){            arr.add(rset[i][j].value);          }else{            arr.add(0);          }        }      }      saveList.addLast(arr);    }else{      saveList.removeFirst();      saveTheStep();    }  }  public static String title(Object o){    String t=o.getClass().toString();    if(t.indexOf("class")!=-1){      t=t.substring(6);    }    return t;  }  public static void refreshBest(){    try {      int best=0;      File f=new File("BestRecord");      RandomAccessFile file;      if(f.exists()){        file=new RandomAccessFile(f,"rw");        best=file.readInt();        file.seek(0);      }else{        file=new RandomAccessFile(f,"rw");      }      //System.out.println("The Best score is "+best);      int cur=Integer.parseInt(scoreLabel.getText());      if(cur>best){        file.writeInt(cur);      }      file.close();    } catch (FileNotFoundException e1) {      e1.printStackTrace();    }catch(IOException e2){      e2.printStackTrace();    }  }  @SuppressWarnings("resource") public static void saveRecord(){    try{      RandomAccessFile file=new RandomAccessFile(new File("LASTRECORD"),"rw");      int score=Integer.parseInt(scoreLabel.getText());      file.writeInt(score);      for(int i=0;i<4;i++){        for(int j=0;j<4;j++){          if(rset[i][j]!=null){            file.writeInt(rset[i][j].value);          }else{            file.writeInt(0);          }        }      }    }catch(FileNotFoundException e){      e.printStackTrace();    }catch(IOException e){      e.printStackTrace();    }  }  public static void run(JApplet applet,int width,int height){    JFrame frame=new JFrame(title(applet));    frame.addWindowListener(new WindowAdapter(){      public void windowClosing(WindowEvent e){        refreshBest();        saveRecord();        //System.out.println("The score is "+scoreLabel.getText());      }    });    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    frame.getContentPane().add(applet);    frame.setSize(width,height);    applet.init();    applet.start();    frame.setVisible(true);  }  public static void main(String[] args){    run(new Game2048(), 900, 800);  }}

希望本文所述对大家java程序设计有所帮助。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表