您的位置:首页 > 编程语言 > Java开发

JAVA2048小游戏

2016-06-22 14:14 656 查看
       
 前几天JAVA 上机课的的实验内容是JAVA的GUI当时做了一个小的窗口界面感觉挺有意思的,然后想到前几天的C++作业使用C++和cocos-2d写一个游戏,当时学网上的视频写了一个2048。然后就寻思着能不能直接用JAVA来写。然后就心血来潮的想着写一下。顺便就当做JAVA课的最后的课程设计吧。(欢迎指出游戏中可能出现的bug和不足)


用的开发工具MyEclipse2014 JDK版本:1.8.0_91;

import java.awt.*;
import java.awt.dnd.Autoscroll;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;
import javax.swing.Box.Filler;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

import java.util.*;
import java.math.*;
import java.lang.*;
import java.lang.reflect.Array;

class card extends JLabel{

private int numbers;

public card(){
setHorizontalAlignment(SwingConstants.CENTER);
setBorder(new EtchedBorder(EtchedBorder.LOWERED, Color.black, null));
setOpaque(true);
setBackground(new Color(204, 192, 178));
setForeground(Color.white);
}

public int getNum(){
return numbers;
}

public void setNumber(int num){
numbers= num;
if(numbers==0){
this.setText("");
setBackground(new Color(204, 192, 178));
}
else if(numbers==2){
this.setText("2");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 60));
setForeground(new Color(121, 111, 101));
setBackground(new Color(238, 228, 218));
}
else if(numbers==4){
this.setText("4");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 60));
setForeground(new Color(121, 111, 101));
setBackground(new Color(236, 224, 200));
}
else if(numbers==8){
this.setText("8");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 60));
setBackground(new Color(242, 177, 121));
setForeground(Color.white);
}
else if(numbers==16){
this.setText("16");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 50));
setBackground(new Color(245, 149, 99));
setForeground(Color.white);
}
else if(numbers==32){
this.setText("32");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 50));
setBackground(new Color(243, 124, 94));
setForeground(Color.white);
}
else if(numbers==64){
this.setText("64");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 50));
setBackground(new Color(246, 93, 59));
setForeground(Color.white);
}
else if(numbers==128){
this.setText("128");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 40));
setBackground(new Color(237, 204, 97));
setForeground(Color.white);
}
else if(numbers==256){
this.setText("256");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 40));
setBackground(new Color(205, 92, 92));
setForeground(Color.white);
}
else if(numbers==512){
this.setText("512");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 40));
setBackground(new Color(205, 85, 00));
setForeground(Color.white);
}
else if(numbers==1024){
this.setText("1024");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 30));
setBackground(new Color(238,201, 0));
setForeground(Color.white);
}
else if(numbers==2048){
this.setText("2048");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 30));
setBackground(new Color(255, 30, 30));
setForeground(Color.white);
}
else if(numbers==4096){
this.setText("4096");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 30));
setBackground(new Color(0, 238, 76));
setForeground(Color.white);
}
else if(numbers==8192){
this.setText("8192");
setFont(new Font("HirakakuProN-W6", Font.BOLD, 30));
setBackground(new Color(0,229,238));
setForeground(Color.white);
}
else if(numbers>8192){
String[] options={"退出游戏"};
int response = JOptionPane.showOptionDialog(null, "你简直太厉害了这个游戏太简单了不适合您请单击退出游戏", "游戏结束", JOptionPane.OK_OPTION, JOptionPane.OK_OPTION, null, options, null);
if(response==0){
System.exit(0);
}
}
}
}

