package game2048;
import java.awt.event.*;
import javax.swing.*;
public class Operation implements KeyListener {
Block[] block;//用于储存16个数据
JPanel panel;
public boolean up,down,left,right;
int moveFlag;//用于累计移动的次数
boolean numFlag;//用于判断是否还能加入新的数字
public Operation(JFrame frame){
this.panel = (JPanel)frame.getContentPane();//构造出panel
block = new Block[16];//构造出长度为16的数组
numFlag = true;//初始化
moveFlag = 0;
up=true;
down=true;
left=true;
right=true;
addBlock();
for (int i = 0; i < 2; i++)
appearBlock();
frame.addKeyListener(this);
}
private void addBlock(){
//往panel里加入block
for (int i = 0; i < 16; i++) {
block[i] = new Block();
block[i].setHorizontalAlignment(JLabel.CENTER);// 不透明的标签
block[i].setOpaque(true);
panel.add(block[i]);
}
}
public void appearBlock() {
//当还能加入随机的一个新的值得时候
while (numFlag){
int index = (int) (Math.random() * 16);//取一个0到15的随机整数,这个数作为随机加入盘中的2或4的位置
//如果这个数所在的block数组中值为0,即在为空的时候,加入一个2或4的数字
if (block[index].getValue() == 0){
if (Math.random() < 0.5){
block[index].setValue(2);
}
else {
block[index].setValue(4);
}
break;//跳出while
}
}
}
//统计block数组中是否含有值为0的元素,若没有,则numFlag变为false
public void judgeAppear() {
int sum = 0;
for (int i = 0; i < 16; i++) {
if (block[i].getValue() != 0){
sum++;
}
}
if (sum == 16)
numFlag = false;
}
public int Find(int i,int j,int a,int b){
while(i<b&&i>=a){
if(block[i].getValue()!=0){
return i;
}
i=i+j;
}
return -1;
}
public void upBlock(){
int i=0,j=0;
int t=0;
int valueJ=0;
int valueI=0;
int index=0;
for(i=0;i<4;i++){
index=i;
for(j=i+4;j<16;j+=4){
valueJ=0; valueI=0;
if(block[index].getValue()==0){
t=Find(index,4,0,16);
if(t!=-1) {
block[index].setValue(block[t].getValue());
block[t].setValue(0);
}
else {
break;
}
}
valueI=block[index].getValue();
if(block[j].getValue()==0){
t=Find(j,4,0,16);
if(t!=-1){
block[j].setValue(block[t].getValue());
block[t].setValue(0);
}
else {
break;
}
}
valueJ=block[j].getValue();
if(valueI==valueJ&&valueI!=0&&valueJ!=0){
block[index].setValue(valueI+valueJ);
block[j].setValue(0);
numFlag = true;
}
index=j;
}
}
}
public void downBlock() {
int i=0,j=0;
int t=0;
int valueJ=0;
int valueI=0;
int index=0;
for(i=12;i<16;i++) {
index=i;
for(j=i-4;j>=0;j-=4){
valueJ=0; valueI=0;
if(block[index].getValue()==0) {
t=Find(index,-4,0,16);
if(t!=-1){
block[index].setValue(block[t].getValue());
block[t].setValue(0);
}
else {
break;
}
}
valueI=block[index].getValue();
if(block[j].getValue()==0) {
t=Find(j,-4,0,16);
if(t!=-1){
block[j].setValue(block[t].getValue());
block[t].setValue(0);
}
else {
break;
}
}
valueJ=block[j].getValue();
if(valueI==valueJ&&valueI!=0&&valueJ!=0){
block[index].setValue(valueI+valueJ);
block[j].setValue(0);
numFlag = true;
}
index=j;
}
}
}
public void rightBlock(){
int i=0,j=0;
int t=0;
int valueJ=0;
int valueI=0;
int index=0;
for(i=3;i<16;i+=4){
index=i;
for(j=i-1;j>i-4;j--){
valueJ=0; valueI=0;
if(block[index].getValue()==0) {
t=Find(index,-1,i-3,index+1);
if(t!=-1){
block[index].setValue(block[t].getValue());
block[t].setValue(0);
}
else{
break;
}
}
valueI=block[index].getValue();
if(block[j].getValue()==0) {
t=Find(j,-1,i-3,j+1);
if(t!=-1){
block[j].setValue(block[t].getValue());
block[t].setValue(0);
}
else {
break;
}
}
valueJ=block[j].getValue();
if(valueI==valueJ&&valueI!=0&&valueJ!=0){
block[index].setValue(valueI+valueJ);
block[j].setValue(0);
numFlag = true;
}
index=j;
}
}
}
public void leftBlock(){
int i=0,j=0;
int t=0;
int valueJ=0;
int valueI=0;
int index=0;
for(i=0;i<16;i+=4) {
index=i;
for(j=i+1;j<i+4;j++){
valueJ=0; valueI=0;
if(block[index].getValue()==0){
t=Find(index,1,index,i+4);
if(t!=-1){
block[index].setValue(block[t].getValue());
block[t].setValue(0);
}
else {
break;
}
}
valueI=block[index].getValue();
if(block[j].getValue()==0) {
t=Find(j,1,j,i+4);
if(t!=-1) {
block[j].setValue(block[t].getValue());
block[t].setValue(0);
}
else{
break;
}
}
valueJ=block[j].getValue();
if(valueI==valueJ&&valueI!=0&&valueJ!=0){
block[index].setValue(valueI+valueJ);
block[j].setValue(0);
numFlag = true;
}
index=j;
}
}
}
public void over(){
//当不能添加元素,并且不可移动的步数超过36就输了,输了的时候在盘中央显示GAMEOVER
if (numFlag ==false&& up==false&&down==false
&&left==false&&right==false){
block[4].setText("G");
block[5].setText("A");
block[6].setText("M");
block[7].setText("E");
block[8].setText("O");
block[9].setText("V");
block[10].setText("E");
block[11].setText("R");
block[11].addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e){
reStart();
}
});
}
}
//同OVER
public void win() {
block[0].setText("Y");
block[1].setText("O");
block[2].setText("U");
block[13].setText("W");
block[14].setText("I");
block[15].setText("N");
block[15].addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
reStart();
}
});
}
//重启游戏,和构造函数类似,不在累述
public void reStart(){
numFlag=true;
moveFlag=0;
up=true;
down=true;
left=true;
right=true;
for(int i=0;i<16;i++)
block[i].setValue(0);
for (int i = 0; i < 2; i++)
appearBlock();
}
//判断按的上下左右键,并依次调用移动函数、判断函数、添加函数、判断是否输掉的函数
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
if(up){
upBlock();
}
judgeAppear();
appearBlock();
over();
if(numFlag==false) {
up=false;
}
else{
up=true;
down=true;
left=true;
right=true;
}
break;
case KeyEvent.VK_DOWN:
if(down){
downBlock();
}
judgeAppear();
appearBlock();
over();
if(numFlag==false) {
down=false;
}
else {
up=true;down=true;left=true;right=true;
}
break;
case KeyEvent.VK_LEFT:
if(left){
leftBlock();
}
judgeAppear();
appearBlock();
over();
if(numFlag==false){
left=false;
}
else {
up=true;
down=true;
left=true;
right=true;
}
break;
case KeyEvent.VK_RIGHT:
if(right){
rightBlock();
}
judgeAppear();
appearBlock();
over();
if(numFlag==false) {
right=false;
}
else {
up=true;
down=true;
left=
没有合适的资源?快使用搜索试试~ 我知道了~
2048小游戏,Java,Swing.zip
共15个文件
class:5个
java:3个
jar:2个
0 下载量 148 浏览量
2023-09-08
17:06:46
上传
评论
收藏 3MB ZIP 举报
温馨提示
Java写的小游戏,项目可以直接运行,欢迎下载学习。
资源推荐
资源详情
资源评论
收起资源包目录
2048小游戏,Java,Swing.zip (15个子文件)
63
.classpath 393B
.settings
org.eclipse.jdt.core.prefs 587B
.gitattributes 378B
src
game2048
Block.java 2KB
Operation.java 8KB
My2048.java 1KB
libs
substance.jar 1.66MB
bin
substance.jar 1.66MB
game2048
Block.class 2KB
Operation.class 6KB
Operation$1.class 645B
Operation$2.class 644B
My2048.class 1KB
.project 367B
.gitignore 649B
共 15 条
- 1
资源评论
c++服务器开发
- 粉丝: 3045
- 资源: 4463
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功