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小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...
随机推荐
- iOS6 自动布局 入门–Auto Layout(转)
iOS6 自动布局 入门–Auto Layout(转) 标签: 杂谈 目前为止,即使你的界面设计是在合理的复杂度内,你也必须要为之写许多代码来适应变化的布局.现在我相信你会很高兴听到这种情况将不会 ...
- xcode导出ipa的几种方式-by
1,编译: Product -> Archive 2,导出: Window -> Organizer (Command + Shift +2) -> Archives ->Di ...
- JS基于时间戳写的浏览访问人数
Title:JS基于时间戳写的浏览访问人数 --2013-12-23 14:07 <script language="JavaScript"> var timesta ...
- 【Hybrid App】关于Hybrid App技术解决方案的选择
[引言]近年来随着移动设备类型的变多,操作系统的变多,用户需求的增加,对于每个项目启动前,大家都会考虑到的成本,团队成员,技术成熟度,时间,项目需求等一堆的因素.因此,开发App的方案已经变得越来越多 ...
- POJ3083 Children of the Candy Corn(搜索)
题目链接. 题意: 先沿着左边的墙从 S 一直走,求到达 E 的步数. 再沿着右边的墙从 S 一直走,求到达 E 的步数. 最后求最短路. 分析: 最短路好办,关键是沿着墙走不太好想. 但只要弄懂如何 ...
- 推送消息 相关公司 手机端分享http://mob.com/
信鸽 http://xg.qq.com/xg/pro/ctr_message 云巴 http://yunba.io/usercases/ 极光https://www.jpush.cn/ 手机端分享ht ...
- Java学习日记-1 设置Java环境变量等
一.环境变量的设置 安装完jdk以后,需要配置环境变量,找到[我的电脑]-[属性]-[高级]-[环境变量] 这里需要配置3个环境变量 1.新建系统变量JAVA_HOME,变量值为jdk的安装路径,比如 ...
- SublimeText的使用
1.安装Sublime_text2.02文件:Sublime Text 2.0.2.tar.bz2 (1)官网下载地址:http://www.sublimetext.com/2 (2)将文件放到lin ...
- 1st day
学习配置环境,听的一脸懵逼,不过还好装好了,哈哈哈... <?php /*写一个函数,该函数可以将给定的任意个数的参数以指定的字符串串接起来成为一个长的字符串.该函数带2个或2个以上参数,其中第 ...
- Object-C @synthesize -- 笔记