gui界面2048小游戏
坑的地方
JLabel色块要调透明
方向键要用press方法
主界面
package game; import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridLayout;
import java.awt.Color; public class Game extends JFrame implements KeyListener{ private JPanel contentPane;
Block[][] block1=new Block[4][4];//色块
GameSrc game=new GameSrc();//游戏类
int[][] pane=new int[4][4];//游戏类的数据
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Game frame = new Game();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
* Create the frame.
*/
public Game() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new GridLayout(4, 4, 5, 5)); game.newgame();
pane=game.getPane();
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
block1[i][j]=new Block();
block1[i][j].setValue(pane[i][j]);
contentPane.add(block1[i][j]);
}
}
this.addKeyListener(this); } @Override
public void keyTyped(KeyEvent e) {} @Override
public void keyPressed(KeyEvent e) {
// TODO 自动生成的方法存根
if(e.getKeyCode()==KeyEvent.VK_LEFT){
game.left();
pane=game.getPane();
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
block1[i][j].setValue(pane[i][j]);
}
}
if(game.gameOver()==1){
JOptionPane.showMessageDialog(this, "you lose");
}
}
else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
game.right();
pane=game.getPane();
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
block1[i][j].setValue(pane[i][j]);
}
}
if(game.gameOver()==1){
JOptionPane.showMessageDialog(this, "you lose");
}
}
else if(e.getKeyCode()==KeyEvent.VK_DOWN){
game.low();
pane=game.getPane();
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
block1[i][j].setValue(pane[i][j]);
}
}
if(game.gameOver()==1){
JOptionPane.showMessageDialog(this, "you lose");
}
}
else if(e.getKeyCode()==KeyEvent.VK_UP){
game.up();
pane=game.getPane();
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
block1[i][j].setValue(pane[i][j]);
}
}
if(game.gameOver()==1){
JOptionPane.showMessageDialog(this, "you lose");
}
}
} @Override
public void keyReleased(KeyEvent e) {
// TODO 自动生成的方法存根 } }
本来逻辑代码
package game;
import java.util.Random;
public class GameSrc{
    private int pane[][]=new int[4][4];    //棋盘
    int gameOver()    //显示棋盘
    {
        int gameOver=1;//   判断游戏结束条件
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                if(pane[i][j]==0){
                    gameOver=0;
                }
            }
        }
        return gameOver;
    }
    int[][] getPane(){//返回数据
        return pane;
    }
    void newgame()    //开始游戏
    {
        for(int i=0;i<=3;i++)    //初始化棋盘
            for(int j=0;j<=3;j++)
                pane[i][j]=0;
        Random random = new Random();
        int m=random.nextInt(4);//产生一个0到4(不包括4的随机数)
        int n=random.nextInt(4);
        int p=random.nextInt(4);
        int q=random.nextInt(4);
        //在随机的位置上产生初值2
        pane[m][n]=pane[p][q]=2;
    }
    void up(){//向上操作
        int i,j,three;
        boolean move=false;
        for(j=0;j<4;j++){  //上移动
            three=0;
            for(i=0;i<4;i++){
                if(pane[i][j]>0){
                    if(i!=three)
                        move=true;
                    int t=pane[i][j];
                    pane[i][j]=0;
                    pane[three][j]=t;
                    three++;
                }
            }
        }
        for(j=0;j<4;j++){  //合并数
            for(i=0;i<3;i++){
                if(pane[i][j]==pane[i+1][j]&&pane[i][j]!=0){
                    move=true;
                    pane[i][j]=pane[i][j]*2;
                    pane[i+1][j]=0;
                    int k=i+1;
                    for(;k+1<=3&&pane[k+1][j]>0;k++){
                        pane[k][j]=pane[k+1][j];
                        pane[k+1][j]=0;
                    }
                }
            }
        }
        if(move)
            random();//产生随机数
    }
    void low(){ //向下
        int i,j,three;
        boolean move=false;
        for(j=0;j<4;j++){//下移动
            three=3;
            for(i=3;i>=0;i--){
                if(pane[i][j]>0){
                    if(i!=three)
                        move=true;
                    int t=pane[i][j];
                    pane[i][j]=0;
                    pane[i+three-i][j]=t;
                    three--;
                }
            }
        }
        for(j=0;j<4;j++){//合并数
            for(i=3;i>0;i--){
                if(pane[i][j]==pane[i-1][j]&&pane[i][j]!=0){
                    move=true;
                    pane[i][j]=pane[i][j]*2;
                    pane[i-1][j]=0;
                    int k=i-1;
                    for(;k-1>=0&&pane[k-1][j]>0;k--){
                        pane[k][j]=pane[k-1][j];
                        pane[k-1][j]=0;
                    }
                }
            }
        }
        if(move)
            random();
    }
    void left(){//向左
        int i,j,three;
        boolean move=false;
        for(i=0;i<4;i++){//左移动
            three=0;
            for(j=0;j<4;j++){
                if(pane[i][j]>0){
                    if(j!=three)
                        move=true;
                    int t=pane[i][j];
                    pane[i][j]=0;
                    pane[i][three]=t;
                    three++;
                }
            }
        }
        for(i=0;i<4;i++){//合并数
            for(j=0;j<3;j++){
                if(pane[i][j]==pane[i][j+1]&&pane[i][j]!=0){
                    move=true;
                    pane[i][j]=pane[i][j]*2;
                    pane[i][j+1]=0;
                    int k=j+1;
                    for(;k+1<=3&&pane[i][k+1]>0;k++){
                        pane[i][k]=pane[i][k+1];
                        pane[i][k+1]=0;
                    }
                }
            }
        }
        if(move)
            random();
    }
    void right(){//右移
        int i,j,three;
        boolean move=false;
        for(i=0;i<4;i++){
            three=3;
            for(j=3;j>=0;j--){//右移动
                if(pane[i][j]>0){
                    if(j!=three)
                        move=true;
                    int t=pane[i][j];
                    pane[i][j]=0;
                    pane[i][three]=t;
                    three--;
                }
            }
        }
        for(i=0;i<4;i++){//合并数
            for(j=3;j>0;j--){
                if(pane[i][j]==pane[i][j-1]&&pane[i][j]!=0){
                    move=true;
                    pane[i][j]=pane[i][j]*2;
                    pane[i][j-1]=0;
                    int k=j-1;
                    for(;k-1>=0&&pane[i][k-1]>0;k--){
                        pane[i][k]=pane[i][k-1];
                        pane[i][k-1]=0;
                    }
                }
            }
        }
        if(move)
            random();
    }
    void random(){//产生随机数
        Random random = new Random();
        int m=random.nextInt(4);//产生一个0到4(不包括4的随机数)
        int n=random.nextInt(4);
        for(;pane[m][n]!=0;){
            m=random.nextInt(4);//产生一个0到4(不包括4的随机数)
            n=random.nextInt(4);
        }
        if(random.nextBoolean())
            pane[m][n]=2;
        else
            pane[m][n]=4;
    }
}
色块代码
package game; 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);//设定初始颜色为灰色
} public int getValue()//获取值
{
return value;
} public void setValue(int value)
{
this.value = value;
String text = String.valueOf(value);
if (value != 0)
setText(text);
else
setText("");//如果值为0则不显示
setOpaque(true);
setColor();
} public void setColor() //根据值的不同设定不同的背景颜色、label字体
{
switch (value)
{
case 0:
setBackground(Color.gray);
break;
case 2:
setBackground(new Color(238, 228, 218));
break;
case 4:
setBackground(new Color(238, 224, 198));
break;
case 8:
setBackground(new Color(243, 177, 116));
break;
case 16:
setBackground(new Color(243, 177, 116));
break;
case 32:
setBackground(new Color(248, 149, 90));
break;
case 64:
setBackground(new Color(249, 94, 50));
break;
case 128:
setBackground(new Color(239, 207, 108));
break;
case 256:
setBackground(new Color(239, 207, 99));
break;
case 512:
setBackground(new Color(239, 203, 82));
break;
case 1024:
setBackground(new Color(239, 199, 57));
break;
case 2048:
setBackground(new Color(239, 195, 41));
break;
case 4096:
setBackground(new Color(255, 60, 57));
break;
}
}
}
gui界面2048小游戏的更多相关文章
- Swift实战之2048小游戏
		
