2048遊戲重點難點自我解析1

2021-07-24 13:32:46 字數 3553 閱讀 3462

近來,照著網上的視屏做了乙個2048遊戲。

即使2048,也感覺做起來很難。《第一行**》看完了,還是有許多view相關的知識不懂。不知道怎麼寫view,不知道怎麼用content。

這裡寫一些過程以及重難點,和沒用過的**。

具體思路大概是這樣:

1、先在layout_mainactivity中設計好布局。重點是在裡面寫入乙個自建layout

2、建好布局之後,就是設計剛剛引入的布局也就是新建的class檔案gameview

以上就是我們剛剛完成的事情。現在寫gameview就是在決定gameview那部分顯示什麼。我們2048遊戲的gameview是這樣的

下面灰色的遊戲介面部分就是我們想要寫的gameview部分。

我現在分析一下這個介面:

現在先回憶一下以前的知識。記住我們寫的gameview是乙個layout。就像linearlayout,framelayout。我們平時是怎麼寫這些layout的?

先是宣告layout再寫裡面的控制項,就像上面我寫的那樣,我擷取下來:

先是定義linearlayout的大小,排列方式,然後在裡面加入控制項。我們這裡也一樣,先要宣告gameview的大小等等。這些我們其實已經做了在這裡,我擷取下來:

這裡已經寫好了。

所以我們要在gameview裡面寫我們需要的控制項,和其他需要的屬性。

也許你看到這裡又不懂了,那麼我們到底做了什麼,然而到這裡為止,我們只定義了外面的白色框框,也就是gameview的邊界。裡面的東西還一點都沒寫呢。

現在繼續分析,裡面底層的深灰色部分我們可以通過定義背景色得到,但是裡面的格仔到底怎麼做呢。這裡我想到兩種方法:

當然還是得先說明前提,這些格仔裡面有數字,毫無疑問都是用的textview。

方法1;通過設定textview的背景色為淺灰色得到灰色方格,再在裡面放入數字。

方法2:寫乙個新的控制項card。然後在gameview裡面放入這個控制項。

哈哈,其實方法一是我臨時想到的,但是肯定不是好方法,相信你也感覺到的。因為以後這個textview要被提取裡面的數字,而且要和其他數字做對比,從而決定是否合併。

那麼裡面的邊框怎麼得到。邊框只是背景色,我們只要讓格仔保持一定距離就好。

那麼總結一下以上分析:我們其實只要寫乙個控制項而已,那就是格仔card。另外就是設定背景色了。

到這裡為止你還不知道怎麼把乙個class檔案寫成layout吧,具體方法是這樣的:

public class gameview extends gridlayout{}

只要通過繼承的方法就能得到乙個新的layout啦。這裡說明一下為什麼選用gridlayout,同樣是像**一樣的四行四列,用gridlayout會在一行或者一列填充完成後自動換行,

這對我們放入格仔card的時候很方便。

接下來我們開始寫這個gameview(記住是這個遊戲的下半部分,也就是遊戲介面)

1、首先是public class gameview extends gridlayout

到這裡為止我們寫了gameview的構造方法並且傳入了context。為什麼呢,我也不懂。如果有人知到了,請告訴我一下。

我們在裡面傳入了乙個initgameview();方法,這就是用來初始化遊戲的。

2、接下來毫無疑問是些這個initgameview()了吧,那麼初始化遊戲我們需要初始化什麼

首先我們知道背景色為灰色,所以我們先寫背景色。

然後我們知道這是四行四列的所以要設定列數,

然後我們要新增卡片addcard()

放入兩張2.

然而,並不是所有都要放在initgameview裡面,那麼寫出來應該是這樣的:// 設定顏色,列數

private void initgameview()

//定義螢幕橫豎
@override    protected void onsizechanged(int w,int h,int oldw,int oldh)
//加入格仔card   

private void addcards(int cardwidth,int cardheight)

當然這不是正式的寫法,我們還要在裡面填入需要的東西,但是你要知道這是一塊一塊完成的。如果能夠有邏輯的把大片**看成有固定功能的數塊,就能有邏輯的處理,

這個遊戲寫起來也簡單寫,只需要攻克某些不會的語句。要理解就需要了解view原始碼。這個很難,我還沒看。

我們來填充這些**:

你肯定會注意到第二塊裡裡面有@override和addcards()在裡面。@override表示這個方法是重寫父類gridlayout的方法。addcards為什麼寫在這裡面呢。因為onsizechang方法

會在遊戲一執行就呼叫,我們讓他同時執行addcards方法來插入格仔。而 w,h,oldw,oldh.代表的是螢幕的新舊寬高(橫豎屏)。但是這個方法只會呼叫一次,之後不會再

改變橫豎屏。也許你會奇怪橫豎屏不是會多次改變嗎,實話告訴你,我不知道...應該還要再加點什麼吧。

addcard()照我這麼說放在initgameview裡面也可以啊。應該是可以的,我回去試一下再回來修改這個回答。

我們知道我們在layout放入乙個控制項時需要定義他的寬高,比如wrap_content啊什麼的。這裡也不例外,我們addcards時需要設定寬高。

通過這個我們能知道乙個格仔的大小。int cardwidth=(math.min(w, h)-10)/4;這個你也許不理解,確實也不好說,看到後面card你會發現這是很簡單的事情。

所以這裡正確寫法是這樣的

//定義螢幕橫豎

@override

protected void onsizechanged(int w,int h,int oldw,int oldh)

然後插入卡片

//新增卡片

private void addcards(int cardwidth,int cardheight)   

}  }

這裡其實是不是應該放到其他地方總結呢,因為card累還沒寫。不過這個光看邏輯是很簡單的事情。就是幾個語句比較難。

c=new card(getcontext())的意思是,新建乙個card類。

addview()的意思是將插入這個控制項並且指定寬高。

cardmap[x][y]的意思是通過xy的方式標定每個位置的card。當然,之前你要申明乙個二維陣列就像宣告乙個int型別一樣。我就不說了

CEGUI重點難點集

感覺cegui確實不想很多商業成熟的sdk,有些地方的表現不盡如人意,但是畢竟是個開源專案,使得我們能根據自己需求定製自己的功能。但在定製需求之前,我們需要對cegui進行乙個比較詳細的了解才能夠得心應手的定製需求。下面就將學習cegui過程中遇到的重點難點羅列起來,方便自己和一起學習。affect...

推薦系統的重點 難點問題

1 特徵提取問題 2 模型過擬合問題 可擴充套件性問題 推薦系統中推薦演算法無法完全掌握使用者每個方面的興趣和需求,因為使用者之前沒有對足夠多類別的物件進行評價。過擬合現象是指系統推薦給使用者的物件與使用者剛剛看過的不是太相似,就是太不相關。模型過擬合 過學習 的問題本質上來自於資料的不完備性,這在...

Linux 裝置驅動的重點 難點

編寫 linux 裝置驅動要求工程師有非常好的硬體基礎,懂得 sram flash sdram 磁碟的讀寫方式,uart i2c usb 等裝置的介面以及輪詢 中斷 dma 的原理,pci 匯流排的工作方式以及 cpu 的記憶體管理單元 mmu 等。編寫 linux 裝置驅動要求工程師有非常好的 c...