这里是上一次的成果,只能用鼠标点,没法用键盘

最近扩充了一下知识面,实现了用键盘操控2048小游戏

但是还是不支持同时使用键盘和鼠标同时操作

 import javax.swing.*;

 //import com.sun.glass.events.KeyEvent;

 import java.awt.*;
import java.awt.event.*; public class JF2048 extends JFrame { /**
*
*/
private static final long serialVersionUID = 1L; private Ja2048 ja; public JButton b[] = {
new JButton(),
new JButton(),
new JButton(),
new JButton()
}; public JButton back = new JButton("back"); private ActionListener b0 = new ActionListener(){
public void actionPerformed(ActionEvent e){
ja.cp0();
}}; private ActionListener b1 = new ActionListener(){
public void actionPerformed(ActionEvent e){
ja.cp1();
}}; private ActionListener b2 = new ActionListener(){
public void actionPerformed(ActionEvent e){
ja.cp2();
}}; private ActionListener b3 = new ActionListener(){
public void actionPerformed(ActionEvent e){
ja.cp3();
}}; private ActionListener back1 = new ActionListener(){
public void actionPerformed(ActionEvent e){
ja.back();
}}; public JLabel[][] la ={
{new JLabel(),new JLabel(),new JLabel(),new JLabel()},
{new JLabel(),new JLabel(),new JLabel(),new JLabel()},
{new JLabel(),new JLabel(),new JLabel(),new JLabel()},
{new JLabel(),new JLabel(),new JLabel(),new JLabel()},
}; public JF2048(){ super("2048"); //this.addKeyListener(x); b[0].setBounds(3,20,16,156);
b[1].setBounds(178,20,16,156);
b[2].setBounds(20,3,156,16);
b[3].setBounds(20,178,156,16);
back.setBounds(3,3,16,16); b[0].addActionListener(b0);
b[1].addActionListener(b1);
b[2].addActionListener(b2);
b[3].addActionListener(b3);
back.addActionListener(back1); for(int i =0;i<4;i++)
for(int j =0;j<4;j++){
la[i][j].setBounds(20+40*i,20+40*j,36,36);
la[i][j].setOpaque(true);
//la[i][j].setFont(new Font("幼圆",1,24));
la[i][j].setHorizontalAlignment(SwingConstants.CENTER);
} this.setSize(217,238);
//this.add(b[0]);
//this.add(b[1]);
//this.add(b[2]);
//this.add(b[3]);
//this.add(back);
for(int i =0;i<4;i++)
for(int j =0;j<4;j++)
this.add(la[i][j]);
JLabel p = new JLabel();
p.setBackground(new Color(127,127,127));
p.setOpaque(true);
this.add(p);
this.addKeyListener(new KeyAdapter()//键盘监听按钮
{
public void keyPressed(KeyEvent e)
{
switch(e.getKeyCode()){
case KeyEvent.VK_UP:ja.cp2();break;
case KeyEvent.VK_DOWN:ja.cp3();break;
case KeyEvent.VK_RIGHT:ja.cp1();break;
case KeyEvent.VK_LEFT:ja.cp0();break;
case KeyEvent.VK_BACK_SPACE:ja.back();
}
} }); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
} public static void main(String[] args){
JF2048 jf = new JF2048();
jf.ja=new Ja2048(jf);
} }

界面部分代码

 import java.awt.*;
