有空的時候就寫寫代碼,在這個單純的程式世界裡,我也同樣可以找到快樂!
剛剛學習java不久,《java編程思想》還沒看完,就躍躍欲試了。哈哈。
每天花兩個小時的時間,一步一步地解決下面的問題,我的連連看也就出來了。分享一下^_^
<1> 介面。更簡單的問法是→→怎麼用java顯示出一個視窗?
用java.awt和javax.swing兩個包可以實現!
用Eclipse建立一個javaproject。在JRESystem Library[JavaSE-1.7] > rt.jar中可以看到這兩個包。
在<連連看>中我用到了很多介面組件,總結一下:
JFrame視窗:包含表徵圖,最小化最大化關閉按鈕等
JPanel畫布 :最基本,可以設定各種布局
JScrollPane滾動畫布:內容超過介面的大小,會自動產生捲軸
JSplitPane分欄畫布 :可以將介面分成兩欄
JLayeredPane分層畫布:非常好用。想設定背景圖片用這個
FlowLayout浮動布局:最基本的布局
BorderLayout邊緣布局:分為東西南北中
CardLayout卡片布局:非常好用!切換畫面用這個
FormLayout表格版面配置:非常強大!各行各列的尺寸都可以設定
GridLayout格子布局:介面均勻分隔成格子,連連看中的圖片用這個
(每張畫布擁有一個自己的布局。布局影響畫布的子組件的排版)
(Components)
JLabel標籤:可以顯示文字和圖片
JButton按鈕:通常就是設定監聽ActionListener
JTextPane文章:顯示一篇文章,運行時可以被編輯
JList列表:可以利用ListModel動態管理列表中的元素
JProgressBar進度條:設定max設定value
【2】介面事件
介面可以監聽的事件很多。
ComponentListener:監聽視窗移動/顯示/尺寸變化等事件
ActionListener:監聽按鈕的點擊事件
WindowListener:監聽視窗關閉等事件
MouseListener:滑鼠點擊事件
MouseMotionListener:滑鼠移動/進入/離開等事件
【3】用代碼“寫”介面很不方便?
安裝WindowBuilder外掛程式吧!
:http://www.eclipse.org/windowbuilder/download.php
Eclipse菜單Help> Install New Software > Add選擇下載的zip檔案安裝
安裝完後重啟Eclipse,選擇自己設計的介面類(比如繼承JFrame的類)java檔案
右鍵 >Open With > Window Builder Editor
可以開啟可視化介面設計。
網上還有別的外掛程式工具,我自己沒用過就不介紹了。
【4】資料庫
我用的是輕量級資料庫Sqlite
用工具sqlitestudio-2.0.21.exe建立一個資料庫檔案(尾碼.db)
用了資料庫,還需要讓我們的程式能夠串連上資料庫,
這就需要資料庫驅動,因此我們需要匯入一個包sqlite-jdbc-3.7.2.jar
http://www.xerial.org/maven/repository/artifact/org/xerial/sqlite-jdbc/3.7.2/
怎麼匯入jar包到自己的project中?
右鍵點擊java project名 >Properties > Java Build Path > Libraries > Add JARs...
怎麼載入資料庫驅動?怎麼串連資料庫?怎麼執行SQL語句?
Class.forName("org.sqlite.JDBC");Connection conn = DriverManager.getConnection( "jdbc:sqlite:"+GameConfig.DB_NAME ); Statement stat = conn.createStatement();stat.execute(sql);
【5】連連看演算法?怎麼判斷兩個點可以串連消掉?
相信網上已經有了各式各樣的演算法。
這裡想說的是我自己的一點想法:兩個點 A(3,2)B(3,8)
怎麼判斷能否相連?
想法:這兩個點之間,有[3,4,5,6,7 ]共5個橫行,如何判斷AB之間是否存在“通道”可以“直穿”過這5個行呢?
用最簡陋的運算:位元運算!我認為這是最快最簡便的。
把整個介面用char 數組來表示,有圖片的格子用1表示,沒有圖片用0表示。下面是10*10時的矩陣初始情況
0000000000001111 //matrix[0]0111111111101111 //matrix[1]0111111111101111 //matrix[2]0111111111101111 //matrix[3]0111111111101111 //matrix[4]0111111111101111 //matrix[5]0111111111101111 //matrix[6]0111111111101111 //matrix[7]0111111111101111 //matrix[8]0111111111101111 //matrix[9]0000000000001111 //matrix[10]
char[] matrix = new char[10];char temp = 0x0000;for( int i=3; i<=7; ++i ){ temp |= matrix[i];//按位或運算}if( temp == 0xFFFF ){ ;//無通道}else{ ;//有通道}
以上只是演算法的一部分,不過其實問題已經可以引刃而解了。
【6】怎麼讓圖片根據JLabel的尺寸縮放?
自己繼承JLabel,在Eclipse的workspace中找到專案檔夾,放入圖片beauty.jpg
public class ImageJLabel extends JLabel { Image img = ImageIO.read( new File( "res/beauty.jpg" ));//需要catch Exception @Override public void paintComponent( Graphics g ){ g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this); }
【7】資料庫報異常:ResultSetis TYPE_FORWARD_ONLY
Statement對象是用來執行SQL語句的,通過createStatement()方法可以獲得其執行個體。
Statement stateMent = connection.createStatement();
執行select語句可以得到一個結果集ResultSet
經常查詢完需要判斷結果集是否為空白。比如:
ResultSet rs = stateMent.executeQuery("Select * From table");
if( rs.first() ){ ... }
那麼,這時就會報異常了,因為用createStatement()方法得到並查詢的結果集遊標只能moveforward
The constant indicating the type for a ResultSet object whose cursor may moveonly forward.
解決方案有兩種,我採用下面的第二種方法:
1:StatementstateMent =connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
2:if(rs.next() ){ ... }//用next()代替first()
<8>如何產生兩兩對應的圖片?
我的圖片命名很簡單:001.jpg,002.jpg,003.jpg 以此類推
問題轉換為如何獲得兩兩對應的數字?
下面是我自己寫的類
package com.yarkey.tools;public class IntClass {private int value;private int num;public IntClass( int value ){this.value = value;num = 0;}public int add( int i ){num += i;return num;}public int minus( int i ){num -= i;return num;}public int getValue(){return value;}public int getNum(){return num;}}
package com.yarkey.tools;import java.util.ArrayList;import java.util.Random;public class RandomType {private static final String TAG = "RandomType";Random random = new Random();ArrayList<IntClass> typeList = new ArrayList<IntClass>();private final int type;private final int numOfPerType;public RandomType( int type, int numOfPerType ){this.type = type;this.numOfPerType = numOfPerType;for( int i=0; i<type; ++i ){typeList.add( new IntClass(i) );}}public int get(){int rd = random.nextInt( typeList.size() );int rdType = typeList.get(rd).getValue();if( typeList.get(rd).add(1) >= numOfPerType ){typeList.remove(rd);Log.d(TAG, "typeList.remove("+rd+") >>> type="+rdType, 15);}return rdType;}public void reset(){typeList.clear();for( int i=0; i<type; ++i ){typeList.add( new IntClass(i) );}}}
type:圖片的種數
numOfPerType:每張圖片出現的次數。
好了,如果我們的連連看是10*10的情況,我們有25張圖片,那麼每張圖片出現4次
我們依次產生隨機數,依次分給0-99的介面位置
RandomType randomType = new RandomType( type, blocks/type );
for( int i=0; i<100; ++i ){
int randomInt = randomType.get();
;//選擇圖片或者其他動作
}
這是我在CSDN的第一篇文章。很抱歉上面的排版看起來很亂,我很不熟悉這個編輯器。
夜深了,也就先寫這麼多了。本人能力也有限,歡迎交流,也歡迎批評指正。
Good night world !
http://www.cnblogs.com/bastard/archive/2013/01/25/2876047.html