class Game extends JFrame{
public int Score;
public JLabel jLabel = new JLabel();
private card[][] cards = new card[5][5];

final public void left(){
boolean Merge = false;
for(int x=0;x<4;++x){
for(int y=0;y<4;++y){
for(int k=y+1;k<4;++k){
if(cards[x][k].getNum()!=0){
if(cards[x][y].getNum()==0){
cards[x][y].setNumber(cards[x][k].getNum());
cards[x][k].setNumber(0);
y--;Merge = true;
}
else if(cards[x][y].getNum()==cards[x][k].getNum()){
cards[x][y].setNumber(cards[x][k].getNum()*2);
cards[x][k].setNumber(0);
Score+=cards[x][y].getNum();
jLabel.setText("Score:" + String.valueOf(Score));
Merge=true;
}
break;
}
}
}
}
if(Merge){
autoCreateCard();
}
}

final public void right(){
boolean Merge=false;
for(int x=0;x<4;++x){
for(int y=3;y>=0;--y){
for(int k=y-1;k>=0;--k){
if(cards[x][k].getNum()!=0){
if(cards[x][y].getNum()==0){
cards[x][y].setNumber(cards[x][k].getNum());
cards[x][k].setNumber(0);
y++;Merge=true;
}
else if(cards[x][y].getNum()==cards[x][k].getNum()){
cards[x][y].setNumber(cards[x][k].getNum()*2);
cards[x][k].setNumber(0);
Score+=cards[x][y].getNum();
jLabel.setText("Score:" + String.valueOf(Score));
Merge=true;
}
break;
}
}
}
}
if(Merge){
autoCreateCard();
}
}

final public void up(){
boolean Merge=false;
for(int y=0;y<4;++y){
for(int x=0;x<4;++x){
for(int k=x+1;k<4;++k){
if(cards[k][y].getNum()!=0){
if(cards[x][y].getNum()==0){
cards[x][y].setNumber(cards[k][y].getNum());
cards[k][y].setNumber(0);
x--;Merge=true;
}
else if(cards[x][y].getNum()==cards[k][y].getNum()){
cards[x][y].setNumber(cards[k][y].getNum()*2);
cards[k][y].setNumber(0);
Score+=cards[x][y].getNum();
jLabel.setText("Score:" + String.valueOf(Score));
Merge=true;
}
break;
}
}
}
}
if(Merge){
autoCreateCard();
}
}

final public void down(){
boolean Merge= false;
for(int y=0;y<4;++y){
for(int x=3;x>=0;--x){
for(int k=x-1;k>=0;--k){
if(cards[k][y].getNum()!=0){
if(cards[x][y].getNum()==0){
cards[x][y].setNumber(cards[k][y].getNum());
cards[k][y].setNumber(0);
x++;Merge=true;
}
else if(cards[x][y].getNum()==cards[k][y].getNum()){
cards[x][y].setNumber(cards[k][y].getNum()*2);
cards[k][y].setNumber(0);
Score+=cards[x][y].getNum();
jLabel.setText("Score:" + String.valueOf(Score));
Merge=true;
}
break;
}
}
}
}
if(Merge){
autoCreateCard();
}
}

public void autoCreateCard(){
Random ran = new Random();
int x = ran.nextInt(4);
int y = ran.nextInt(4);
if (cards[x][y].getNum()> 0){
autoCreateCard();
}
else {
cards[x][y].setNumber(ran.nextInt(2)< 1 ? 2 : 4);
}
}

public void startGame(){
Score=0;
JPanel myJPanel1 = new JPanel();
myJPanel1.setLayout(null);
myJPanel1.setBackground(new Color(187, 173, 160));
this.setContentPane(myJPanel1);
jLabel.setBounds(200,5,290,40);
jLabel.setText("Score:" + String.valueOf(Score));
jLabel.setFont(new Font("HirakakuProN-W6", Font.PLAIN, 20));
myJPanel1.add(jLabel);
for(int i=0;i<4;++i){
for(int j=0;j<4;++j){
cards[i][j] = new card();
cards[i][j].setBounds(75+j*85,40+i*85,80,80);
cards[i][j].setNumber(0);
myJPanel1.add(cards[i][j]);
}
}
autoCreateCard();
autoCreateCard();
this.setVisible(true);
myJPanel1.requestFocus();
myJPanel1.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
checkGameEnd();
if(e.getKeyChar()=='w'||e.getKeyCode()==KeyEvent.VK_UP){
up();
}
else if(e.getKeyChar()=='a'||e.getKeyCode()==KeyEvent.VK_LEFT){
left();

}
else if(e.getKeyChar()=='d'||e.getKeyCode()==KeyEvent.VK_RIGHT){
right();
}
else if(e.getKeyChar()=='s'||e.getKeyCode()==KeyEvent.VK_DOWN){
down();
}
}
});
JButton myJButton = new JButton("重新开始");
myJButton.setBounds(75, 400, 100, 30);
myJPanel1.add(myJButton);
myJButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
startGame();
}
});
JButton myJButton1 = new JButton("返回主界面");
myJButton1.setBounds(310, 400, 100, 30);
myJPanel1.add(myJButton1);
myJButton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
creatNewGame();
}
});
}

