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小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...
随机推荐
- 兼容各浏览器中的PNG透明效果CSS定义
<style>.mycls{width: 48px;height: 48px;background: url(20090318230119136.png) no-repeat left t ...
- 【HDOJ】2604 Queuing
递推,推得f(n) = f(n-1) + f(n-3) + f(n-4).然后转换成矩阵相乘,如下f(n-1) f(n-2) f(n-3) f(n-4) * 1 1 0 0 ...
- HBASE API操作问题总结
org.apache.hadoop.hbase.MasterNotRunningException 在centos中查看,发现没有HMaster进程 解决方法: 1.启动hadoop后,需要等一段时间 ...
- RAM区间最值
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...
- 关于Android API的理解
举个例子: 比如程序中用到了android.content.ClipboardManager这个类, 而该类是在API 11才添加到 “库”. (原谅我,不理解Google API 文档里的 adde ...
- sicily 1119 Factstone Benchmark
题意:求满足n! < 2^k,n的最大值! 解题:指数比较转换成对数比较,达到降幂! 其中: log (n!) = log(n)+log(n-1)+...+log(1); log(2^k) = ...
- WKWebview点击图片查看大图
大家都知道,WKWebview是没有查看大图的属性或者方法的,所以只能通过js与之交互来实现这一功能,原理:通过js获取页面的图片,把它存放到数组,给图片添加点击事件,通过index显示大图就行了 其 ...
- ASP.NET 之深入浅出Session和Cookie
在做人事档案管理系统中,对于Session和Cookie的使用后理解更加深刻了,下面对本知识点总结学习. Session是什么? 简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有 ...
- 利用"NOTIFYICONDATA"实现MFC的托盘程序
本文章为转发百度空间内容,,保存一下,以防以后用到.. 一.自定义信息 在头文件中加入下面这句话: #define WM_SHOWTASK (WM_USER+1) 二.MYDLG.CPP文件中添加_m ...
- ORACLE的RMAN
1.什么是RMAN? RMAN可以用来备份和还原数据库文件.归档日志和控制文件.它也可以用来执行完全或不完全的数据库恢复. 注意:RMAN不能用于备份初始化参数文件和口令文件. RMAN启动数据库上的 ...