JAVA2048小游戏

         前几天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();
	}
}


  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值