imooc學習筆記 五子棋

2021-07-14 03:52:35 字數 4338 閱讀 7707

本次要練習的是自定義控制項,並不是數學邏輯 ,所以主要的目的就是繪製棋盤。

養的貓咪跑丟了 鬱悶ing….

首先看看效果圖,然後分析一下。

首先,背景圖 這個交給父容器

然後棋盤,可以分為兩部分,第一是線、 第二是棋子。

分析:

想要知道長和寬當中最小的那一方,前提是知道長和寬,獲取長和寬的方法

那麼獲取寬高可以這樣:

onmeasure方法中:

int width_size = measurespec.getsize(widthmeasurespec);

int height_size = measurespec.getsize(heightmeasurespec);

log.e("asd", getmeasuredwidth() + "****" + getmeasuredheight());

log.e("asd", getwidth() + "++++" + getheight());

log.e("asd", width_size + "----" + height_size);

可是,這三個哪個是裝置寬高、哪個是獲取控制項寬高呢?於是我測了一下:

.myview2.myview

android:layout_width="100dp"

android:layout_height="100px" />

06-28

20:57:55.872

13720-13720/sunshine.myview2 e/asd: 0,0

06-28

20:57:55.872

13720-13720/sunshine.myview2 e/asd: 0,0

06-28

20:57:55.912

13720-13720/sunshine.myview2 e/asd: 0****0

06-28

20:57:55.912

13720-13720/sunshine.myview2 e/asd: 0++++0

06-28

20:57:55.912

13720-13720/sunshine.myview2 e/asd: 200----1118

06-28

20:57:55.912

13720-13720/sunshine.myview2 e/asd: 200****1118

06-28

20:57:55.912

13720-13720/sunshine.myview2 e/asd: 0++++0

06-28

20:57:55.912

13720-13720/sunshine.myview2 e/asd: 200----100

06-28

20:57:56.116

13720-13720/sunshine.myview2 e/asd: 200****100

06-28

20:57:56.116

13720-13720/sunshine.myview2 e/asd: 200++++100

06-28

20:57:56.116

13720-13720/sunshine.myview2 e/asd: 200----1118

06-28

20:57:56.116

13720-13720/sunshine.myview2 e/asd: 200****1118

06-28

20:57:56.116

13720-13720/sunshine.myview2 e/asd: 200++++100

06-28

20:57:56.116

13720-13720/sunshine.myview2 e/asd: 200----100

開啟程式時候控制項是會不斷測量的(都這麼說我也就當成定理了),應該看最後測量的結果。

getmeasuredwidth()獲取的是200,getmeasuredheight()獲取的是1118.

getwidth()獲取的是200,getheight()獲取的是100.

width_size是200,height_size是100.

獲取到100的肯定都是畫素了,獲取到200應該是由於螢幕密度的原因,由dp轉化為px時候是1:2的關係了,也就都是獲取本控制項的大小(px)。

1118是什麼鬼呢,為啥前面是200,後面是1118!!!???

上網查了一下資料 覺得這裡說的很好這裡就不費時間了,主要內容如下:

①getmeasuredwidth方法獲得的值是setmeasureddimension方法設定的值,它的值在measure方法執行後就會確定

②getwidth方法獲得是layout方法中傳遞的四個引數中的mright-mleft,它的值是在layout方法執行後確定的

③一般情況下在onlayout方法中使用getmeasuredwidth方法,而在除onlayout方法之外的地方用getwidth方法。

取兩者中最小的作為矩形的邊後(minwidth),我們發現還有個距離裝置邊框那邊距的問題(相對於控制項是margin),我們將邊距預留為乙份棋盤格仔的minwidth,左右各1/2minwidth,也就是說我們畫線的時候要預留1/2minwidth的邊距。

畫線**(注意線的起點和重點,重複了就畫不出來了 =.= 由於不熟練,折騰了一番才出來):

@override

protected

void

ondraw(canvas canvas)

}

費了一番力氣的效果圖(畫筆設定如下):

ok,下一步就是棋子了,要想顯示棋子首先得先載入棋子,載入時候要先設定棋子大小,棋子大小要在onsizechanged中設定(為什麼呢,看方法名就能理解差不多了吧 - . - ),設定大小是用bitmap.createscaledbitmap方法,一開始我寫錯成bitmap.createbitmap了

createscaledbitmap(bitmap src, int dstwidth, int dstheight,boolean filter)

createbitmap(bitmap source, int x, int y, int width, int height,matrix m, boolean filter)

後來去看了下才知道bitmap.createscaledbitmap也是呼叫的bitmap.createbitmap方法。

載入完之後就要顯示出來啊,那怎麼顯示出來呢,肯定是觸發了之後顯示,那怎麼觸發呢,肯定找我們ontouchevent(motionevent event)方法啊…..

@override

public boolean ontouchevent(motionevent event)

if (event.getaction() == motionevent.action_up)

return super.ontouchevent(event);

}

重繪後再ondraw中畫出棋子就ok了

for (int i = 0; i < points.size(); i++)
看下最後的「成果」

下五子棋的bot 五子棋演算法

include include include include include include jsoncpp json.h c 編譯時預設包含此庫 define n 7 每個節點的分支數 以下為各棋型的識別碼 權重 define win 1 4000 define lose 2 4000 defi...

窮舉五子棋

本想窮舉五子棋必勝點,可惜呀,這貨窮舉太不現實了,寫出來了,根本沒辦法執行出來結果 include include include define rl 17 char s 14 int five rl rl void init void void print void int cs int i,in...

普通 五子棋

五子棋 五子棋是世界智力運動會競技專案之一,是一種兩人對弈的純策略型棋類遊戲,是世界智力運動會競技專案之一,通常雙方分別使用黑白兩色的棋子,下在棋盤直線與橫線的交叉點上,先形成5子連線者獲勝。棋具與圍棋通用,起源於中國上古時代的傳統黑白棋種之一。主要流行於華人和漢字文化圈的國家以及歐美一些地區,是世...