200行java代码实现2048小游戏

本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下

效果图:

游戏介绍:

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

游戏代码:

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;
 }
}

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现拼图小游戏

    一个简单的拼图小游戏,供大家参考,具体内容如下 1.首先设计视图面板. 2.添加所需要的图片按钮. 3.最主要的是设计监听事件,添加图片的监听按钮,设定移动空白图片周围的按钮. 4.判断是否成功 . package sxy; import java.awt.Choice; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEv

  • Java完美实现2048小游戏

    完美地模仿了2048游戏,是根据网友的一个2048改的. Block.java import javax.swing.*; import java.awt.*; public class Block extends JLabel { private int value; public Block() { value = 0;//初始化值为0 setFont(new Font("font", Font.PLAIN, 40));//设定字体 setBackground(Color.gray

  • java版实现2048游戏功能

    本文实例为大家分享了java实现2048游戏功能的具体代码,供大家参考,具体内容如下 功能要求:2048的基本界面,能够实现2048的游戏功能. 总思路:两个类:Game和GameListener. Game负责界面的实现和paint方法的重写 GameListener负责实现键盘和鼠标事件的处理.移动方法,相加方法,输赢判断和随机数的出现都要在键盘监听的方法中实现. 实现分析:要实现2048游戏,首先需要考虑2048都有些什么? 界面实现: 2048的游戏界面很简单,就是一些方格和数字.要实现

  • java使用OGEngine开发2048

    最近有一款2048的游戏非常火,本文将来介绍一下使用OGEngine游戏引擎开发游戏2048. OGEngine引擎是开源的,我们很容易找到,搭建起来也很方便,我们只需在Android工程下添加OGEngine的jar包或者直接引用源码就可以了. 源码下载:http://www.ogengine.com/download/resources.jsp private void initView() { // 游戏背景 AnimatedSprite game_bg = new AnimatedSpr

  • 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{ @

  • java实现猜拳小游戏

    一天下午无聊,突发奇想做的一个简单的小游戏. 下面是我做的过程中思路与步骤:` /* 需求:由后台输入剪刀石头布,然后电脑随机输出一项,比较判断输赢 追加需求:可继续游戏,并当输入错误时提供重新输入 思路: 1.创建一个可以输入的渠道 2.能让电脑随机输出一个结果 3.用一些语句来判断比较 4.用do-while语句来完成继续游戏 5.在判断是否继续游戏时,只能输入Y/N,输入其他则重新输入 步骤: 1.输入格式:import java.util.Scanner; 2.随机格式:Math.ran

  • java实现扫雷小游戏

    本文实例为大家分享了java实现扫雷小游戏的具体代码,供大家参考,具体内容如下 代码: package GUI; import java.util.Random; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.awt.BorderLayout; import java.awt.GridLayo

  • 200行java代码实现2048小游戏

    本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下 效果图: 游戏介绍: 1.2048是一款益智类小游戏,刚开始随机出现两个数字,可以上下左右控制数字的移动. 2.当选择一个方向移动后,所有数字都会沿该方向移动到表格尽头,并且空余表格会随机出现2或4,当碰到相同的两个数字时,该两个数字会合并相加成一个数字,直到最大的数字变成2048游戏成功 3.否则当数字填满表格且不能再移动时游戏失败. 游戏代码: import java.awt.*; import java.a

  • 200 行python 代码实现 2048 游戏

    创建游戏文件 2048.py 首先导入需要的包: import curses from random import randrange, choice from collections import defaultdict 主逻辑 用户行为 所有的有效输入都可以转换为"上,下,左,右,游戏重置,退出"这六种行为,用 actions 表示 actions = ['Up', 'Left', 'Down', 'Right', 'Restart', 'Exit'] 有效输入键是最常见的 W(上

  • 200行python代码实现2048游戏

    Python实战系列用于记录实战项目中的思路,代码实现,出现的问题与解决方案以及可行的改进方向 本文为第2篇–200行Python代码实现2048 一.分析与函数设计 1.1 游戏玩法 2048这款游戏的玩法很简单,每次可以选择上下左右滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢.相撞时会相加.(介绍来自百度百科) 1.2 函数设计 _init _() 初始化4*4游戏地图,分数等游戏基本数据 is_gameover() 判

  • 200行Java代码编写一个计算器程序

    发现了大学时候写的计算器小程序,还有个图形界面,能够图形化展示表达式语法树,哈哈;) 只有200行Java代码,不但能够计算加减乘除,还能够匹配小括号~ 代码点评: 从朴素的界面配色到简单易懂错误提示,无不体现了"用户体验"至上的设计理念:代码异常处理全面合理.滴水不漏,代码缩进优雅大方,变量命名直观易懂:再结合长度适中简单明了的注释,程序整体给人一种清新脱俗之感.背后不难看出作者对学习的热爱以及对设计的苛求,工匠精神可见一斑,真可谓是大学数据结构学以致用的典范! 实现代码如下所示:

  • 380行C++代码实现扫雷小游戏

    本文实例为大家分享了C++代码实现扫雷小游戏的具体代码,供大家参考,具体内容如下 难点: 点击一次清理出一大片区域的功能,我采用的是先把点击的那一块的坐标存到一个队列里,然后取出里面的一个元素,再把这个元素周围的8块放进队列里,重复的不放,就可以对规定的区域做大面积清理了,另外为了右滑界面也加了不少代码比如一些颜色属性时钟移动效果还有光标之类的,实际上要想做一个简单的出来200行绰绰有余了,只要将程序模块化,一个函数解决一个问题,思路还是很清晰的. 此外,在写这个东西的几天里也学到了很多经验,终

  • 200行Java代码如何实现依赖注入框架详解

    依赖注入介绍 先回顾下依赖注入的概念: 我们常提起的依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念.具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为

  • 200行python代码实现贪吃蛇游戏

    本文实例为大家分享了python实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 这次我们来写一个贪吃蛇游戏 下面贴出具体代码 import pygame import time import numpy as np # 此模块包含游戏所需的常量 from pygame.locals import * # 设置棋盘的长宽 BOARDWIDTH = 48 BOARDHEIGHT = 28 # 分数 score = 0 class Food(object): def __init__(self):

  • 20行python代码的入门级小游戏的详解

    背景: 作为一个python小白,今天从菜鸟教程上看了一些python的教程,看到了python的一些语法,对比起来(有其他语言功底),感觉还是非常有趣,就随手添了一点内容,改了一个小例程,当着练练手,从一些小例子入门感觉效率很高. 代码内容: 不多说了,直接上代码: import random rang1 = int(input("请设置本局游戏的最小值:")) rang2 = int(input("请设置本局游戏的最大值:")) num = random.ran

  • Android高仿2048小游戏实现代码

    刚开始进入Splash界面: 1.SplashActivity.Java(两秒后进入开始界面,Splash界面的布局只有一个图片,在博客后,会展示给大家看) public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a

随机推荐