命運跟我開了一場玩笑,一個不喜歡很多游戲的人,卻寫起了游戲。。。
參加工作與在學(xué)校,有一點不同是:是否為強迫性的——對于工作,即使你不喜歡,同樣要做。
既然在做,那就得盡力做,每個人都應(yīng)該如此。
努力思考,學(xué)習(xí)。
筆記還是要做的:
筆記一:
發(fā)牌程序,對程序員來說,發(fā)牌的過程只是一個將本來排好序的數(shù)組的順序打亂而已,這個方法耍的只是一個小聰明,使得 Random.nextInt() 方法的運行次數(shù)只等于牌的數(shù)量
?1?????/**
?2??????*?@author?liltos
?3??????*?@param?length?要發(fā)的牌數(shù)
?4??????*?
?5??????*?隨機發(fā)牌的程序,它的特點在于發(fā)length張牌的話
?6??????*?只要運行l(wèi)ength次Random.nextInt()方法!
?7??????*?程序中的4個for循環(huán),有2個用于輸出,1個用于數(shù)組的初始化
?8??????*?只有一個for循環(huán)是用于發(fā)牌的
?9??????*/
10?????public?static?void?randomDeliverCard(int?length)?{
11?????????int[]?card1?=?new?int[length];
12?????????int[]?result?=?new?int[length];
13?
14?????????for?(int?i?=?0;?i?<?card1.length;?i++)
15?????????????card1[i]?=?i?+?1;
16?????????for?(int?i?=?0;?i?<?card1.length;?i++)?{
17?????????????System.out.print(card1[i]?+?"\t");
18?????????????if?((i?+?1)?%?9?==?0)
19?????????????????System.out.println();
20?????????}
21?
22?????????Random?rand?=?new?Random(System.currentTimeMillis());
23?
24?????????int?rand_index?=?0;
25?????????int?remain?=?card1.length;
26?
27?????????/*
28??????????*?當(dāng)將rand_index上的數(shù)取出后,為防止再次取到該數(shù),
29??????????*?便將數(shù)組末尾的數(shù)填充到該位置上,并將數(shù)組末尾的標(biāo)志remain減1
30??????????*?而下標(biāo)隨機數(shù)的取值一直是在remain范圍之內(nèi)的
31??????????*/
32?????????for?(int?i?=?0;?i?<?card1.length;?i++)?{
33?????????????rand_index?=?Math.abs(rand.nextInt()?%?remain);
34?????????????result[i]?=?card1[rand_index];
35?????????????card1[rand_index]?=?card1[remain?-?1];
36?????????????remain--;
37?????????}
38?
39?????????System.out.println("\n\n");
40?????????for?(int?i?=?0;?i?<?result.length;?i++)?{
41?????????????System.out.print(result[i]?+?"\t");
42?????????????if?((i?+?1)?%?10?==?0)
43?????????????????System.out.println();
44?????????}
45?????}
筆記二:
初始化一個 TiledLayer 地圖,一般情況下的 TiledLayer 地圖只是一個二維數(shù)組,這個方法只是將這個二維數(shù)組正確地轉(zhuǎn)化成期望的地圖。
?1?/**
?2??*?@parm?array?代表地圖的數(shù)組
?3??*/
?4?public?void?initMap(int[][]?array)?{
?5?????map?=?new?TiledLayer(array[0].length,?array.length,?image,?w,?h);
?6?????for?(int?i?=?0;?i?<?array.length;?i++)?{
?7????????for?(int?j?=?0;?j?<?array[0].length;?j++)?{
?8????????????map.setCell(j,?i,?array[i][j]);
?9????????}
10?????}
11?}
這個方法的關(guān)鍵之處在于調(diào)用 構(gòu)造方法和 setCell() 方法時前兩個參數(shù)的順序。
筆記三:
關(guān)于一個J2ME程序的框架,在第一次寫J2ME的游戲時,只是感覺一頭霧水。下面這個是總結(jié)的一點點東東:
MIDlet
GameCanvas gameCanvas;
GameThread gameThread;//如果有其它的一些事情,可以在此定義更多的線程,并在 startApp() 方法內(nèi)啟動線程
Display display;
startApp(){
gameThread.start();
display.setCurrent(gameCanvas);//如果有必要,可以調(diào)整顯示對象
}
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
GameCanvas
LayerManager layerManager;
GameCanvas(){
super(false);
layerManager = new LayerManager(this);
}
paint(Graphics g){
switch(gameState){
case GAMING:
layerManager.paint(g, x_view, y_view);
}
}
refresh(){
layerManager.refresh();
zepaint();
}
doKeyEvent(){
int keyState = this.getKeyStates();
switch(gameState){
case GAMING:
layerManager.doKeyEvent(keyState);
break;
??????????? case ...:(other state)
//畫面變化不大/非游戲狀態(tài)下,調(diào)用本類的事件處理方法
break;
}
}
zepaint(){
paint(g);
flushGraphics();
}
處理靜止畫面在本類中
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
?LayerManager
GameCanvas gameCanvas;
LayerManager(GameCanvas gameCanvas){}
refresh(){
...refresh sprites...
}
doKeyEvent(int key){
switch(key){
case ...:
handle data;
}
}
paint(Graphics g, int x, y){
super();
...paint sprites...
}
? 很多程序會只調(diào)用 append(Layer) 方法而不重載父類的 paint(Graphics, int, int) 方法,同樣可以實現(xiàn)游戲中的繪畫功能。而當(dāng)用的是 TiledLayer 作背景時,我還不知道如果重載該方法 -_-! 本質(zhì)上是對坐標(biāo)系的認(rèn)識不清!
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
GameThread
GameCanvas gameCanvas;
GameThread(GameCanvas gameCanvas){}
run(){
while(true){
gameCanvas.doKeyEvent();
gameCanvas.refresh();
Thread.sleep(100);
}
}
------------------------
這只是我一般程序里的框架,可不是死框架,但從我接觸過的來看,這個框架還是比較經(jīng)典的。
如此的筆記希望讓別人能夠看懂。