最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

200行java代碼實(shí)現(xiàn)2048小游戲

 更新時(shí)間:2020年04月18日 15:02:12   作者:池魚之殃  
這篇文章主要為大家詳細(xì)介紹了200行java代碼實(shí)現(xiàn)2048小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java實(shí)現(xiàn)2048小游戲的具體代碼,供大家參考,具體內(nèi)容如下

效果圖:

游戲介紹:

1.2048是一款益智類小游戲,剛開始隨機(jī)出現(xiàn)兩個(gè)數(shù)字,可以上下左右控制數(shù)字的移動。
2.當(dāng)選擇一個(gè)方向移動后,所有數(shù)字都會沿該方向移動到表格盡頭,并且空余表格會隨機(jī)出現(xiàn)2或4,當(dāng)碰到相同的兩個(gè)數(shù)字時(shí),該兩個(gè)數(shù)字會合并相加成一個(gè)數(shù)字,直到最大的數(shù)字變成2048游戲成功
3.否則當(dāng)數(shù)字填滿表格且不能再移動時(shí)游戲失敗。

游戲代碼:

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;

public class Game2048 extends JPanel {
 enum State {
 start, won, running, over
 }

 final Color[] colorTable = { new Color(0x701710), new Color(0xFFE4C3), new Color(0xfff4d3), new Color(0xffdac3),
 new Color(0xe7b08e), new Color(0xe7bf8e), new Color(0xffc4c3), new Color(0xE7948e), new Color(0xbe7e56),
 new Color(0xbe5e56), new Color(0x9c3931), new Color(0x701710) };
 final static int target = 2048;
 static int highest;
 static int score;
 private Color gridColor = new Color(0xBBADA0);
 private Color emptyColor = new Color(0xCDC1B4);
 private Color startColor = new Color(0xFFEBCD);
 private Random rand = new Random();
 private Tile[][] tiles;
 private int side = 4;
 private State gamestate = State.start;
 private boolean checkingAvailableMoves;

 public Game2048() {
 setPreferredSize(new Dimension(900, 700));
 setBackground(new Color(0xFAF8EF));
 setFont(new Font("SansSerif", Font.BOLD, 48));
 setFocusable(true);
 addMouseListener(new MouseAdapter() {
 @Override
 public void mousePressed(MouseEvent e) {
 startGame();
 repaint();
 }
 });
 addKeyListener(new KeyAdapter() {
 @Override
 public void keyPressed(KeyEvent e) {
 switch (e.getKeyCode()) {
 case KeyEvent.VK_UP:
  moveUp();
  break;
 case KeyEvent.VK_DOWN:
  moveDown();
  break;
 case KeyEvent.VK_LEFT:
  moveLeft();
  break;
 case KeyEvent.VK_RIGHT:
  moveRight();
  break;
 }
 repaint();
 }
 });
 }

 @Override
 public void paintComponent(Graphics gg) {
 super.paintComponent(gg);
 Graphics2D g = (Graphics2D) gg;
 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 drawGrid(g);
 }

 void startGame() {
 if (gamestate != State.running) {
 score = 0;
 highest = 0;
 gamestate = State.running;
 tiles = new Tile[side][side];
 addRandomTile();
 addRandomTile();
 }
 }

 void drawGrid(Graphics2D g) {
 g.setColor(gridColor);
 g.fillRoundRect(200, 100, 499, 499, 15, 15);
 if (gamestate == State.running) {
 for (int r = 0; r < side; r++) {
 for (int c = 0; c < side; c++) {
  if (tiles[r][c] == null) {
  g.setColor(emptyColor);
  g.fillRoundRect(215 + c * 121, 115 + r * 121, 106, 106, 7, 7);
  } else {
  drawTile(g, r, c);
  }
 }
 }
 } else {
 g.setColor(startColor);
 g.fillRoundRect(215, 115, 469, 469, 7, 7);
 g.setColor(gridColor.darker());
 g.setFont(new Font("SansSerif", Font.BOLD, 128));
 g.drawString("2048", 310, 270);
 g.setFont(new Font("SansSerif", Font.BOLD, 20));
 if (gamestate == State.won) {
 g.drawString("you made it!", 390, 350);
 } else if (gamestate == State.over)
 g.drawString("game over", 400, 350);
 g.setColor(gridColor);
 g.drawString("click to start a new game", 330, 470);
 g.drawString("(use arrow keys to move tiles)", 310, 530);
 }
 }

