第一步是創建項目 項目名自擬
第二部創建個包名 來規范class ?
然后是創建類 ?創建一個代碼類 和一個運行類?
代碼如下:
package heima;
?
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
?
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.border.BevelBorder;
?
public class GameJFrame ?extends JFrame implements KeyListener,ActionListener{
?? ?//GameJFrame這個界面表示的就是 游戲的主界面
?? ?//以后跟游戲相關的所有邏輯都寫在這個類中
?? ?
?? ?//創建一個二維數組
?? ?//目的:用來管理數據
?? ?//加載圖片的時候,會根據二維數組中的數據來進行加載
?? ?int[][] data =new int[4][4];
?? ?//記錄空白方塊在二維數組中的位置
?? ?int x=0;
?? ?int y=0;
?? ?//定義一個變量,記錄當前展示圖片的路徑
?? ?String path = "D:\\學習資料\\Java\\拼圖小游戲\\image\\animal\\animal1\\";
?? ?//定義一個二維數組 ?存儲一個正確的數據
?? ?int[][] win= {
?? ??? ??? ?{1,2,3,4},
?? ??? ??? ?{5,6,7,8},
?? ??? ??? ?{9,10,11,12},
?? ??? ??? ?{13,14,15,16},
?? ?};
?? ?//定義變量來統計部署
?? ?int step = 0 ;
?? ?
?? ? //創建項目下面的條目對象
?? ? JMenuItem replayItem =new JMenuItem("重新游戲");
?? ? JMenuItem reLoginItem =new JMenuItem("重新登錄");
?? ? JMenuItem closeItem =new JMenuItem("關閉游戲");
?? ??
?? ? JMenuItem accountItem =new JMenuItem("丁國俊的微信");
?? ?
?? ? public GameJFrame () {
?? ??? ? //初始化界面
?? ??? ? intiJFrame();
?? ??? ??
?? ??? ? //初始化菜單
?? ??? ? initJMenuBar();
?? ??? ??
?? ??? ? //初始化數據
?? ??? ? initData();
?? ??? ??
?? ??? ? //初始化圖片(根據打亂之后的結果去加載圖片)
?? ??? ? initImage();
?? ??? ??
?? ??? ??
?? ??? ??
?? ?//設置窗體可見 ?放到最后
?? ? this.setVisible(true);
}
?? ??
?? ? //初始化數據
?? ? private void initData() {
?? ??? ?//1.定義一個一維數組
?? ??? ? int[] tempArr= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
?? ??? ?//2.打亂數組中的數據順序
?? ??? ? //遍歷數組中得到的每一個元素,拿到每一個元素跟隨索引上的數據進行交換
?? ??? ? Random r = new Random();
?? ??? ? for(int i =0 ;i<tempArr.length;i++) {
?? ??? ??? ? //獲取隨機索引
?? ??? ??? ? int index = r.nextInt(tempArr.length);
?? ??? ??? ? //拿到遍歷到每一個數據,跟隨機索引上的數據進行交換
?? ??? ??? ? int temp =tempArr[index];
?? ??? ??? ? tempArr[i] = tempArr[index];
?? ??? ??? ? tempArr[index] =temp;
?? ??? ? }
?? ??? ??
?? ??? ? //4.給二維數組添加數據
?? ??? ? //遍歷一維數組tempArr得到每一個元素, 把每一個元素依次添加到二維數組當中
?? ??? ? for(int i=0;i<tempArr.length;i++) {
?? ??? ??? ? if(tempArr[i]==0) {
?? ??? ??? ??? ? x=i/4;
?? ??? ??? ??? ? y=i%4;
?? ??? ??? ? }else {
?? ??? ??? ? data[i/4][i%4]=tempArr[i];
?? ??? ??? ? }
?? ??? ? }
?? ?}
?? ? //初始化圖片
?? ? //添加圖片的時候,就需要按照二維數組中管理的數據添加圖片
?? ?private void initImage() {
?? ??? ?//清空原本已經出現的所有圖片
?? ??? ?this.getContentPane().removeAll();
?? ??? ?
?? ??? ?if(victory()) {
?? ??? ??? ?//顯示勝利圖標
?? ??? ??? ?JLabel winJLabel = new JLabel(new ImageIcon("D:\\學習資料\\Java\\拼圖小游戲\\image\\win.png"));
?? ??? ??? ?winJLabel.setBounds(203,283,197,73);
?? ??? ??? ?this.getContentPane().add(winJLabel);
?? ??? ?}
?? ??? ?
?? ??? ?
?? ??? ?
?? ??? ?JLabel stepCount = new JLabel ("步數"+step);
?? ??? ?stepCount.setBounds(50,30,100,20);
?? ??? ?this.getContentPane().add(stepCount);
?? ??? ?
?? ??? ?
?? ??? ?
?? ??? ?//先加載的圖片在上方 ?后加載的圖片在下方
?? ??? ? //外循環---把內循環重復執行了4次
?? ??? ? for (int i = 0; i<4;i++) {
?? ??? ??? ? //內循環---表示一行添加了4張圖片
?? ??? ??? ? for (int j = 0; j<4;j++) {
?? ??? ? //獲取當前要加載圖片的序號
?? ??? ??? ?int num = ?data[i][j];
?? ??? ? //創建一個JLabel的對象(管理容器)
?? ??? ? JLabel jLabel =new JLabel(new ImageIcon(path+ num + ".jpg"));
?? ??? ? //指定圖片位置
?? ??? ? jLabel.setBounds(105*j+83,105*i+134,105,105);
?? ??? ? //給圖片添加邊框
?? ??? ? jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));//設置邊框凹下來
?? ??? ??
?? ??? ? //把管理容器添加到界面中
?? ??? ? this.getContentPane().add(jLabel);//取消默認的居中放置
?? ??? ??? ? }
?? ??? ? }
?? ??? ? JLabel background =new JLabel(new ImageIcon("D:\\學習資料\\Java\\拼圖小游戲\\image\\background.png"));
?? ??? ? background.setBounds(40,40,508,560);
?? ??? ? //將背景圖片添加到界面中
?? ??? ? this.getContentPane().add(background);
?? ??? ??
?? ??? ? //刷新一下界面
?? ??? ? this.getContentPane().repaint();
?? ??? ??
?? ?}
?? ?public void intiJFrame() {
?? ??? ??
?? ??? ?//GameJFrame這個界面表示的就是 游戲的主界面
?? ??? ??? ?//以后跟游戲相關的所有邏輯都寫在這個類
?? ??? ??? ? //設置界面的寬高
?? ??? ??? ? this.setSize(603,680);
?? ??? ??? ? //設置界面的標題
?? ??? ??? ? this.setTitle("拼圖單機版v1.8");
?? ??? ??? ? //設置界面置頂
?? ??? ??? ? this.setAlwaysOnTop(true);
?? ??? ??? ? //設置頁面居中
?? ??? ??? ? this.setLocationRelativeTo(null);
?? ??? ??? ? //設置關閉模式
?? ??? ??? ? this.setDefaultCloseOperation(3);
?? ??? ??? ??
?? ??? ??? ? //取消默認的居中放置 ?只有取消了才會按照xy的形式來添加組件
?? ??? ??? ? this.setLayout(null);
?? ??? ??? ? //給整個界面添加鍵盤監聽事件
?? ??? ??? ? this.addKeyListener(this );
?? ??? ??? ??
?? ? }?
?? ? public void initJMenuBar(){
?? ??? ?//初始化菜單
?? ??? ? JMenuBar jMenuBar =new JMenuBar();
?? ??? ??
?? ??? ? //常見菜單上的兩個選項的對象(功能 關于我們 )
?? ??? ? JMenu functionJMenu = new JMenu("功能");
?? ??? ? JMenu aboutJMenu = new JMenu("關于我們");
?? ??? ??
?? ??? ? //將每一個選項下面的條目放在選項當中
?? ??? ? functionJMenu.add(replayItem);
?? ??? ? functionJMenu.add(reLoginItem);
?? ??? ? functionJMenu.add(closeItem);
?? ??? ??
?? ??? ? aboutJMenu.add(accountItem);
?? ??? ??
?? ??? ? //給條目綁定時間
?? ??? ? replayItem.addActionListener(this);
?? ??? ? reLoginItem.addActionListener(this);
?? ??? ? closeItem.addActionListener(this);
?? ??? ? accountItem.addActionListener(this);
?? ??? ??
?? ??? ? //將菜單里的兩個選項添加到菜單當中去
?? ??? ? jMenuBar.add(functionJMenu);
?? ??? ? jMenuBar.add(aboutJMenu);
?? ??? ??
?? ??? ? //給整個界面設置菜單
?? ??? ? this.setJMenuBar(jMenuBar);
?? ??? ??
?? ??? ??
?? ??? ??
?? ? }
?
?? ?@Override
?? ?public void keyTyped(KeyEvent e) {
?? ??? ?// TODO Auto-generated method stub
?? ??? ?
?? ?}
?? ?
?? ?@Override
?? ?//按下不松時會調用這個方法
?? ?public void keyPressed(KeyEvent e) {
?? ??? ?// TODO Auto-generated method stub
?? ??? ?int code = e.getKeyCode();
?? ??? ?if(code==65) {
?? ??? ?//把界面所有的圖片刪除
?? ??? ?this.getContentPane().removeAll();
?? ??? ?//加載第一張完整的圖片
?? ??? ?JLabel all =new JLabel(new ImageIcon(path +"all.jpg"));
?? ??? ?all.setBounds(83,134,420,420);
?? ??? ? this.getContentPane().add(all);
?? ??? ?//加載背景圖片
?? ??? ?//添加背景圖片
?? ??? ? JLabel background =new JLabel(new ImageIcon("D:\\學習資料\\Java\\拼圖小游戲\\image\\background.png"));
?? ??? ? background.setBounds(40,40,508,560);
?? ??? ? //將背景圖片添加到界面中
?? ??? ? //把背景圖片添加到界面中
?? ??? ? this.getContentPane().add(background);
?? ??? ? //刷新界面
?? ??? ? this.getContentPane().repaint();
?? ??? ?}
?? ?}
?
?? ?@Override
?? ?public void keyReleased(KeyEvent e) {
?
?? ??? ?// TODO Auto-generated method stub
?? ??? ?//對 上,下,左,右進行判斷
?? ??? ??? ??? ?//左37 上38 右39 下40
?? ??? ??? ??? ?int code =e.getKeyCode();
?? ??? ??? ??? ?if(code ==37) {
?? ??? ??? ??? ??? ?System.out.println("向左移動");
?? ??? ??? ??? ??? ?if(y==3){
?? ??? ??? ??? ??? ??? ?return;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?data[x][y] =data[x][y+1];
?? ??? ??? ??? ??? ?data[x][y+1]=0;
?? ??? ??? ??? ??? ?y++;
?? ??? ??? ??? ??? ?//有一次移動,計步器自增一次
?? ??? ??? ??? ??? ?step++;
?? ??? ??? ??? ??? ?//調用方法按照最新的數字加載圖片
?? ??? ??? ??? ??? ?initImage();
?? ??? ??? ??? ?}else if(code ==38) {
?? ??? ??? ??? ??? ?System.out.println("向上移動");
?? ??? ??? ??? ??? ?//邏輯
?? ??? ??? ??? ??? ?//空白方框下方的數字往上移動
?? ??? ??? ??? ??? ?//x,y表示空白方塊?
?? ??? ??? ??? ??? ?//x+1,y表示空白方塊下方的數字
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?//把空白方塊下方的數字賦值給空白方塊
?? ??? ??? ??? ??? ?if(x==3){
?? ??? ??? ??? ??? ??? ?return;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?data[x][y] =data[x+1][y];
?? ??? ??? ??? ??? ?data[x+1][y]=0;
?? ??? ??? ??? ??? ?x++;
?? ??? ??? ??? ??? ?//有一次移動,計步器自增一次
?? ??? ??? ??? ??? ?step++;
?? ??? ??? ??? ??? ?//調用方法按照最新的數字加載圖片
?? ??? ??? ??? ??? ?initImage();
?? ??? ??? ??? ?}else if(code ==39) {
?? ??? ??? ??? ??? ?System.out.println("向右移動");
?? ??? ??? ??? ??? ?if(y==0){
?? ??? ??? ??? ??? ??? ?return;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?data[x][y] =data[x][y-1];
?? ??? ??? ??? ??? ?data[x][y-1]=0;
?? ??? ??? ??? ??? ?y--;
?? ??? ??? ??? ??? ?//有一次移動,計步器自增一次
?? ??? ??? ??? ??? ?step++;
?? ??? ??? ??? ?}else if(code ==40) {
?? ??? ??? ??? ??? ?System.out.println("向下移動");
?? ??? ??? ??? ??? ?if(x==0){
?? ??? ??? ??? ??? ??? ?return;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?data[x][y] =data[x-1][y];
?? ??? ??? ??? ??? ?data[x-1][y]=0;
?? ??? ??? ??? ??? ?x--;
?? ??? ??? ??? ??? ?//有一次移動,計步器自增一次
?? ??? ??? ??? ??? ?step++;
?? ??? ??? ??? ??? ?//調用方法按照最新的數字加載圖片
?? ??? ??? ??? ??? ?initImage();
?? ??? ??? ??? ?}else if(code ==65){
?? ??? ??? ??? ??? ?initImage();
?? ??? ??? ??? ?}else if(code ==87) {
?? ??? ??? ??? ??? ?data =new int[][] {
?? ??? ??? ??? ??? ??? ?{1,2,3,4},
?? ??? ??? ??? ??? ??? ?{5,6,7,8},
?? ??? ??? ??? ??? ??? ?{9,10,11,12},
?? ??? ??? ??? ??? ??? ?{13,14,15,16}
?? ??? ??? ??? ??? ?};
?? ??? ??? ??? ??? ?initImage();
?? ??? ??? ??? ?}
?? ?}
?? ?//判斷data數組中的數據是否跟win數組中的i昂同
?? ?//如果全部相同返回true,否則返false
?? ?public boolean victory() {
?? ??? ?for( int i=0;i<data.length;i++) {
?? ??? ??? ?//i:依次表示二維數組中的data里面的索引
?? ??? ??? ?//data[i]:依次表示每一個一維數組
?? ??? ??? ?for(int j=0;j<data[i].length;j++) {
?? ??? ??? ??? ?if(data[i][j] !=win[i][j]) {
?? ??? ??? ??? ??? ?//只要有一個數據不一樣則返回false
?? ??? ??? ??? ??? ?return false;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ??? ?//循環結束表示數組遍歷比較完畢 ?,全部一樣的話返回true
?? ??? ?return false;
?? ??? ?
?? ?}
?? ?public void ?actionPerformed(ActionEvent e) {
?? ??? ?//獲取當前被點擊的條目對象
?? ??? ?Object obj =e.getSource();
?? ??? ?//判斷
?? ??? ?if(obj ==replayItem) {
?? ??? ??? ?System.out.println("重新游戲");
?? ??? ??? ?
?? ??? ??? ?//計步器清零
?? ??? ??? ?step = 0;
?? ??? ??? ?
?? ??? ??? ?//再次打亂二維數組
?? ??? ??? ?initData();
?? ??? ??? ?
?? ??? ??? ?//重新加載圖片
?? ??? ??? ?initImage();
?? ??? ?}else if(obj == reLoginItem) {
?? ??? ??? ?System.out.println("重新登錄");
?? ??? ??? ?this.setVisible(false);
?? ??? ??? ?//打開登入界面
?? ??? ??? ?new LoginJFrame();
?? ??? ?}else if(obj == closeItem) {
?? ??? ??? ?System.out.println("關閉游戲");
?? ??? ??? ?//直接關閉游戲
?? ??? ??? ?System.exit(0);
?? ??? ?}else if(obj == accountItem) {
?? ??? ??? ?System.out.println("丁國俊的微信");
?? ??? ??? ?JDialog jDialog=new JDialog();
?? ??? ??? ?//創建一個管理圖片的容器對象jDialog
?? ??? ??? ?JLabel jLabel = new JLabel(new ImageIcon("D:\\學習資料\\Java\\拼圖小游戲\\image\\微信圖片_20231119183326.jpg")) ;
?? ??? ??? ?//設置位置和寬高
?? ??? ??? ?jLabel.setBounds(0,0,258,258);
?? ??? ??? ?//把圖片添加到彈框中
?? ??? ??? ?jDialog.getContentPane().add(jLabel);
?? ??? ??? ?//設置彈框大小
?? ??? ??? ?jDialog.setSize(344,344);
?? ??? ??? ?//讓彈框置頂
?? ??? ??? ?jDialog.setAlwaysOnTop(true);
?? ??? ??? ?//讓彈框劇中
?? ??? ??? ?jDialog.setLocationRelativeTo(null);
?? ??? ??? ?//彈框不關閉則無法操作下面的界面
?? ??? ??? ?jDialog.setModal(true);
?? ??? ??? ?//讓彈框顯示出來
?? ??? ??? ?jDialog.setVisible(true);
?? ??? ?}
?? ?}
}
測試類如下:
package heima;
?
public class App {
?? ?public static void main(String[]args) {
?? ??? ?//表示程序的啟動入口
?? ??? ?//如果我們想要開啟一個界面,就創建誰的對象就可以了
?? ??? ?new GameJFrame();//調用游戲主界面窗體
?? ??? ?//new RegisterJFrame();//注冊界面
?? ??? ?//new LoginJFrame();//登入界面
?? ?}
}
運行結果如下: