如何用200行java代码实现2048小游戏

  介绍

这篇文章主要讲解了如何用200行java代码实现2048小游戏,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

<>强效果图:

如何用200行java代码实现2048小游戏

<强>游戏介绍:

1.2048是一款益智类小游戏,刚开始随机出现两个数字,可以上下左右控制数字的移动。
2。当选择一个方向移动后,所有数字都会沿该方向移动到表格尽头,并且空余表格会随机出现2或4,当碰到相同的两个数字时,该两个数字会合并相加成一个数字,直到最大的数字变成2048游戏成功
3。否则当数字填满表格且不能再移动时游戏失败。

<强>游戏代码:

进口java.awt。*;
  进口java.awt.event。*;
  进口java.util.Random;
  进口javax.swing。*;
  
  公开课Game2048延伸JPanel {
  {枚举状态
  开始,赢了,运行,结束了
  }
  
  最终颜色[]colorTable={新的颜色(0 x701710),颜色(0 xffe4c3),新颜色(0 xfff4d3),新颜色(0 xffdac3),
  新的颜色(0 xe7b08e),颜色(0 xe7bf8e),新颜色(0 xffc4c3),新颜色(0 xe7948e),新颜色(0 xbe7e56),
  新的颜色(0 xbe5e56),颜色(0 x9c3931),新颜色(0 x701710)};
  最终的静态int目标=2048;
  静态int最高;
  静态int分数;
  私人gridColor=new颜色(0 xbbada0);
  私人emptyColor=new颜色(0 xcdc1b4);
  私人startColor=new颜色(0 xffebcd);
  私人随机兰德=new随机();
  私人瓷砖[][]瓷砖;
  私人int=4;
  私人状态gamestate=State.start;
  私人布尔checkingAvailableMoves;
  
  公共Game2048 () {
  setPreferredSize(新维度(900、700));
  setBackground(新颜色(0 xfaf8ef));
  setFont(新字体(“SansSerif"字体。大胆、48));
  setFocusable(真正的);
  addMouseListener(新MouseAdapter () {
  @Override
  公共空间mousePressed (MouseEvent e) {
  startGame ();
  重画();
  }
  });
  addKeyListener(新KeyAdapter () {
  @Override
  公共空间keyPressed (KeyEvent e) {
  开关(e.getKeyCode ()) {
  案例KeyEvent.VK_UP:
  moveUp ();
  打破;
  案例KeyEvent.VK_DOWN:
  moveDown ();
  打破;
  案例KeyEvent.VK_LEFT:
  moveLeft ();
  打破;
  案例KeyEvent.VK_RIGHT:
  moveRight ();
  打破;
  }
  重画();
  }
  });
  }
  
  @Override
  公共空间paintComponent(图形gg) {
  super.paintComponent (gg);
  Graphics2D g=(Graphics2D gg);
  g.setRenderingHint (RenderingHints。KEY_ANTIALIASING RenderingHints.VALUE_ANTIALIAS_ON);
  drawGrid (g);
  }
  
  空白startGame () {
  如果(gamestate !=State.running) {
  分数=0;
  最高=0;
  gamestate=State.running;
  瓷砖=新瓷砖(侧)(边);
  addRandomTile ();
  addRandomTile ();
  }
  }
  
  空白drawGrid (Graphics2D g) {
  g.setColor (gridColor);
  g。fillRoundRect(200、100、499、499、15日,15);
  如果(gamestate==State.running) {
  for (int r=0;r & lt;一面;r + +) {
  for (int c=0;c & lt;一面;c++) {
  如果(瓷砖[r] [c]==null) {
  g.setColor (emptyColor);
  g。fillRoundRect (215 + c * 121, 115 + r * 121, 106, 106, 7, 7);
  其他}{
  drawTile (g、r、c);
  }
  }
  }
  其他}{
  g.setColor (startColor);
  g。fillRoundRect (215、115、469、469、7、7);
  g.setColor (gridColor.darker ());
  g。setFont(新字体(“SansSerif"字体。大胆,128));
  g.drawString(“2048“, 310年,270年);
  g。setFont(新字体(“SansSerif"字体。大胆的,20));
  如果(gamestate==State.won) {
  g.drawString(“你成功了!“,390年,350年);
  如果(gamestate==State.over}其他)
  g.drawString(“游戏over",, 400, 350);
  g.setColor (gridColor);
  g.drawString(“单击开始新game", 330年,470年);
  g.drawString(“(使用箭头键移动瓷砖)“,310年,530年);
  }
  }
  
  空白drawTile (c r Graphics2D g, int, int) {
  int value=https://www.yisu.com/zixun/tiles [r] [c] .getValue ();
  g.setColor (colorTable [(int) (Math.log(值)/Math.log (2) + 1]);
  g。fillRoundRect (215 + c * 121, 115 + r * 121, 106, 106, 7, 7);
  字符串s=String.valueOf(价值);
  g。改变颜色(价值<128 & # 63;colorTable [0]: colorTable [1]);
  FontMetrics调频=g.getFontMetrics ();
  int asc=fm.getAscent ();
  int 12月=fm.getDescent ();
  int x=215 + c * 121 + (106 - fm.stringWidth (s))/2;
  int y=115 + r * 121 + (asc + (106 - (asc + 12月))/2);
  g。拉带(年代,x, y);
  }
  
  私人空间addRandomTile () {
  int pos=兰德。nextInt(*一起);
  int行,上校;
  {做
  pos=(pos + 1) %(*一起);
  行=pos/侧;
  坳=pos %;
  },(瓷砖(行)(col) !=null);
  int val=rand.nextInt (10)==0 & # 63;4:2;
  瓷砖(行)(col)=new瓷砖(val);
  }
  
  私人布尔移动(int, int yIncr int countDownFrom xIncr) {
  布尔移动=false;
  for (int i=0;我

如何用200行java代码实现2048小游戏