 void drawTile(Graphics2D g, int r, int c) {
 int value = tiles[r][c].getValue();
 g.setColor(colorTable[(int) (Math.log(value) / Math.log(2)) + 1]);
 g.fillRoundRect(215 + c * 121, 115 + r * 121, 106, 106, 7, 7);
 String s = String.valueOf(value);
 g.setColor(value < 128 ? colorTable[0] : colorTable[1]);
 FontMetrics fm = g.getFontMetrics();
 int asc = fm.getAscent();
 int dec = fm.getDescent();
 int x = 215 + c * 121 + (106 - fm.stringWidth(s)) / 2;
 int y = 115 + r * 121 + (asc + (106 - (asc + dec)) / 2);
 g.drawString(s, x, y);
 }

 private void addRandomTile() {
 int pos = rand.nextInt(side * side);
 int row, col;
 do {
 pos = (pos + 1) % (side * side);
 row = pos / side;
 col = pos % side;
 } while (tiles[row][col] != null);
 int val = rand.nextInt(10) == 0 ? 4 : 2;
 tiles[row][col] = new Tile(val);
 }

 private boolean move(int countDownFrom, int yIncr, int xIncr) {
 boolean moved = false;
 for (int i = 0; i < side * side; i++) {
 int j = Math.abs(countDownFrom - i);
 int r = j / side;
 int c = j % side;
 if (tiles[r][c] == null)
 continue;
 int nextR = r + yIncr;
 int nextC = c + xIncr;
 while (nextR >= 0 && nextR < side && nextC >= 0 && nextC < side) {
 Tile next = tiles[nextR][nextC];
 Tile curr = tiles[r][c];
 if (next == null) {
  if (checkingAvailableMoves)
  return true;
  tiles[nextR][nextC] = curr;
  tiles[r][c] = null;
  r = nextR;
  c = nextC;
  nextR += yIncr;
  nextC += xIncr;
  moved = true;
 } else if (next.canMergeWith(curr)) {
  if (checkingAvailableMoves)
  return true;
  int value = next.mergeWith(curr);
  if (value > highest)
  highest = value;
  score += value;
  tiles[r][c] = null;
  moved = true;
  break;
 } else
  break;
 }
 }
 if (moved) {
 if (highest < target) {
 clearMerged();
 addRandomTile();
 if (!movesAvailable()) {
  gamestate = State.over;
 }
 } else if (highest == target)
 gamestate = State.won;
 }
 return moved;
 }

 boolean moveUp() {
 return move(0, -1, 0);
 }

 boolean moveDown() {
 return move(side * side - 1, 1, 0);
 }

 boolean moveLeft() {
 return move(0, 0, -1);
 }

 boolean moveRight() {
 return move(side * side - 1, 0, 1);
 }

 void clearMerged() {
 for (Tile[] row : tiles)
 for (Tile tile : row)
 if (tile != null)
  tile.setMerged(false);
 }

 boolean movesAvailable() {
 checkingAvailableMoves = true;
 boolean hasMoves = moveUp() || moveDown() || moveLeft() || moveRight();
 checkingAvailableMoves = false;
 return hasMoves;
 }

 public static void main(String[] args) {
 SwingUtilities.invokeLater(() -> {
 JFrame f = new JFrame();
 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 f.setTitle("2048");
 f.setResizable(true);
 f.add(new Game2048(), BorderLayout.CENTER);
 f.pack();
 f.setLocationRelativeTo(null);
 f.setVisible(true);
 });
 }
}

class Tile {
 private boolean merged;
 private int value;

 Tile(int val) {
 value = val;
 }

 int getValue() {
 return value;
 }

 void setMerged(boolean m) {
 merged = m;
 }

 boolean canMergeWith(Tile other) {
 return !merged && other != null && !other.merged && value == other.getValue();
 }

