JAVA2048小游戏

来源:互联网 发布:html5 幸运大转盘源码 编辑:程序博客网 时间:2024/05/19 02:41

         前几天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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubstartGame();}});JButton myJButton1 = new JButton("返回主界面");myJButton1.setBounds(310, 400, 100, 30);myJPanel1.add(myJButton1);myJButton1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubcreatNewGame();}});}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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubstartGame();}});JButton myJButton1 = new JButton("退出游戏");myJButton1.setBounds(310,300, 100, 30);myJPanel1.add(myJButton1);myJButton1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubcreatNewGame();}});JButton myJButton1 = new JButton("退出游戏");myJButton1.setBounds(300,300, 100, 30);myJPanel.add(myJButton1);myJButton1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.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 stubnew Game();}}


1 0
原创粉丝点击