用java实现简易PC版2048
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.*;
import java.util.Random; import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.*;
import javax.swing.JTextField; public class Copy2048 extends JFrame{
private JPanel scoresPane;
private JPanel mainPane;
private JLabel labelMaxScores ;
private JLabel labelScores;
private JLabel tips; //提示操作标签
private JTextField textMaxScores;
private JLabel textScores;
private JLabel[][] texts;
private Icon icon2;
private int times = 16; //记录剩余空方块数目
private int scores = 0; //记录分数
private int l1,l2,l3,l4,l5; //用于判断游戏是否失败
Font font = new Font("", Font.BOLD,14); //设置字体类型和大小
Font font2 = new Font("", Font.BOLD,30);
Random random = new Random(); public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
try{
Copy2048 frame = new Copy2048();
frame.setVisible(true);
// Thread thread = new Thread(frame);
// thread.start();
}
catch(Exception e1){
e1.printStackTrace();
}
}
});
}
/**
* 构造方法
*/
public Copy2048(){
super();
setResizable(false); //禁止调整窗体大小
getContentPane().setLayout(null); //设置空布局
setBounds(500, 50, 500, 615);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("2048PC版"); //设置窗体标题 scoresPane = new JPanel(); //创建分数显示面板
scoresPane.setBackground(Color.green); //设置分数显示面板的背景色
scoresPane.setBounds(20, 20, 460, 40);
scoresPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.YELLOW)); //设置得分面板的边框
getContentPane().add(scoresPane); //将得分面板添加到窗体
scoresPane.setLayout(null); //设置面板空布局 labelMaxScores = new JLabel("最高分:"); //最高分标签
labelMaxScores.setFont(font); //设置字体类型和大小
labelMaxScores.setBounds(10, 5, 50, 30); //设置最懂啊分标签的位置尺寸
scoresPane.add(labelMaxScores); //将最高分标签添加到得分容器中 textMaxScores = new JTextField("暂不可用"); //得分标签
textMaxScores.setBounds(60, 5, 150, 30);
textMaxScores.setFont(font);
textMaxScores.setEditable(false);
scoresPane.add(textMaxScores); //将得分标签添加到分数面板中 labelScores = new JLabel("得 分:");
labelScores.setFont(font); //设置字体类型和大小
labelScores.setBounds(240, 5, 50, 30);
scoresPane.add(labelScores); textScores = new JLabel(String.valueOf(scores));
textScores.setFont(font);
textScores.setBounds(290, 5, 150, 30);
scoresPane.add(textScores); mainPane = new JPanel(); //创建游戏主面板
mainPane.setBounds(20, 70, 460, 500); //设置主面板位置尺寸 this.getContentPane().add(mainPane);
mainPane.setLayout(null); //设置空布局 texts = new JLabel[4][4]; //创建文本框二维数组
for(int i = 0; i < 4; i++){ //遍历数组
for(int j = 0; j < 4; j++){
texts[i][j] = new JLabel(); //创建标签
texts[i][j].setFont(font2);
texts[i][j].setHorizontalAlignment(SwingConstants.CENTER);
texts[i][j].setText("");
texts[i][j].setBounds(120 * j, 120 * i, 100, 100); //设置方块的大小位置
setColor(i, j, "");
texts[i][j].setOpaque(true);
texts[i][j].setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));//设置方块边框颜色
mainPane.add(texts[i][j]); //将创建的文本框放在 }
} tips = new JLabel("Tips:使用上、下、左、右键或者W、S、A、D键控制");
tips.setFont(font);
tips.setBounds(60,480,400,20);
mainPane.add(tips); textMaxScores.addKeyListener(new KeyAdapter(){ //为最高分标签添加按键监听器
public void keyPressed( KeyEvent e){
do_label_keyPressed(e); //调用时间处理方法
}
}); Create2();
Create2();
} /**
* 按键输入事件的处理方法
* @param e
*/
protected void do_label_keyPressed(final KeyEvent e){
int code = e.getKeyCode(); //获取按键代码
int a ; //a 的引入是为了防止连加的情况出现
String str ;
String str1;
int num;
switch(code){
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A: //如果按键代码是左方向键或者A键
for(int i = 0; i < 4; i++){
a = 5;
for(int k = 0; k < 3; k++){
for(int j = 1; j < 4; j++){ //遍历16个方块
str = texts[i][j].getText(); //获取当前方块标签文本字符
str1 = texts[i][j-1].getText(); //获取当前左1方块标签文本字符 if(str1.compareTo("") == 0){ //如果左1方块文本为空字符
texts[i][j-1].setText(str); //字符左移
setColor(i, j-1,str);
texts[i][j].setText(""); //当前方块字符置空
setColor(i, j, "");
}else if((str.compareTo(str1) == 0) && (j !=a) && (j != a-1)){ //如果当前方块和左1方块文本字符相等
num = Integer.parseInt(str);
scores += num;
times ++;
str = String.valueOf(2 * num);
texts[i][j-1].setText(str); //左1方块文本字符变为两方块之和
setColor(i, j-1, str);
texts[i][j].setText(""); //当前方块字符置空
setColor(i, j, "");
a = j;
}
}
}
}
l1 = 1; //用于判断游戏是否失败
Create2();
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D:
for(int i = 0; i < 4; i ++){
a = 5;
for(int k = 0; k < 3; k++){
for(int j = 2; j >= 0; j--){
str = texts[i][j].getText();
str1 = texts[i][j + 1].getText(); if(str1.compareTo("") == 0){
texts[i][j + 1].setText(str);
setColor(i, j+1, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && j !=a && j != a+ 1){
num = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i][j + 1].setText(str);
setColor(i, j+1, str);
texts[i][j].setText("");
setColor(i, j, "");
a = j;
}
}
}
}
l2 = 1;
Create2();
break;
case KeyEvent.VK_UP:
case KeyEvent.VK_W:
for(int j = 0; j < 4; j++){
a = 5;
for(int k = 0; k < 3; k++){
for(int i = 1; i < 4; i++){
str = texts[i][j].getText();
str1 = texts[i - 1][j].getText(); if(str1.compareTo("") == 0){
texts[i - 1][j].setText(str);
setColor(i-1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && i != a && i != a -1){
num = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i - 1][j].setText(str);
setColor(i-1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l3 =1;
Create2();
break;
case KeyEvent.VK_DOWN:
case KeyEvent.VK_S:
for(int j = 0; j < 4; j ++){
a = 5;
for(int k = 0; k < 5; k++){
for(int i = 2; i >= 0; i--){
str = texts[i][j].getText();
str1 = texts[i + 1][j].getText(); if(str1.compareTo("") == 0){
texts[i + 1][j].setText(str);
setColor(i+1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && i != a && i != a + 1){
num = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i + 1][j].setText(str );
setColor(i+1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l4 = 1;
Create2();
break;
default:
break;
}
textScores.setText(String.valueOf(scores));
} /**
* 在随机位置产生一个2号方块的方法
* @param i,j
*/
public void Create2(){
int i ,j;
boolean r = false;
String str; if(times > 0){
while(!r){
i = random.nextInt(4);
j = random.nextInt(4);
str = texts[i][j].getText();
if((str.compareTo("") == 0)){
texts[i][j].setIcon(icon2);
texts[i][j].setText("2");
setColor(i, j, "2"); times --;
r = true;
l1 = l2 = l3 = l4 = 0;
}
}
}
else if(l1 >0 && l2 >0 && l3 > 0 && l4 > 0){ //l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败
tips.setText(" GAME OVER !"); }
} /**
* 设置标签颜色
* @param i , j ,str
*/
public void setColor(int i, int j, String str){
switch(str){
case "2":
texts[i][j].setBackground(Color.yellow);
break;
case "4":
texts[i][j].setBackground(Color.red);
break;
case "8":
texts[i][j].setBackground(Color.pink);
break;
case "16":
texts[i][j].setBackground(Color.orange);
break;
case "32":
texts[i][j].setBackground(Color.magenta);
break;
case "64":
texts[i][j].setBackground(Color.LIGHT_GRAY);
break;
case "128":
texts[i][j].setBackground(Color.green);
break;
case "256":
texts[i][j].setBackground(Color.gray);
break;
case "512":
texts[i][j].setBackground(Color.DARK_GRAY);
break;
case "1024":
texts[i][j].setBackground(Color.cyan);
break;
case "2048":
texts[i][j].setBackground(Color.blue);
break;
case "":
case "4096":
texts[i][j].setBackground(Color.white);
break;
default:
break;
} } }
用java实现简易PC版2048的更多相关文章
- 从零開始开发Android版2048 (一)初始化界面
自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学 ...
- vue.js介绍,常用指令,事件,以及制作简易留言版
一.vue是什么? 一个mvvm框架(库).和angular类似,比较容易上手.小巧,让我们的代码更加专注于业务逻辑,而不是去关注DOM操作 二.vue和angular之间的区别 vue--简单易学 ...
- 从零開始开发Android版2048 (三)逻辑推断
近期工作比較忙,所以更新的慢了一点,今天的主要内容是关于Android版2048的逻辑推断,经过本篇的解说,基本上完毕了这个游戏的主体部分. 首先还是看一下,我在实现2048时用到的一些存储的数据结构 ...
- 从零開始开发Android版2048 (二)获取手势信息
今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了Gestu ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- wifi万能钥pc版提示手机未连接
关于PC版万能钥匙的用法 大部分人都是在“未连接到手机”再不知道怎么搞了 怎么连接到手机呢? 首先要把你的手机变成路由器 让电脑连上 这个都知道怎么搞吧 手机版万能钥匙有个一键让手机变成热点 再用电 ...
- 全能直播王PC版-0707-full_codecs
全能直播王是一款高清流畅的全平台的电视直播应用,让您随时随地看高清电视直播. [全能特色] 1. 收录全国1400多个直播频道,包括湖南卫视.江苏卫视.浙江卫视等热门频道. 2. 频道多线路自动选择, ...
- Java部分总结图片版2(已加上原图链接!!!)
Java部分总结图片版2(加上原图链接)
随机推荐
- javascript基础知识show
1.javascript的数据类型是什么 基本数据类型:String,boolean,Number,Undefined,Null 引用数据类型:Object(Array,Date,RegExp,Fun ...
- 使用reflux进行react组件之间的通信
前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...
- 单据UI代码开发
1.构造UI项目后,打开生成的UI项目代码,在Model文件下,如初始化一些字段的值 2.订单明细行中行号设置.订单基本操作按钮提示UFIDA.U9.Base.BaseBP.Agent.dll(代理) ...
- Modernizr.js:为HTML5和CSS3而生!
原文链接:http://caibaojian.com/modernizr-js.html modernizr这个JS,在国外的主题里面很多地方都看到,就只记得是为html补充的,有点类似与respon ...
- 基于注解的Spring AOP的配置和使用
摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...
- 后台启动weblogic成功后,在web浏览器上无法访问
后台启动weblogic成功后,在web浏览器上无法访问,可尝试重启服务器.
- OAM
OAM -- Operation Administration and Maintenance[ˈmentənəns]. 根据运营商网络运营的实际需要,通常将网络的管理工作划分为3大类:操作(Oper ...
- Java中如何获取spring中配置文件.properties中属性值
通过spring配置properties文件 1 2 3 4 5 6 7 8 9 <bean id="propertyConfigurer" class="co ...
- 移动端html模版
<!DOCTYPE html><html><head> <title>时钟</title> <meta charset="u ...
- AJAX第二发
开始总结自己在项目上的使用AJAX的情况: 该图为向后台请求的数据,前台返回的结果,返回的数据类型为object,businessObj由许多key组成,我们项目前台需要调用的数据就藏在数组recor ...