天天看點

安卓項目五子棋代碼詳解(一)

暑假一時心血來潮,就是做了一個五子棋的安卓開發項目,個人感覺從中學到了許多,也是把開發的經驗寫出來,友善以後自己複習,也友善他人學習~~

廢話不多說,先來張已經完成的圖檔——

安卓項目五子棋代碼詳解(一)
我設計了一個更換背景的功能,以下是更換背景之後的圖檔——
安卓項目五子棋代碼詳解(一)

好啦,那接下來就是進入正題——

界面的這些先放到一邊,五子棋主要核心是實作能夠下棋,能夠判斷輸赢,我的這個項目還是簡單的單人遊戲,适合自己一個人玩耍

安卓項目五子棋代碼詳解(一)
安卓項目五子棋代碼詳解(一)

,我就先說明核心的部分,其他的功能之後一步步的講解。

首先就是要實作一個自定義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中可選擇有三種選擇:

  1. Paint.Style.STROKE 隻繪制圖形輪廓(描邊)
  2. Paint.Style.FILL 隻繪制圖形内容
  3. Paint.Style.FILL_AND_STROKE 既繪制輪廓也繪制内容

  paint.setDither()方法的意義:

  設定是否使用圖像抖動處理,會使繪制出來的圖檔顔色更加平滑和飽滿,圖像更加清晰

  paint.setAntiAlias的意義:

  設定是否使用抗鋸齒功能,會消耗較大資源,繪制圖形速度會變慢

  

之後,重寫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多方法看了半天都是理不清其中的關系,看得心又累,眼又累……

這一期便是到這裡了,下一期再繼續詳細解析,感謝觀看!!(如果有人看的話……<( ̄ˇ ̄)/)

提問之前,請先看提問須知

點選右側圖示發起提問

安卓項目五子棋代碼詳解(一)

或者加入QQ群一起學習

安卓項目五子棋代碼詳解(一)

TornadoFx學習交流群:1071184701

安卓項目五子棋代碼詳解(一)

繼續閱讀