回顧一下處理連連看消除邏輯(演算法實現) 相同圖片能夠消除 在同一行或者同一列無障礙物可消除 一個拐點可消除 兩個拐點可消除 這一部分和之前沒有多大變動,加了一個數組輸入輸出存儲,eclipse自動報錯加上去的。(74-76行) 到這一步已經實現任意兩個圖形相消除,接下來是——兩個相同圖形的消除。 ...
- 博客有時間就寫寫,所以一篇可能會拆成很多篇,寫完後計劃再合在一起。
- 首先肯定是要實現連連看的界面。
- 先準備連連看要的圖片。、
- “LianLianKan”就是項目名稱。
- 當然,如果小白看我的博客想學到什麼,我會說還是放棄,因為文字描述會忽視很多細節,而細節決定bug……
- 所以,包括以前的和以後的,博文都會是給自己看看或者內行觸類旁通的,也就是——筆記。
- 我也是今天才明白博文的真正意義吧,所以以後的博文風格會大改……儘量會用自己語言風格來描述以便自己能看懂。
- 廢話少說,現在的第2步:
- 創建數組,一個持久化存儲的容器:存儲連連看的圖片 迷宮尋路
- 2.有圖像在數組看得到,先秀一下看看,免得一開始代碼就錯了,後面還寫個毛。
- 到這一步,主函數基本沒什麼變化。TableFrame.java
1 package com.edp.impl; 2 3 4 import java.awt.FlowLayout; 5 6 import javax.swing.JFrame; 7 import javax.swing.JTable; 8 9 /** 10 * 11 * @author Administrator 12 * 13 */ 14 @SuppressWarnings("serial") 15 public class TableFrame extends JFrame{ 16 public static void main(String[] args) { 17 new TableFrame().initFrame(); 18 } 19 20 private void initFrame() { 21 this.setSize(800,600); 22 this.setDefaultCloseOperation(3); 23 this.setLayout(new FlowLayout()); 24 //設置窗體不能改變大小 25 this.setResizable(false); 26 this.setLocationRelativeTo(null); 27 28 MyTableModel mtm = new MyTableModel(); 29 JTable table = new JTable(mtm); 30 this.add(table); 31 this.setVisible(true); 32 33 } 34 }
- 說明在代碼裡面寫清楚了 。
1 package com.edp.impl; 2 3 import java.util.Random; 4 5 import javax.swing.event.TableModelListener; 6 import javax.swing.table.TableModel; 7 8 public class MyTableModel implements TableModel { 9 //1.創建數組,一個持久化存儲的容器:存儲連連看的圖片 迷宮尋路 10 private String[][] saveDB = new String[13][13]; 11 //2.有圖像在數組看得到 12 //2_2在存的時候想到圖片最好隨機 13 private Random ran = new Random();//創建隨機對象 14 //2_1 把圖片存到數組 15 public MyTableModel() { 16 int value; 17 for(int i = 0;i<saveDB.length;i++){ 18 for (int j = 0; j < saveDB[i].length; j++) { 19 value = ran.nextInt(13)+1; 20 saveDB[i][j] = "image/lianliankanimage/"+value+".jpg"; 21 } 22 } 23 } 24 25 //獲取列類型 26 public Class<?> getColumnClass(int columnIndex) { 27 return String.class; 28 } 29 //獲取總行數 30 public int getRowCount() { 31 return saveDB.length; 32 } 33 //獲取總列數 34 public int getColumnCount() { 35 return saveDB[0].length; 36 } 37 //獲取表格列名 38 public String getColumnName(int columnIndex) { 39 //連連看游戲沒必要出現表格列名呀,反正不需要 40 //實現列名可以通過switch語句,最適合實現。然後在TableFrame類裡面實現 41 //不過想要實現得這樣(用到JScrollPane): 42 // JTable table = new JTable(mtm); 43 // //把JTable對象載入到JScrollPane 44 // JScrollPane jsp = new JScrollPane(table); 45 // this.add(jsp); 46 //JScrollPane到底是個什麼玩意,請自己去查java API說明書。 47 return null; 48 } 49 //設置單元格數據 50 public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 51 } 52 //獲得單元格數據 53 public Object getValueAt(int rowIndex, int columnIndex) { 54 return 0; 55 } 56 //單元格是否編輯 57 public boolean isCellEditable(int rowIndex, int columnIndex) { 58 //連連看游戲肯定不需要對單元格進行修改或刪除,游戲邏輯自會處理相關格子內的東西。 59 return false; 60 } 61 public void removeTableModelListener(TableModelListener l) {} 62 public void addTableModelListener(TableModelListener l) {} 63 }
- 運行結果是這樣子的
- 然後開始插入圖片看看。
- TableFrame.java
1 package com.edp.impl; 2 3 4 import java.awt.FlowLayout; 5 6 import javax.swing.JFrame; 7 import javax.swing.JTable; 8 import javax.swing.table.TableColumnModel; 9 10 /** 11 * 12 * @author Administrator 13 * 14 */ 15 @SuppressWarnings("serial") 16 public class TableFrame extends JFrame{ 17 public static void main(String[] args) { 18 new TableFrame().initFrame(); 19 } 20 21 private void initFrame() { 22 this.setSize(800,600); 23 this.setDefaultCloseOperation(3); 24 this.setLayout(new FlowLayout()); 25 //設置窗體不能改變大小 26 this.setResizable(false); 27 this.setLocationRelativeTo(null); 28 29 MyTableModel mtm = new MyTableModel(); 30 JTable table = new JTable(mtm); 31 this.add(table); 32 //設置顯示樣式 33 //列寬 34 table.setRowHeight(35); 35 //獲取列模型 36 TableColumnModel columnModel = table.getColumnModel(); 37 for (int i = 0; i < columnModel.getColumnCount(); i++) { 38 columnModel.getColumn(i).setPreferredWidth(35); 39 } 40 //設置行列都不能被選中 41 table.setRowSelectionAllowed(false); 42 table.setColumnSelectionAllowed(false); 43 this.setVisible(true); 44 45 } 46 }
- MyTableModel.java
1 package com.edp.impl; 2 3 import java.util.Random; 4 5 import javax.swing.ImageIcon; 6 import javax.swing.event.TableModelListener; 7 import javax.swing.table.TableModel; 8 9 public class MyTableModel implements TableModel { 10 //1.創建數組,一個持久化存儲的容器:存儲連連看的圖片 迷宮尋路 11 private String[][] saveDB = new String[13][13]; 12 //2.有圖像在數組看得到 13 //2_2在存的時候想到圖片最好隨機 14 private Random ran = new Random();//創建隨機對象 15 //2_1 把圖片存到數組 16 public MyTableModel() { 17 int value; 18 for(int i = 0;i<saveDB.length;i++){ 19 for (int j = 0; j < saveDB[i].length; j++) { 20 value = ran.nextInt(13)+1; 21 saveDB[i][j] = "image/"+value+".jpg"; 22 } 23 } 24 } 25 26 //獲取列類型 27 public Class<?> getColumnClass(int columnIndex) { 28 return javax.swing.ImageIcon.class; 29 } 30 //獲取總行數 31 public int getRowCount() { 32 return saveDB.length; 33 } 34 //獲取總列數 35 public int getColumnCount() { 36 //這裡考慮一個bug:如果連列數都沒有,這行代碼就會報出異常 37 if(saveDB.length>0){ 38 return saveDB[0].length; 39 } 40 return 0; 41 } 42 //獲取表格列名 43 public String getColumnName(int columnIndex) { 44 //連連看游戲沒必要出現表格列名呀,反正不需要 45 //實現列名可以通過switch語句,最適合實現。然後在TableFrame類裡面實現 46 //不過想要實現得這樣(用到JScrollPane): 47 // JTable table = new JTable(mtm); 48 // //把JTable對象載入到JScrollPane 49 // JScrollPane jsp = new JScrollPane(table); 50 // this.add(jsp); 51 //JScrollPane到底是個什麼玩意,請自己去查java API說明書。 52 return null; 53 } 54 //設置單元格數據 55 public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 56 saveDB[rowIndex][columnIndex] = (String)aValue; 57 } 58 //獲得單元格數據 59 public Object getValueAt(int rowIndex, int columnIndex) { 60 //返回圖片 61 ImageIcon icon = new ImageIcon(saveDB[rowIndex][columnIndex]); 62 return icon; 63 64 } 65 //單元格是否編輯 66 public boolean isCellEditable(int rowIndex, int columnIndex) { 67 //連連看游戲肯定不需要對單元格進行修改或刪除,游戲邏輯自會處理相關格子內的東西。 68 return false; 69 } 70 public void removeTableModelListener(TableModelListener e) {} 71 public void addTableModelListener(TableModelListener e) {} 72 }
- 運行後,什麼都出來了。
- 接下來是實現連連看游戲的消除。
- 消除肯定要用滑鼠點呀點的。而實現滑鼠操作,肯定是要監控。
- 監控插哪呢,肯定要是面板創建完,就監控。
-
回顧一下處理連連看消除邏輯(演算法實現)
-
相同圖片能夠消除
-
在同一行或者同一列無障礙物可消除
-
一個拐點可消除
-
兩個拐點可消除
-
- TableFrame.java
1 package com.edp.impl; 2 3 4 import java.awt.FlowLayout; 5 6 import javax.swing.JFrame; 7 import javax.swing.JTable; 8 import javax.swing.table.TableColumnModel; 9 10 /** 11 * 12 * @author Administrator 13 * 14 */ 15 @SuppressWarnings("serial") 16 public class TableFrame extends JFrame{ 17 public static void main(String[] args) { 18 new TableFrame().initFrame(); 19 } 20 21 private void initFrame() { 22 this.setSize(800,600); 23 this.setDefaultCloseOperation(3); 24 this.setLayout(new FlowLayout()); 25 //設置窗體不能改變大小 26 this.setResizable(false); 27 this.setLocationRelativeTo(null); 28 29 MyTableModel mtm = new MyTableModel(); 30 JTable table = new JTable(mtm); 31 this.add(table); 32 //設置顯示樣式 33 //列寬 34 table.setRowHeight(35); 35 //獲取列模型 36 TableColumnModel columnModel = table.getColumnModel(); 37 for (int i = 0; i < columnModel.getColumnCount(); i++) { 38 columnModel.getColumn(i).setPreferredWidth(35); 39 } 40 //設置行列都不能被選中 41 table.setRowSelectionAllowed(false); 42 table.setColumnSelectionAllowed(false); 43 this.setVisible(true); 44 45 //添加監聽器 46 LLKMouseListener llkListener = new LLKMouseListener(mtm); 47 table.addMouseListener(llkListener); 48 } 49 }
- MyTableModel.java
1 package com.edp.impl; 2 3 import java.util.Random; 4 5 import javax.swing.ImageIcon; 6 import javax.swing.event.TableModelListener; 7 import javax.swing.table.TableModel; 8 9 public class MyTableModel implements TableModel { 10 //1.創建數組,一個持久化存儲的容器:存儲連連看的圖片 迷宮尋路 11 private String[][] saveDB = new String[13][13]; 12 //2.有圖像在數組看得到 13 //2_2在存的時候想到圖片最好隨機 14 private Random ran = new Random();//創建隨機對象 15 //2_1 把圖片存到數組 16 //3.消除肯定要用滑鼠點呀點的。而實現滑鼠操作,肯定是要監控。 17 public MyTableModel() { 18 int value; 19 for(int i = 0;i<saveDB.length;i++){ 20 for (int j = 0; j < saveDB[i].length; j++) { 21 value = ran.nextInt(13)+1; 22 saveDB[i][j] = "image/"+value+".jpg"; 23 } 24 } 25 } 26 27 //獲取列類型 28 public Class<?> getColumnClass(int columnIndex) { 29 return javax.swing.ImageIcon.class; 30 } 31 //獲取總行數 32 public int getRowCount() { 33 return saveDB.length; 34 } 35 //獲取總列數 36 public int getColumnCount() { 37 //這裡考慮一個bug:如果連列數都沒有,這行代碼就會報出異常 38 if(saveDB.length>0){ 39 return saveDB[0].length; 40 } 41 return 0; 42 } 43 //獲取表格列名 44 public String getColumnName(int columnIndex) { 45 //連連看游戲沒必要出現表格列名呀,反正不需要 46 //實現列名可以通過switch語句,最適合實現。然後在TableFrame類裡面實現 47 //不過想要實現得這樣(用到JScrollPane): 48 // JTable table = new JTable(mtm); 49 // //把JTable對象載入到JScrollPane 50 // JScrollPane jsp = new JScrollPane(table); 51 // this.add(jsp); 52 //JScrollPane到底是個什麼玩意,請自己去查java API說明書。 53 return null; 54 } 55 //設置單元格數據 56 public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 57 saveDB[rowIndex][columnIndex] = (String)aValue; 58 } 59 //獲得單元格數據 60 public Object getValueAt(int rowIndex, int columnIndex) { 61 //返回圖片 62 ImageIcon icon = new ImageIcon(saveDB[rowIndex][columnIndex]); 63 return icon; 64 65 } 66 //單元格是否編輯 67 public boolean isCellEditable(int rowIndex, int columnIndex) { 68 //連連看游戲肯定不需要對單元格進行修改或刪除,游戲邏輯自會處理相關格子內的東西。 69 return false; 70 } 71 public void removeTableModelListener(TableModelListener e) {} 72 public void addTableModelListener(TableModelListener e) {} 73 74 public String[][] getSaveDB() { 75 return saveDB; 76 } 77 }
這一部分和之前沒有多大變動,加了一個數組輸入輸出存儲,eclipse自動報錯加上去的。(74-76行)
- LLKMouseListener.java
1 package com.edp.impl; 2 3 import java.awt.event.MouseAdapter; 4 import java.awt.event.MouseEvent; 5 6 import javax.swing.JTable; 7 8 public class LLKMouseListener extends MouseAdapter{ 9 /** 10 1.相同圖片能夠消除 11 2.在同一行或者同一列無障礙物可消除 12 3.一個拐點可消除 13 4.兩個拐點可消除 14 */ 15 public MyTableModel mtm; 16 17 //1_4.發現消除的是一個,點一個就消掉一個 18 //所以需要做下關聯, 控制第一次還是第二次點擊的操作 19 public boolean flag = true; 20 public int row1, column1, row2, column2; 21 //3.滑鼠監控 22 public LLKMouseListener(MyTableModel mtm) { 23 this.mtm = mtm; 24 } 25 26 public void mousePressed(MouseEvent e) { 27 //1.相同圖片能夠消除 28 // 1_1.需要知道自己點擊的是表格哪個位置 29 // 1_2.得到被選中行被選中列 30 JTable table = (JTable) e.getSource(); 31 32 // 1_3.把指定位置的圖片消除:去除路徑 33 String[][] saveDB = mtm.getSaveDB(); 34 35 if(flag){ 36 row1 = table.getSelectedRow(); 37 column1 = table.getSelectedColumn(); 38 flag = false; 39 }else{ 40 row2 = table.getSelectedRow(); 41 column2 = table.getSelectedColumn(); 42 saveDB[row1][column1] = ""; 43 saveDB[row2][column2] = ""; 44 flag = true; 45 } 46 } 47 }
到這一步已經實現任意兩個圖形相消除,接下來是——兩個相同圖形的消除。
- LLKMouseListener.java
1 package com.edp.impl; 2 3 import java.awt.event.MouseAdapter; 4 import java.awt.event.MouseEvent; 5 6 import javax.swing.JTable; 7 8 public class LLKMouseListener extends MouseAdapter{ 9 /** 10 1.相同圖片能夠消除 11 2.在同一行或者同一列無障礙物可消除 12 3.一個拐點可消除 13 4.兩個拐點可消除 14 */ 15 public MyTableModel mtm; 16 17 //1_4.發現消除的是一個,點一個就消掉一個 18 //所以需要做下關聯, 控制第一次還是第二次點擊的操作 19 public boolean flag = true; 20 public int row1, column1, row2, column2; 21 //3.滑鼠監控 22 public LLKMouseListener(MyTableModel mtm) { 23 this.mtm = mtm; 24 } 25 26 public void mousePressed(MouseEvent e) { 27 //1.相同圖片能夠消除 28 // 1_1.需要知道自己點擊的是表格哪個位置 29 // 1_2.得到被選中行被選中列 30 JTable table = (JTable) e.getSource(); 31 32 // 1_3.把指定位置的圖片消除:去除路徑 33 String[][] saveDB = mtm.getSaveDB(); 34 35 if(flag){ 36 row1 = table.getSelectedRow(); 37 column1 = table.getSelectedColumn(); 38 flag = false; 39 }else{ 40 row2 = table.getSelectedRow(); 41 column2 = table.getSelectedColumn(); 42 if((row1 != row2 || column1 != column2)){ 43 if(saveDB[row1][column1].equals(saveDB[row2][column2])){ 44 if(checkRow(row1,column1,row2,column2)|| 45 checkColumn(row1,column1,row2,column2)){ 46 saveDB[row1][column1] = ""; 47 saveDB[row2][column2] = ""; 48 } 49 } 50 } 51 flag = true; 52 } 53 } 54 55 //同行演算法 56 public boolean checkRow(int row1, int column1, int row2, int column2) { 57 // 1.保證兩個位置是同一行 58 if (row1 == row2) { 59 int minColumn = Math.min(column1, column2); 60 int maxColumn = Math.max(column1, column2); 61 // 尋找兩個位置之間的所有位置是否為空