上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...
 - 2048小游戏代码解析 C语言版
		
2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图: 游 ...
 - Qt 制作2048小游戏
		
相信大家都玩过2048把,下面是我用qt写得2048小游戏. 2048.pro HEADERS += \ Widget.h SOURCES += \ Widget.cpp \ main.cpp QT ...
 - 2048小游戏(Java)(swing实现)(二)
		
这里是上一次的成果,只能用鼠标点,没法用键盘 最近扩充了一下知识面,实现了用键盘操控2048小游戏 但是还是不支持同时使用键盘和鼠标同时操作 import javax.swing.*; //impor ...
 - 【2048小游戏】——CSS/原生js爬坑之纯CSS模态对话框&游戏结束
		
引言:2048小游戏的结束界面,使用纯CSS制作模态对话框,一般做模态对话框都会使用BootStrap自带的模态对话框组件方便使用,但在制作要运行在移动端的小项目时,就不能使用BootStrap,因为 ...
 - .NET手撸2048小游戏
		
.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...
 - jQuery实践-网页版2048小游戏
		
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
 - C# 开发2048小游戏
		
这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...
 - 如何在CentOS上安装一个2048小游戏
		
如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...
 
随机推荐
- Tr A
			
Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input 数据的第一行是一个T,表示有T组数据. 每组数据的第 ...
 - EPZS搜索过程
			