public class Ja2048{ public static int[][] state=new int[4][4];
public static int[][] bac=new int[4][4]; private JF2048 linkF; public Ja2048(JF2048 a){
this.linkF = a;
setNull(state,getRandom());
setNull(state,getRandom());
setState();
}
/**
* 向左
*/
public void cp0(){
boolean bool= false;
for(int i = 1;i<4;i++)
for(int j = 0;j<4;j++)
if(state[i][j]!=0&&(state[i-1][j]==0||state[i-1][j]==state[i][j]))
bool=true;
if(!bool)return; for(int i =0;i<4;i++)
for(int j =0;j<4;j++)
bac[i][j]=state[i][j]; int[][] b = new int[4][4];
for(int j=0;j<4;j++){
int[] a ={state[0][j],state[1][j],state[2][j],state[3][j]};
b[j]=LierIntArr.drop(a);
}
setNull(b,getRandom());
int[][] x=new int[4][4];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
x[i][j]=b[j][i];
state=x;
setState();
}//向左
/**
* 向右
*/
public void cp1(){
boolean bool=false;
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
if(state[i][j]!=0&&(state[i+1][j]==0||state[i+1][j]==state[i][j]))
bool=true;
if(!bool)return;
bac=state;
int[][] b = new int[4][4];
for(int j=0;j<4;j++){
int[] a = {state[3][j],state[2][j],state[1][j],state[0][j]};
b[j]=LierIntArr.drop(a);
}
setNull(b,getRandom());
int[][] x=new int[4][4];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
x[i][j]=b[j][3-i];
state=x;
setState();
}//向右
/**
* 向上
*/
public void cp2(){
boolean bool=false;
for(int i=0;i<4;i++)
for(int j=1;j<4;j++)
if(state[i][j]!=0&&(state[i][j-1]==0||state[i][j-1]==state[i][j]))
bool=true;
if(!bool)return;
bac=state.clone();
int[][] b = new int[4][4];
for(int i=0;i<4;i++)
b[i]=LierIntArr.drop(state[i]);
setNull(b,getRandom());
state=b.clone();
setState();
}//向上
/**
* 向下
*/
public void cp3(){
boolean bool=false;
for(int i=0;i<4;i++)
for(int j=0;j<3;j++)
if(state[i][j]!=0&&(state[i][j+1]==0||state[i][j+1]==state[i][j]))
bool=true;
if(!bool)return;
bac=state.clone();
int[][] b=new int[4][4];
for(int i=0;i<4;i++){
int[] a ={state[i][3],state[i][2],state[i][1],state[i][0]};
b[i]=LierIntArr.drop(a);
}
setNull(b,getRandom());
int[][] x=new int[4][4];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
x[i][j]=b[i][3-j];
state=x;
setState();
}//向下
/**
* 回滚
*/
public void back(){
state=bac.clone();
setState();
}
private void setState(){
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
if(state[i][j]==0){
linkF.la[i][j].setText("");
linkF.la[i][j].setBackground(new Color(227,227,227));
linkF.la[i][j].setForeground(new Color(0,0,0));
}
else if(state[i][j]==2){
linkF.la[i][j].setText("2");
linkF.la[i][j].setFont(new Font("幼圆",1,20));
linkF.la[i][j].setBackground(new Color(255,255,255));
linkF.la[i][j].setForeground(new Color(0,0,0));
}
else if(state[i][j]==4){
linkF.la[i][j].setText("4");
linkF.la[i][j].setFont(new Font("幼圆",1,20));
linkF.la[i][j].setBackground(new Color(127,227,127));
linkF.la[i][j].setForeground(new Color(0,0,0));
}
else if(state[i][j]==8){
linkF.la[i][j].setText("8");
linkF.la[i][j].setFont(new Font("幼圆",1,20));
linkF.la[i][j].setBackground(new Color(0,127,127));
linkF.la[i][j].setForeground(new Color(255,255,255));
}
else if(state[i][j]==16){
linkF.la[i][j].setText("16");
linkF.la[i][j].setFont(new Font("幼圆",1,20));
linkF.la[i][j].setBackground(new Color(0,255,0));
linkF.la[i][j].setForeground(new Color(255,255,255));
}
else if(state[i][j]==32){
linkF.la[i][j].setText("32");
linkF.la[i][j].setFont(new Font("幼圆",1,20));
linkF.la[i][j].setBackground(new Color(127,127,0));
linkF.la[i][j].setForeground(new Color(255,255,255));
}
else if(state[i][j]==64){
linkF.la[i][j].setText("64");
linkF.la[i][j].setFont(new Font("幼圆",1,20));
linkF.la[i][j].setBackground(new Color(255,0,0));
linkF.la[i][j].setForeground(new Color(255,255,255));
}
else if(state[i][j]==128){
linkF.la[i][j].setText("128");
linkF.la[i][j].setFont(new Font("幼圆",1,20));
linkF.la[i][j].setBackground(new Color(127,255,0));
linkF.la[i][j].setForeground(new Color(255,255,255));
}
else if(state[i][j]==256){
linkF.la[i][j].setText("256");
linkF.la[i][j].setFont(new Font("幼圆",1,20));
linkF.la[i][j].setBackground(new Color(255,255,0));
linkF.la[i][j].setForeground(new Color(0,0,0));
}
else if(state[i][j]==512){
linkF.la[i][j].setText("512");
linkF.la[i][j].setFont(new Font("幼圆",1,20));
linkF.la[i][j].setBackground(new Color(255,255,0));
linkF.la[i][j].setForeground(new Color(0,0,0));
}
else if(state[i][j]==1024){
linkF.la[i][j].setText("1024");
linkF.la[i][j].setFont(new Font("幼圆",1,16));
linkF.la[i][j].setBackground(new Color(63,63,63));
linkF.la[i][j].setForeground(new Color(255,255,255));
}
}//for循环 }//setState方法 private static int getRandom(){
int a = (int)(1000*Math.random());
if(a%10<3)
return 4;
else
return 2;
}//随机生成一个2或4,可通过调整判断条件中的数字大小来调整2和4所占的比率
/**
* 用于在4x4二维数组中随机挑出一个值为0的元素,并将其赋值为给定整数。特殊地,若该二维数组已满,返回false。
* @param x 该二维数组
* @param y 给定整数
* @return
*/
private static boolean setNull(int[][] x,int y){
boolean bool=false;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(x[i][j]==0)bool=true;
if(!bool)return false; int a = (int)(100*Math.random());
int b = (int)(6+10*Math.random());
int c = a%b;
while(true){
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
if(x[i][j]==0&&c<=0){
x[i][j]=y;
return true;
}
else if(x[i][j]==0&&c>0)
c--;
i=(i==4?0:i);
j=(j==4?0:j);
}
}
}//boolean setNull(int[][],int)方法用于在4x4二维数组中随机挑出一个值为0的元素,并将其赋值为给定整数。特殊地,若该二维数组已满,返回false。 }

