暑假一時心血來潮,就是做了一個五子棋的安卓開發項目,個人感覺從中學到了許多,也是把開發的經驗寫出來,方便以后自己復習,也方便他人學習~~
廢話不多說,先來張已經完成的圖片——

我設計了一個更換背景的功能,以下是更換背景之后的圖片——

好啦,那接下來就是進入正題——
界面的這些先放到一邊,五子棋主要核心是實現能夠下棋,能夠判斷輸贏,我的這個項目還是簡單的單人游戲,適合自己一個人玩耍


首先就是要實現一個自定義View,新建一個Pannel類,讓其繼承View,並一個生成帶參數的構造方法
之后,在構造方法中調用一個init()方法
public Panel(Context context, AttributeSet attrs) { super(context, attrs); init();//調用init()方法 }
接下來我們定義一個init()方法,這個方法主要用來設置畫筆的一些相關屬性和初始化棋子圖片資源並改其大小,init()方法定義如下
private void init() { paint.setColor(Color.BLACK);//設置畫筆顏色為黑色 paint.setAntiAlias(true);//開啟抗鋸齒功能 paint.setDither(true);//使用圖像抖動處理 paint.setStyle(Paint.Style.STROKE);//只繪制圖形輪廓(描邊) Whitepiece = BitmapFactory.decodeResource(getResources(), R.drawable.stone_w2);//初始化白色棋子圖片 Blackpiece = BitmapFactory.decodeResource(getResources(), R.drawable.stone_b1);//初始化黑色棋子圖片 }
補充:
paint.setStyle中可選擇有三種選擇:
- Paint.Style.STROKE 只繪制圖形輪廓(描邊)
- Paint.Style.FILL 只繪制圖形內容
- Paint.Style.FILL_AND_STROKE 既繪制輪廓也繪制內容
paint.setDither()方法的意義:
設定是否使用圖像抖動處理,會使繪制出來的圖片顏色更加平滑和飽滿,圖像更加清晰
paint.setAntiAlias的意義:
設置是否使用抗鋸齒功能,會消耗較大資源,繪制圖形速度會變慢
之后,重寫ondraw方法,這個方法就是五子棋核心的方法, 是用來畫棋盤和棋子
之后,重寫ondraw方法,這個方法就是五子棋核心的方法, 是用來畫棋盤和棋子
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawBoard(canvas);//畫棋盤 drawPiece(canvas);//畫棋子 checkGameover();//檢查游戲是否結束 }
可以看到,我在onDraw()方法里面中調用了一個checkGameOver()方法,這個方法就是字面意思,用來檢查游戲是否結束,結束了就可以停止onDraw方法,也就是用戶觸摸后,paint不會再繪制棋子來,游戲結束了還能繪制棋子,這個想想就有些不科學,是吧?這也就是這個checkGameOver()方法存在的意義
除此之外,還需要重寫一個onTouchEvent()方法,這個方法 用來判斷當前用戶手指觸摸狀態並實現下棋(也就是在棋盤中繪制棋子)的功能,有了這個辦法,便能與onDraw()方法聯系起來。
詳細地解釋為,判斷用戶的手指交互狀態,並獲取用戶手指觸摸處的坐標,將坐標放置到一個數組(也可以說是點集合)中,之后由onDraw()方法中的drawPiece()方法獲取數組中的坐標,在坐標出將棋子繪制出來
onTouchEvent()方法代碼如下:
@Override public boolean onTouchEvent(MotionEvent event) { if(IsGameOver){ return false; } int action = event.getAction(); if(action == MotionEvent.ACTION_UP){//狀態為單點觸摸離開時獲取當前觸摸坐標 int x= (int)(event.getX()); int y= (int)(event.getY()); Point p = getValidPoint(x,y); if(Whitearray.contains(p)|| Blackarray.contains(p)){ return false; } if(IsWhite){ Whitearray.add(p); }else{ Blackarray.add(p); } invalidate(); //invalidate()是用來刷新View的,必須在UI線程中 IsWhite = !IsWhite; } return true; }
MotionEvent后可以選擇的狀態有很多,有單點觸摸向下(ACTION_DOWN),單點觸摸向上(ACTION_UP)等等,這里選擇了單點觸摸向上的狀態,原因為有着更高的交互性和邏輯性,我們可以做一個假設,如果用戶下到的時候,忽然發覺自己下錯地方了,但是他的手指還是在屏幕上的,如果我們選擇了單點觸摸向下的這個狀態,用戶的手指一觸摸到屏幕,棋子就已經落下(繪制)了,這樣子的話不就會讓用戶體驗變差了嗎?但是,如果我們選擇了單點觸摸向上,也就是在用戶手指松開的時候才繪制棋子,那么上面的情景就是得以很好的解決,用戶只需要在屏幕上移動手指,到了合適位置松開手指便是可以落子。
呃……是不是說太多口水話了??好吧,反正也就是我自己看,沒事。
看了一下下面的代碼,感覺沒有什么好說的了,就這樣了
第一期我解釋的主要是五子棋項目的主要方法,理清它們之間的關系,之后都是好理解了。
第一期我解釋的主要是五子棋項目的主要方法,理清它們之間的關系,之后都是好理解了。
我自己感覺這樣方法的話有助於加深理解,不然你直接去看一個項目,N多方法看了半天都是理不清其中的關系,看得心又累,眼又累……
這一期便是到這里了,下一期再繼續詳細解析,感謝觀看!!(如果有人看的話……<( ̄ˇ ̄)/)