坑的地方

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小游戏的更多相关文章

  1. Swift实战之2048小游戏

    上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...

  2. 2048小游戏代码解析 C语言版

    2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图:  游 ...

  3. Qt 制作2048小游戏

    相信大家都玩过2048把,下面是我用qt写得2048小游戏. 2048.pro HEADERS += \ Widget.h SOURCES += \ Widget.cpp \ main.cpp QT ...

  4. 2048小游戏(Java)(swing实现)(二)

    这里是上一次的成果,只能用鼠标点,没法用键盘 最近扩充了一下知识面,实现了用键盘操控2048小游戏 但是还是不支持同时使用键盘和鼠标同时操作 import javax.swing.*; //impor ...

  5. 【2048小游戏】——CSS/原生js爬坑之纯CSS模态对话框&游戏结束

    引言:2048小游戏的结束界面,使用纯CSS制作模态对话框,一般做模态对话框都会使用BootStrap自带的模态对话框组件方便使用,但在制作要运行在移动端的小项目时,就不能使用BootStrap,因为 ...

  6. .NET手撸2048小游戏

    .NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...

  7. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  8. C# 开发2048小游戏

    这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...

  9. 如何在CentOS上安装一个2048小游戏

    如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...

随机推荐

  1. IOS学习:常用第三方库(GDataXMLNode:xml解析库)

    IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...

  2. [Android] 输入系统(一)

    Android输入系统是人与机器交互最主要的手段.我们通过按键或者触碰屏幕,会先经由linux产生中断,进行统一的处理过后,转换成Android能识别的事件信息,然后Android的输入系统去获取事件 ...

  3. web2.0的几个开源项目

    web2.0的几个开源项目   Diggclone-开源digg类程序官方:http://www.talkingpixels.org/diggclone/index.php演示:同digg.com类似 ...

  4. HDU 1083 Courses(最大匹配模版题)

    题目大意: 一共有N个学生跟P门课程,一个学生可以任意选一 门或多门课,问是否达成:    1.每个学生选的都是不同的课(即不能有两个学生选同一门课)   2.每门课都有一个代表(即P门课都被成功选过 ...

  5. 【转】(DT系列四)驱动加载中, 如何取得device tree中的属性

    原文网址:http://www.cnblogs.com/biglucky/p/4057488.html 本文以At91rm9200平台为例,从源码实现的角度来分析驱动加载时,Device tree的属 ...

  6. Yarn应用程序运行流程剖析

    Yarn(Yet Another Resource Negotiator)是一个Hadoop集群资源管理系统,Hadoop2时被引入,旨在提高MapReduce的性能,但YARN已足够通用,使得它可以 ...

  7. 【规律】【贪心】【数学】HDU 5573 Binary Tree

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 题目大意: 从1走到第k层,下一层的数是上一层的数*2或者*2+1,可以选择加上或者减去走的数 ...

  8. LeetCode-Add Two Binary

    Add BinaryApr 2 '12 3558 / 10570 Given two binary strings, return their sum (also a binary string). ...

  9. 从APP消息推送所理解的观察者模式

    #1.什么是观察者模式? 观察者模式=(出版者+订阅者)模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能 ...

  10. windows 编程 —— 消息与参数(定时器、初始化消息、改变大小)

    目录: 定时器 WM_TIMER 初始化消息 WM_CREATE 改变大小 WM_SIZE 定时器: 接收消息:WM_TIMER 参数wParam:wParam参数等于定时器的ID值(上述情形为1). ...