算法部分代码

 /**
*
* @author qliujinming@qq.com
*
* @see http://www.cnblogs.com/liujinming/
*
*/
public class LierIntArr{
/**
* 该方法用于接受一个整数数组,对该数组进行drop操作后返回
* 示例:接受 2 0 2 0 5 5,返回4 10 0 0 0 0
* @param 需要进行drop操作的数组
* @return drop操作之后的数组
*/
public static int[] drop(int[] a){
int b = a.length;
if(b<=1)return a;
int[] c = new int[b];
int j=0;
for(int i=0;i<b;i++){
if(c[j]==0&&a[i]!=0)
c[j]=a[i];
else if(c[j]!=0&&a[i]==c[j]){
c[j]=2*a[i];
j++;
}
else if(a[i]!=0&&c[j]!=0&&a[i]!=c[j]){
j++;
c[j]=a[i];
}
}
return c;
}
//该方法用于接受一个整数数组,对该数组进行drop操作后返回
//示例:接受 2 0 2 0 5 5,返回4 10 0 0 0 0 public static void main(String[] args){
int[] a = {0,2,0,2,4,0,0,4,2,0,2,5,5,0,10};
int[] b = drop(a);
for(int i = 0;i<b.length;i++)
System.out.print(b[i]+",");
}
//输出结果:4,8,4,10,10,0,0,0,0,0,0,0,0,0,0, }

工具

2048小游戏(Java)(swing实现)(二)的更多相关文章

  1. 2048小游戏(Java)(swing实现)(一)

    自己写的2048小游戏,仅支持鼠标操作 主要是我不知道怎么添加键盘监听 import javax.swing.*; import java.awt.*; import java.awt.event.* ...

  2. 【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容

    引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了. 一.二维数组存储    首先考虑用二维数组存储所有行数,列数   ...

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

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

  4. Swift实战之2048小游戏

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

  5. js、jQuery实现2048小游戏

    2048小游戏 一.游戏简介:  2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合 ...

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

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

  7. Docker从0开始之部署一套2048小游戏

    本文记录一下在docker部署一套2048小游戏的过程,在娱乐中熟悉docker的应用部署.docker 安装不在本文讲述之中,参考我的其它博客. 1.获取image镜像. 方法一:daocloud. ...

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

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

  9. 【2048小游戏】——原生js爬坑之封装行的移动算法&事件

    引言:2048小游戏的核心玩法是移动行,包括横行和纵行,玩家可以选择4个方向,然后所有行内的数字就会随着行的移动而向特定的方向移动.这个行的移动是一个需要重复调用的算法,所以这里就要将一行的移动算法封 ...

随机推荐

  1. Angular01 利用grunt搭建自动web前端开发环境、利用angular-cli搭建web前端项目

    搭建angular开发环境 一.下载并安装node 官网地址:点击前往 二.利用npm安装cnpm 安装好node后就可以使用npm命令啦 查看版本:npm -v 安装cnpm:npm install ...

  2. 存储前set方法相互关联 只关联了一方 分别set

    17:51:45,580 ERROR SqlExceptionHelper:129 - Column 'lkm_cust_id' cannot be nullorg.hibernate.excepti ...

  3. STM32 C++编程 003 USART(串口)类

    使用 C++ 语言给 STM32 编写一个 Usart 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的 ...

  4. 高性能MySQL笔记-第5章Indexing for High Performance-004怎样用索引才高效

    一.怎样用索引才高效 1.隔离索引列 MySQL generally can’t use indexes on columns unless the columns are isolated in t ...

  5. IDEA工作中常用快捷键

    ctrl+shift+t: Ubuntu中在一个工具栏中打开两个终端 shift+shift: 搜索任何类 ctrl+N: 搜索任何类 ctrl+right: forward----自定义 ctrl+ ...

  6. Understanding the Effective Receptive Field in Deep Convolutional Neural Networks

    Understanding the Effective Receptive Field in Deep Convolutional Neural Networks 理解深度卷积神经网络中的有效感受野 ...

  7. xcodebuild命令

    一.xcodebuild命令介绍 1.基本命令 查看xcodebuild简洁用法 xcodebuild -usage 查看已安装的SDK xcodebuild -showsdks 查看安装的版本号 x ...

  8. 《Linux内核设计与实现》读书笔记(九)- 内核同步介绍

    存在共享资源(共享一个文件,一块内存等等)的时候,为了防止并发访问时共享资源的数据不一致,引入了同步机制. 主要内容: 同步的概念 同步的方法-加锁 死锁 锁的粒度 1. 同步的概念 了解同步之前,先 ...

  9. 【转】 robotframework(rf)中对时间操作的datetime库常用关键字

    转自http://blog.csdn.net/r455678/article/details/52993765 DateTime库是robotframework内置的库 1.对固定日期进行操作,增加或 ...

  10. L - Large Division (大数, 同余)

    Given two integers, a and b, you should check whether a is divisible by b or not. We know that an in ...