本文实例讲述了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

for(int j=0;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

for(int j=0;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);

}

}

PS:这里再为大家推荐另两款本站2048游戏供大家参考(JS实现)

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

2048 java代码_java实现的2048游戏完整实例相关推荐

  1. 拼图游戏java代码_java设计:拼图游戏 完整源码

    //July/设计. //我对有的老师,很无语./06.04/. //Puzzle.java ----------------------------------------------------- ...

  2. 蜘蛛纸牌 java代码_java实现蜘蛛纸牌游戏

    [实例简介] 用java技术实现windows自带的蜘蛛纸牌游戏 [实例截图] [核心代码] CardsGame └── CardsGame ├── bin │   └── com │   └── g ...

  3. 贪吃蛇游戏java代码_Java实现贪吃蛇游戏

    最近JAVA和JSwing上手练习了一下贪吃蛇,供大家参考,具体内容如下 欢迎交流和加入新的内容 用到了JSwing,下面是一些具体的思路 实现 * 蛇: 采用单链表记录首尾,整个蛇被分为lattic ...

  4. 扑克牌游戏java代码_java实现简易扑克牌游戏

    本文实例为大家分享了java实现扑克牌游戏的具体代码,供大家参考,具体内容如下 游戏功能描述 1.创建一副扑克牌: 包括四种花色:黑桃,红桃,梅花,方片 包括十三种点数:2-10,J,Q,K,A 2. ...

  5. 拼图java代码_Java制作智能拼图游戏原理及代码

    今天突发奇想,想做一个智能拼图游戏来给哄女友. 需要实现这些功能 第一图片自定义 第二宫格自定义,当然我一开始就想的是3*3 4*4 5*5,没有使用3*5这样的宫格. 第三要实现自动拼图的功能,相信 ...

  6. java双人游戏_Java 简易双人坦克游戏实现

    [实例简介] 通过Java制作简易双人坦克游戏,游戏界面简单,没有美化,不过实现双人游戏,能超级炮弹,血条,复活等功能,基本BUG已经修复,需要的可以下载学习. [实例截图] [核心代码] 简易双人坦 ...

  7. 随机数生成java代码_Java Bullshifier –生成大量随机代码库

    随机数生成java代码 生成大量随机Java应用程序的命令行工具 您一直在等待的命令行工具. 或不. 毕竟,这是很深奥的. 无论哪种方式,它对某些人都非常有用,而对其他人来说却是一个有趣的实用程序. ...

  8. java代码_Java 代码实现排序算法

       阅读本文约需要8分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...

  9. 上传图片的表单java代码_java模拟post方式提交表单实现图片上传(示例代码)

    转自:http://blog.csdn.net/5iasp/article/details/8669644 模拟表单html如下: java代码如下: [java] view plain copy p ...

最新文章

  1. LeetCode 230. Kth Smallest Element in a BST--C++,Python解法--面试真题--找二叉树中第K小的元素
  2. 关于redis的几件小事(一)redis的使用目的与问题
  3. SSM中通过okhttp3向接口发送xml格式的请求参数
  4. 7旗舰版装不了itunes_装系统,用小白,让小白来教大家如何用U盘装WIN7系统
  5. Java笔记--实时更新
  6. 算法9---二叉树的遍历不用栈和递归
  7. Python小记--在特定位置修改CSV文件
  8. 电子政务方向:We7.Cloud政府云门户
  9. 树莓派linux i2c通信,树莓派与i2c设备的通信
  10. 什么是Git?——Git的学习与使用(一)
  11. 使用Kotlin的Android SeekBar
  12. hdoj2955 Robberies(01背包)
  13. 基于ServerSokect和Soket的简易Qq程序
  14. python源代码文件_Python代码编译与反编译
  15. 氩焊机器人编程_如何操作焊接机器人的编程?这六点是基础!
  16. Android 友盟分享自定义面板使用
  17. VS2017使用C#编写程序员告白小软件
  18. Django开发个人博客网站——11、通过regroup实现博客的归档
  19. [转载]NFC问题分析
  20. 使用BitLocker实现磁盘加密、u盘加密、移动硬盘加密

热门文章

  1. 双杀之后迎来双爆发,高性能计算HPC上云之势不可挡
  2. java开发工程师面试题一
  3. Casual Literary Notes
  4. python数据分析案例2:电影评分数据集的分析
  5. 计算机图形学(七)——Phong光照模型
  6. 盛世昊通顺利登陆美国纳斯达克,产业链布局加速
  7. 10个问题解答火热的元宇宙概念
  8. 社区团购小程序开发 平邑网站建设网店制作
  9. 超实用的Mac使用小技巧
  10. Docker 部署kafka遇到的问题