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小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...
随机推荐
- Win7主题被禁用
今天早上干了一件傻缺的事,打开电脑的时候,某卫士提醒开机速度击败全国0.2%的电脑,之后点了优化...随后就发生了接下来的一幕: win7下面的主题都不能使用了,只能使用那种复古(很丑的样式,看着很不 ...
- IDE 常用快捷键记录
一:Eclipse (1)删除当前行:Ctrl+D (2)最大化当前编辑窗口:Ctrl+m (3)关闭当前编辑器窗口:Ctrl+F4/Ctrl+w (4)导入依赖包:Ctrl+Shift+o 二:Ne ...
- VMware 11安装Mac OS X 10.10
http://jingyan.baidu.com/article/ff411625b9011212e48237b4.html
- ASPNET异步删除和增加
function InitList() { $.getJSON("GetNewsList.ashx", {}, function (data) { for (var i = 0; ...
- Java---多线程之死锁
★ 死锁的两种情况: 简单的说下单块cpu运行多线程的情况: 大家可能平时玩电脑,可以同时挂QQ啊,玩游戏啊,打开文本啊,等等.这里,我们假设是单块cpu.也就是俗称的单核cpu. 大家可能会觉得这些 ...
- C++类型转换[转]
转自 http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型 ...
- Selenium 初见
Selenium名字的来源 在这里,我还想说一下关于Selenium名字的来源,很有意思的: >:Selenium的中文名为“硒”,是一种化学元素的名字,它对汞 (Mercury)有天然的解毒作 ...
- windows 编程—— 使用函数笔记
目录: 创建滚动条 滚动条函数(新老版本) 取得设备内容句柄hdc 设置 hdc 中的属性 画点画线 画填充图形 使用自定义的 画笔 和 画刷 矩形.区域和剪裁 关于GDI映像模式 其他常用的方便计算 ...
- Hitting the 2100 parameter limit (SQL Server) when using Contains()
1down vote My solution (Guides -> List of Guid): List<tstTest> tsts = new List<tstTest&g ...
- Android中如何将dp,dip,sp与px相互转化
Android中有很多度量单位:比如常用的dp,dip,sp,px等,有时候需要将他们相互转换,有下面非常方便的方法: 比如sp转换成px: TypedValue.applyDimension(Typ ...