EPZS(Enhance Predictive Zonal Search) 增强预测区域搜索,是一种整像素运动估计的搜索算法. EPZS采用的是相关性较高的预测方法.这里的相关性较高是指,更多地根据已 ...
 - UMHexagonS搜索过程
			
通过相邻块的预测得到mvp后,会以mvp为基础搜索最佳的匹配块,UMHexagonS就是h.264中用的一种搜索算法. UMHexagonS是一种整像素搜索算法,也就是搜索过程中,参考图像一直都是原来 ...
 - Currency Exchange(判断是否有正环)
			
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16456 Accepted: 5732 Description Seve ...
 - 自己动手学TCP/IP–http协议(http报文头)
			
在前面的一篇文章中,简单了介绍了HTTP报文格式,详情参考http://www.firefoxbug.net/?cat=47. 这里大概介绍下基本的,常见的HTTP包头格式. POST /report ...
 - 抽象基类(ABC),纯虚函数
			
#ifndef _ACCTABC_H_ #define _ACCTABC_H_ //(* #include <iostream> #include <string> //*) ...
 - Shell遍历文件的每一行
			
由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,因为当行里有空格的时候,输出的结果会很乱,所以…… cat input.txt |while read line> do&g ...
 - 男装电商Bonobos融资5500万美元,计划IPO,全靠体验店战略 - 国外 - 快鲤鱼
			
男装电商Bonobos融资5500万美元,计划IPO,全靠体验店战略 - 国外 - 快鲤鱼 男装电商Bonobos融资5500万美元,计划IPO,全靠体验店战略
 - F - Rain on your Parade - hdu 2389(二分图匹配,Hk算法)
			
题意:给一些人和一些伞的坐标,然后每个人都有一定的速度,还有多少时间就会下雨,问最多能有多少人可以拿到伞. 分析:题意很明确,可以用每个人和伞判断一下是否能够达到,如果能就建立一个联系.不过这道题的数 ...
 - 安装VS2012 update3提示缺少Microsoft根证书颁发机构2010或2011的解决方法
			
警告提示如图: (copy的百度贴吧的童鞋的截图) 解决方法: 下载2010.10或2011.10的根证书即可 直通车:http://maxsky.ys168.com/ ——05.||浮云文件||—— ...