public void creatNewGame(){
JPanel myJPanel1 = new JPanel();
myJPanel1.setLayout(null);
this.setContentPane(myJPanel1);
JLabel myJLabel = new JLabel();
myJLabel.setBounds(50, 50, 400, 200);
myJLabel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, Color.CYAN, null));
myJPanel1.add(myJLabel);
myJLabel.setFont(new Font("HirakakuProN-W6", Font.PLAIN, 16));
String string="<html><body><h2 align=center>2048游戏说明</h2>1.游戏刚开始时方格内将会出现2或者4这两个小数字。<br/>2.通过方向键或wsda键(提示:如果使用wsda键请切换为英文输入法)移动出现的数字所有的数字向移动放靠拢。<br/>3.划出的空白块将随机产生一个数字。<br/>4.相同的数字相撞时会合并为数字的二倍。<br/></body></html>";
myJLabel.setText(string);
JButton myJButton = new JButton("开始游戏");
myJButton.setBounds(60, 300, 100, 30);
myJPanel1.add(myJButton);
myJButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
startGame();
}
});
JButton myJButton1 = new JButton("退出游戏");
myJButton1.setBounds(310,300, 100, 30);
myJPanel1.add(myJButton1);
myJButton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
this.setVisible(true);
}

public Game(){
this.setTitle("2048游戏");
this.setBounds(300, 150, 500, 480);
JPanel myJPanel = new JPanel();
myJPanel.setLayout(null);
this.setContentPane(myJPanel);
JLabel myJLabel = new JLabel("欢迎玩2048游戏");
myJLabel.setBounds(120,100,300,50);
myJLabel.setFont(new Font("HirakakuProN-W6", Font.BOLD, 30));
myJLabel.setForeground(Color.BLUE);
myJPanel.add(myJLabel);
JButton myJButton = new JButton("进入游戏");
myJButton.setBounds(50, 300, 100, 30);
myJPanel.add(myJButton);
myJButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
creatNewGame();
}
});
JButton myJButton1 = new JButton("退出游戏");
myJButton1.setBounds(300,300, 100, 30);
myJPanel.add(myJButton1);
myJButton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
this.setVisible(true);
}

public void checkGameEnd(){
boolean isGameOver = true;
for(int x=0;x<4;++x){
for(int y=0;y<4;++y){
if(cards[x][y].getNum()==0||
(x>0&&cards[x][y].getNum()==cards[x-1][y].getNum())||
(x<3&&cards[x][y].getNum()==cards[x+1][y].getNum())||
(y>0&&cards[x][y].getNum()==cards[x][y-1].getNum())||
(y<3&&cards[x][y].getNum()==cards[x][y+1].getNum())){
isGameOver=false;
}
}
}
if(isGameOver)gameEnd();
}

public void gameEnd(){
String[] options={"重新开始","退出游戏"};
int response = JOptionPane.showOptionDialog(null, "游戏结束是否继续", "游戏结束", JOptionPane.OK_OPTION, JOptionPane.OK_OPTION, null, options, null);
if(response==0){
creatNewGame();
}
else {
System.exit(0);
}
}

}

public class MyGame {

public static void main(String[] args) {
// TODO Auto-generated method stub
new Game();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA2048小游戏