欢迎访问我的个人博客 https://jialaner.cn/ 

展示一下窗口界面,最为一个窗口程序,友好的界面让人耳目一新。

    Java2048朝代版-编程知识网       Java2048朝代版-编程知识网      Java2048朝代版-编程知识网

 

学习了一学期的Java语言,学校的实训内容是要做一个窗口游戏,2048朝代版。整个游戏没有什么难度,唯一有难度的也就是算法方面了,不断进行着清空格、合并的重复操作。我的游戏思路很简单,通过键盘操作一个二维数组,界面根据二维数组进行不断的重画 ,就是这么简单。直接上代码,如果有想要源代码即图片,请通过主页下载。

WindowView类:

public class WindowView extends JFrame{private static final long serialVersionUID = 1L;//游戏状态public static boolean gameState = false;//游戏分数public static int gameScore = 0;//窗体大小     9a866dpublic static final int VIEW_WIDTH = 520;public static final int VIEW_HEIGHT = 800;//面板显示private GamePanel gamePanel = new GamePanel();private WelcomPanel welcomPanel = new WelcomPanel(gamePanel);public static void main(String[] args) {new WindowView().init();}//public void init() {this.setSize(VIEW_WIDTH, VIEW_HEIGHT);this.setLayout(null);this.setResizable(false);this.setLocationRelativeTo(null); //this.setUndecorated(true);this.addKeyListener(new KeyControl(gamePanel.arithmetic));this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.add(gamePanel);gamePanel.setVisible(false);this.add(welcomPanel);this.setVisible(true);}}

WelcomPanel类:

public class WelcomPanel extends JPanel{private static final long serialVersionUID = 1L;//面板大小private final int VIEW_WIDTH = WindowView.VIEW_WIDTH;private final int VIEW_HEIGHT = WindowView.VIEW_HEIGHT;//控件大小private final int JL_WIDTH = 200;private final int JL_HEIGHT = 50;//控件实例化private JLabel background = new JLabel(new ImageIcon("img/hello.png"));private ImageIcon start1 = new ImageIcon("img/开始游戏.png");private ImageIcon start2 = new ImageIcon("img/开始游戏经过.png");private JLabel start = new JLabel(start1);private ImageIcon record1 = new ImageIcon("img/最高纪录.png");private ImageIcon record2 = new ImageIcon("img/最高纪录经过.png");private JLabel record  = new JLabel(record1);private ImageIcon about1 = new ImageIcon("img/关于游戏.png");private ImageIcon about2 = new ImageIcon("img/关于游戏经过.png");private JLabel about  = new JLabel(about1);private ImageIcon exit1 = new ImageIcon("img/退出游戏.png");private ImageIcon exit2 = new ImageIcon("img/退出游戏经过.png");private JLabel exit = new JLabel(exit1);//实例化鼠标监听器private JLableListener JLableListener = new JLableListener(this);private GamePanel gamePanel;//构造器public WelcomPanel(GamePanel gamePanel) {this.gamePanel = gamePanel;this.init();}//面板属性设置public void init() {this.setLayout(null);this.setBounds(0, 0, VIEW_WIDTH, VIEW_HEIGHT);start.setBounds((VIEW_WIDTH - JL_WIDTH)/2, VIEW_HEIGHT - 9 * JL_HEIGHT, JL_WIDTH, JL_HEIGHT);start.addMouseListener(JLableListener);this.add(start);record.setBounds((VIEW_WIDTH - JL_WIDTH)/2, VIEW_HEIGHT - 7 * JL_HEIGHT, JL_WIDTH, JL_HEIGHT);record.addMouseListener(JLableListener);this.add(record);about.setBounds((VIEW_WIDTH - JL_WIDTH)/2, VIEW_HEIGHT - 5 * JL_HEIGHT, JL_WIDTH, JL_HEIGHT);about.addMouseListener(JLableListener);this.add(about);exit.setBounds((VIEW_WIDTH - JL_WIDTH)/2, VIEW_HEIGHT - 3 * JL_HEIGHT, JL_WIDTH, JL_HEIGHT);exit.addMouseListener(JLableListener);this.add(exit);background.setBounds( 0, 0, VIEW_WIDTH, VIEW_HEIGHT);this.add(background);}//匿名内部鼠标监听器private class JLableListener implements MouseListener{private WelcomPanel welcomPanel;public JLableListener(WelcomPanel welcomPanel) {this.welcomPanel = welcomPanel;}//点击并释放public void mouseClicked(MouseEvent e) {if(e.getSource() == start) {welcomPanel.removeAll();gamePanel.setVisible(true);WindowView.gameState = true;}else if(e.getSource() == record) {new Record();}else if(e.getSource() == about) {new AboutView();}else if(e.getSource() == exit) {System.exit(0);}}//鼠标进入调用public void mouseEntered(MouseEvent e) {if(e.getSource() == start) {start.setIcon(start2);}else if(e.getSource() == record) {record.setIcon(record2);}else if(e.getSource() == about) {about.setIcon(about2);}else if(e.getSource() == exit) {exit.setIcon(exit2);}}//离开时调用public void mouseExited(MouseEvent e) {if(e.getSource() == start) {start.setIcon(start1);}else if(e.getSource() == record) {record.setIcon(record1);}else if(e.getSource() == about) {about.setIcon(about1);}else if(e.getSource() == exit) {exit.setIcon(exit1);}}//按下调用public void mousePressed(MouseEvent e) {}//释放调用public void mouseReleased(MouseEvent e) {}}}

Record类:

public class Record extends JFrame{//面板大小private final int VIEW_HEIGHT = 400;private final int VIEW_WIDTH = 300;//面板背景图private JLabel background = new JLabel(new ImageIcon("img/排行.png"));private ImageIcon back1 = new ImageIcon("img/未标题-2.png");private ImageIcon back2 = new ImageIcon("img/未标题-4.png");private JLabel back = new JLabel(back1);private JLabel score = new JLabel("",JLabel.CENTER);//本类的对象用于内部类使用private Record record = this;//构造器public Record() {this.init();score.setText(GamePanel.mostScore);}//面板属性public void init() {this.setSize(VIEW_WIDTH, VIEW_HEIGHT);this.setLayout(null);this.setResizable(false);this.setUndecorated(true);this.setLocationRelativeTo(null); this.setBackground(new Color(0, 0, 0, 0));score.setFont(new Font("微软雅黑", 1, 30));score.setForeground(new Color(154,134,109));score.setBounds(VIEW_WIDTH-125, 20, 100, 100);score.setBounds(0,0, VIEW_WIDTH, VIEW_HEIGHT);this.add(score);back.setBounds(VIEW_WIDTH - 50,20, 30, 30);back.addMouseListener(new MouseListener() {public void mouseClicked(MouseEvent e) {record.dispose();}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {back.setIcon(back2);}public void mouseExited(MouseEvent e) {back.setIcon(back1);}});this.add(back);background.setBounds(0, 0, VIEW_WIDTH, VIEW_HEIGHT);this.add(background);this.setVisible(true);}private File file;public void readFile() {file = new File("d:\\score.txt");FileInputStream in = null;try {in = new FileInputStream(file);byte byt[] = new byte[1024];int len = in.read(byt);GamePanel.mostScore = new String(byt, 0, len);this.score.setText(new String(byt, 0, len));}catch(Exception e) {e.printStackTrace();}finally {try {if(in != null) in.close();}catch(IOException e) {e.printStackTrace();}}}
}

PaintPanel类:

public class PaintPanel extends JPanel{private static final long serialVersionUID = 1L;private Toolkit kit = Toolkit.getDefaultToolkit(); //位图private Image ImageBuffer = null;  private Graphics GraImage = null; //面板大小public final int VIEW_WIDTH = 500;public final int VIEW_HEIGHT = 500;//背景private Image background = kit.getImage("img/gamebackground.png");//创建算法类引用对象private Arithmetic arithmetic;private PaintPanel paintPanel = this;//构造器public PaintPanel(Arithmetic arithmetic) {new Thread() {public void run(){while(true) {paintPanel.repaint();	}}}.start();this.arithmetic = arithmetic;}//画图public void paint(Graphics g) {g.drawImage(background, 0, 0, VIEW_WIDTH, VIEW_HEIGHT, this);this.drawImg(g);}//双缓冲解决游戏闪烁的问题public void update(Graphics g) {//创建图形缓冲区  ImageBuffer = createImage(VIEW_WIDTH, VIEW_HEIGHT);   //获取图形缓冲区的图形上下文  GraImage = ImageBuffer.getGraphics();    //用paint方法中编写的绘图过程对图形缓冲区绘图  paint(GraImage);     //释放图形上下文资源  GraImage.dispose();     //将图形缓冲区绘制到屏幕上  g.drawImage(ImageBuffer, 0, 0, this);  }//私有方法实现画格private void drawImg(Graphics g) {for(int i = 0; i < arithmetic.getData().length; i++) {for(int n = 0; n < arithmetic.getData()[i].length; n++) {switch(arithmetic.getData()[i][n]) {case 0:g.drawImage(kit.getImage("img/空.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 1:g.drawImage(kit.getImage("img/夏.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 2:g.drawImage(kit.getImage("img/商.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 4:g.drawImage(kit.getImage("img/周.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 8:g.drawImage(kit.getImage("img/秦.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 16:g.drawImage(kit.getImage("img/汉.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 32:g.drawImage(kit.getImage("img/三国.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 64:g.drawImage(kit.getImage("img/晋.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 128:g.drawImage(kit.getImage("img/南北朝.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 256:g.drawImage(kit.getImage("img/隋.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 512:g.drawImage(kit.getImage("img/唐.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 1024:g.drawImage(kit.getImage("img/五代.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 2048:g.drawImage(kit.getImage("img/辽.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 4096:g.drawImage(kit.getImage("img/宋.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 8192:g.drawImage(kit.getImage("img/金.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 16384:g.drawImage(kit.getImage("img/元.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 32768:g.drawImage(kit.getImage("img/明.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;case 65536:g.drawImage(kit.getImage("img/清.png"), i*100+(i+1)*20, n*100+(n+1)*20, this);break;}}}}
}

Hint类:

public class Hint extends JFrame{//面板大小private final int VIEW_HEIGHT = 400;private final int VIEW_WIDTH = 300;//面板背景图private JLabel background = new JLabel(new ImageIcon("img/排行.png"));//重新开始按钮private ImageIcon start1 = new ImageIcon("img/重新开始.png");private ImageIcon start2 = new ImageIcon("img/重新开始2.png");private JLabel start = new JLabel(start1);//退出按钮private ImageIcon exit1 = new ImageIcon("img/退出1.png");private ImageIcon exit2 = new ImageIcon("img/退.png");private JLabel exit = new JLabel(exit1);//本类的对象用于内部类使用private Hint hint = this;//鼠标监听事件private Mouse mouse = new Mouse();//创建 对象Arithmetic arithmetic;//构造器public Hint(Arithmetic arithmetic) {this.arithmetic = arithmetic;this.init();this.writeScore();}//面板属性public void init() {this.setSize(VIEW_WIDTH, VIEW_HEIGHT);this.setLayout(null);this.setResizable(false);this.setUndecorated(true);this.setLocationRelativeTo(null); this.setBackground(new Color(0, 0, 0, 0));this.addMouseListener(mouse);start.setBounds((VIEW_WIDTH - 150)/2, 160, 150, 40);start.addMouseListener(mouse);this.add(start);exit.setBounds((VIEW_WIDTH - 150)/2, 230, 150, 40);exit.addMouseListener(mouse);this.add(exit);background.setBounds(0, 0, VIEW_WIDTH, VIEW_HEIGHT);this.add(background);this.setVisible(true);}private File file;public void writeScore() {file = new File("d:\\score.txt");FileOutputStream out = null;try {out = new FileOutputStream(file);byte buy[] =(""+WindowView.gameScore).getBytes();out.write(buy);}catch(Exception e){e.printStackTrace();}finally {try {if(out != null) out.close();}catch(IOException e) {e.printStackTrace();}}}//鼠标监听事件内部类private class Mouse implements MouseListener {private Random random = new Random();public void mouseClicked(MouseEvent e) {if(e.getSource() == start) {//清空数组信息for(int i = 0; i < 4; i++) {for(int j = 0; j < 4; j++) {arithmetic.getData()[i][j] = 0;}}WindowView.gameScore = 0;arithmetic.getData()[random.nextInt(3)][random.nextInt(3)] = 1;WindowView.gameState = true;//释放当前窗口资源hint.dispose();}else if(e.getSource() == exit){//结束程序进程System.exit(0);}}//按下调用public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {if(e.getSource() == start) {start.setIcon(start2);}else if(e.getSource() == exit){exit.setIcon(exit2);}}public void mouseExited(MouseEvent e) {if(e.getSource() == start) {start.setIcon(start1);}else if(e.getSource() == exit){exit.setIcon(exit1);}}}}

GamePanel类:

public class GamePanel extends JPanel {private static final long serialVersionUID = 1L;//面板大小private final int VIEW_WIDTH = WindowView.VIEW_WIDTH;private final int VIEW_HEIGHT = WindowView.VIEW_HEIGHT;//全局颜色private final Color COLOR_BACKGROUND = new Color(154,134,109);//面板顶部控件private JLabel title = new JLabel(new ImageIcon("img/topBackgtound.png"));//显示分数控件public static JLabel score = new JLabel(WindowView.gameScore + "",JLabel.CENTER);//最高分数public static String mostScore = "";//算法类public Arithmetic arithmetic = new Arithmetic();//画板实例化public PaintPanel paintPanel = new PaintPanel(arithmetic);private JLabel newGame= new JLabel(new ImageIcon("img/重玩1.png"));//构造器public GamePanel() {this.init();}//面板属性设置public void init() {this.setLayout(null);this.setBackground(COLOR_BACKGROUND);this.setBounds(0, 0, VIEW_WIDTH, VIEW_HEIGHT);this.setBackground(new Color(255,239,213));score.setFont(new Font("微软雅黑", 1, 30));score.setForeground(new Color(154,134,109));score.setBounds(VIEW_WIDTH-125, 20, 100, 100);this.add(score);title.setBounds(0, 0, VIEW_WIDTH, 150);this.add(title);paintPanel.setBounds(10, 170, paintPanel.VIEW_WIDTH, paintPanel.VIEW_HEIGHT);this.add(paintPanel);newGame.setBounds(10, paintPanel.getY()+paintPanel.getHeight()+20, 70, 40);this.add(newGame);}}

AboutView类:

public class AboutView extends JFrame{private final int VIEW_HEIGHT = 400;private final int VIEW_WIDTH = 550;private JLabel background = new JLabel(new ImageIcon("img/关于弹窗.png"));private ImageIcon back1 = new ImageIcon("img/未标题-2.png");private ImageIcon back2 = new ImageIcon("img/未标题-4.png");private JLabel back = new JLabel(back1);private AboutView aboutView = this;public AboutView() {this.init();}public void init() {this.setSize(VIEW_WIDTH, VIEW_HEIGHT);this.setLayout(null);this.setResizable(false);this.setUndecorated(true);this.setLocationRelativeTo(null); this.setBackground(new Color(0, 0, 0, 0));back.setBounds(VIEW_WIDTH - 50,20, 30, 30);back.addMouseListener(new MouseListener() {public void mouseClicked(MouseEvent e) {aboutView.dispose();}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {back.setIcon(back2);}public void mouseExited(MouseEvent e) {back.setIcon(back1);}});this.add(back);background.setBounds(0, 0, VIEW_WIDTH, VIEW_HEIGHT);this.add(background);this.setVisible(true);}}

KeyControl类:

public class KeyControl implements KeyListener{private Arithmetic arithmetic;public KeyControl(Arithmetic arithmetic) {this.arithmetic = arithmetic;}public void keyTyped(KeyEvent e) {}public void keyPressed(KeyEvent e) {if(WindowView.gameState) {switch(e.getKeyCode()) {case KeyEvent.VK_RIGHT:arithmetic.moveRight();break;case KeyEvent.VK_DOWN:arithmetic.moveDown();break;case KeyEvent.VK_LEFT:arithmetic.moveLeft();break;case KeyEvent.VK_UP:arithmetic.moveUp();break;}GamePanel.score.setText(""+WindowView.gameScore);}}public void keyReleased(KeyEvent e) {}}

Arithmetic类:

public class Arithmetic {//产生随机数private Random random = new Random();//表示地图的二维数组private int data[][] = new int[4][4]; //构造器public Arithmetic() {this.newNumber();}//初始化数组数据public void newNumber() {int x;int y;int num = 0;for(int i=0;i<4;i++){  for(int j=0;j<4;j++){  if(data[i][j] == 0) {num++;}}}if(num == 0) {WindowView.gameState = false;new Hint(this);return;}while(true) {x = random.nextInt(4);y = random.nextInt(4);if(data[x][y] == 0) {if(random.nextInt(5) == 1) {data[x][y] = 2;}else {data[x][y] = 1;}break;}}}// 左移public void moveUp(){for(int i=0;i<4;i++){  for(int j=0;j<3;j++){  if(data[i][j] == data[i][j+1]){data[i][j] += data[i][j+1];data[i][j+1] = 0 ;WindowView.gameScore++;}clearUp();}}newNumber();}// 清除左边的0public void clearUp(){for(int i = 0 ; i < 4 ; i++){for(int j = 0 ; j < 4  ; j++){for(int k = j ; k >= 0 ; k-- ){if(data[i][j]!= 0 && data[i][k] == 0){data[i][k] = data[i][j];data[i][j] = 0 ;}}}}}// 右移public void moveDown(){for(int i=0;i<4;i++){  for(int j=0;j<3;j++){  if(data[i][j] == data[i][j+1]){data[i][j+1] += data[i][j];data[i][j] = 0 ;WindowView.gameScore++;}clearDown();}}newNumber();}// 清除右边的0public void clearDown(){for(int i = 0 ; i < 4 ; i++){for(int j = 3 ; j >= 0  ; j-- ){for(int k = j ; k < 4  ; k++ ){if(data[i][j]!= 0 && data[i][k] == 0){data[i][k] = data[i][j];data[i][j] = 0 ;}}}}}// 上移public void moveLeft(){for(int j=0;j<4;j++){  for(int i=0;i<3;i++){  if(data[i][j] == data[i+1][j]){data[i][j] += data[i+1][j];data[i+1][j] = 0 ;WindowView.gameScore++;}clearLeft();}}newNumber();}   // 清除上方的0public void clearLeft(){for(int j = 0 ; j < 4 ; j++){for(int i = 0 ; i <4  ; i++){for(int k = i ; k >=0  ; k-- ){if(data[i][j]!= 0 && data[k][j] == 0){data[k][j] = data[i][j];data[i][j] = 0 ;}}}}}// 下移public void moveRight (){for(int j=0;j<4;j++){  for(int i=3;i>0;i--){  if(data[i][j] == data[i-1][j]){data[i][j] += data[i-1][j];data[i-1][j] = 0 ;WindowView.gameScore++;}clearRight();}}newNumber();}  // 清除下方的0public void clearRight(){for(int j = 0 ; j < 4 ; j++){for(int i = 3 ; i >= 0 ; i--){for(int k = i ; k < 4 ; k++ ){if(data[i][j]!= 0 && data[k][j] == 0){data[k][j] = data[i][j];data[i][j] = 0 ;}}}}}  //访问器public int[][] getData() {return data;}public void setData(int data[][]) {this.data = data;}	
}