 int mergeWith(Tile other) {
 if (canMergeWith(other)) {
 value *= 2;
 merged = true;
 return value;
 }
 return -1;
 }
}

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring和activiti進(jìn)行整合過程解析

    Spring和activiti進(jìn)行整合過程解析

    這篇文章主要介紹了Spring和activiti進(jìn)行整合過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java IO文件過濾器對命令設(shè)計(jì)模式的使用

    Java IO文件過濾器對命令設(shè)計(jì)模式的使用

    java io流里面使用到了很多的設(shè)計(jì)模式,最典型的就是裝飾模式,還有命令模式,下面分兩部分來講Java IO文件過濾器對命令設(shè)計(jì)模式的使用,一起看看吧
    2017-06-06
  • Java輸出數(shù)組的3種方法

    Java輸出數(shù)組的3種方法

    這篇文章主要給大家介紹了關(guān)于Java輸出數(shù)組的3種方法,對于初學(xué)者來說,數(shù)組的輸入輸出是一個(gè)麻煩的問題,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 簡單解析execute和submit有什么區(qū)別

    簡單解析execute和submit有什么區(qū)別

    這篇文章主要介紹了簡單解析execute和submit有什么區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java 創(chuàng)建線程的3種方法及各自的優(yōu)點(diǎn)

    Java 創(chuàng)建線程的3種方法及各自的優(yōu)點(diǎn)

    這篇文章主要介紹了Java 創(chuàng)建線程的3種方法及各自的優(yōu)點(diǎn),文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • java實(shí)現(xiàn)冒泡排序算法

    java實(shí)現(xiàn)冒泡排序算法

    冒泡排序(Bubble Sort)是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。
    2015-04-04
  • Java面向?qū)ο蟪绦蛟O(shè)計(jì):繼承,多態(tài)用法實(shí)例分析

    Java面向?qū)ο蟪绦蛟O(shè)計(jì):繼承,多態(tài)用法實(shí)例分析

    這篇文章主要介紹了Java面向?qū)ο蟪绦蛟O(shè)計(jì):繼承,多態(tài)用法,結(jié)合實(shí)例形式分析了java繼承與多態(tài)的相關(guān)概念、原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • Redisson可重入鎖解鎖邏輯詳細(xì)講解

    Redisson可重入鎖解鎖邏輯詳細(xì)講解

    Redisson開源框架是一個(gè)Redis的分布式鎖的現(xiàn)成實(shí)現(xiàn)方案,是Redis的java實(shí)現(xiàn)的客戶端。通過Netty支持非阻塞I/O。Redisson實(shí)現(xiàn)了分布式鎖的自動續(xù)期機(jī)制、鎖的互斥自等待機(jī)制、鎖的可重入加鎖與釋放鎖的機(jī)制
    2023-02-02
  • Java springboot 配置文件與多環(huán)境配置與運(yùn)行優(yōu)先級

    Java springboot 配置文件與多環(huán)境配置與運(yùn)行優(yōu)先級

    這篇文章主要介紹了Java springboot如何配置文件,進(jìn)行多環(huán)境配置,以及運(yùn)行優(yōu)先級,感興趣的小伙伴可以借鑒一下
    2023-04-04
  • Java8?Stream流多字段求和、匯聚的實(shí)例

    Java8?Stream流多字段求和、匯聚的實(shí)例

    這篇文章主要介紹了Java8?Stream流多字段求和、匯聚的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論

陵川县| 阜阳市| 成安县| 应城市| 邯郸县| 沂南县| 兴化市| 新化县| 南汇区| 镇巴县| 丰镇市| 祁门县| 北川| 商洛市| 炎陵县| 卓资县| 东海县| 永靖县| 缙云县| 吴川市| 花莲市| 唐河县| 额敏县| 滁州市| 车险| 吉木萨尔县| 砚山县| 广元市| 洛阳市| 曲靖市| 张掖市| 永清县| 明水县| 太原市| 榆树市| 三都| 淳化县| 阜康市| 吉木萨尔县| 祁东县| 榆社县|