天天看點

安卓遊戲開發之【紮金花遊戲】(四)

GameView.java

遊戲界面的繪制類:繼承View類,實作OnTouchListener,Runnable接口,實作public GameView(Contextcontext){},protectedvoid onDraw(Canvas canvas){},public void run(){},public boolean onTouch(Viewv,MotionEvent event){}

1、設定遊戲線程的開關;

private Thread currentThread;

// 開啟遊戲的線程

    public void startThread()

    {

       currentThread = new Thread(this);

       currentThread.start();

    }

    // 停止遊戲的線程

    public void stopThread()

    {

       currentThread = null;

    }

    //線程開始的運作方法

    public void run()

    {

       while (currentThread != null)

       {

           //執行遊戲的狀态

           this.logic();

           this.postInvalidate();

           try

           {

              Thread.sleep(80);

           } catch (InterruptedException e)

           {

              e.printStackTrace();

           }

       }

    }

2、圖檔資源的初始化;

    public GameView(Context context)

    {

       super(context);

       // 設定監聽方法

       setOnTouchListener(this);

       cardBitmap = new Bitmap[52];

       // 導入背景,繼續,結束等圖檔

       try

       {

           InputStream isBack =getContext().getAssets()

                  .open("background.png");

           InputStream isNext =getContext().getAssets().open("next.png");

           InputStream isOver =getContext().getAssets().open("over.png");

           back = BitmapFactory.decodeStream(isBack);

           next = BitmapFactory.decodeStream(isNext);

           over = BitmapFactory.decodeStream(isOver);

           // 導入52張牌的圖檔

           for (int i = 2; i <= 14; i++)

           {

              cardBitmap[i - 2] = BitmapFactory.decodeStream(getContext()

                       .getAssets().open("cards/h" + i + ".png"));

                cardBitmap[i - 2 + 13] = BitmapFactory

                       .decodeStream(getContext().getAssets().open(

                               "cards/d" + i + ".png"));

                cardBitmap[i - 2 + 26] = BitmapFactory

                       .decodeStream(getContext().getAssets().open(

                               "cards/s" + i + ".png"));

                cardBitmap[i - 2 + 39] = BitmapFactory

                       .decodeStream(getContext().getAssets().open(

                               "cards/c" + i + ".png"));

           }

       } catch (IOException e)

       {

           e.printStackTrace();

       }

       // 初始化52張牌

       ZhaJinHua.init();

       // 洗牌

       ZhaJinHua.xiPai();

       // 設定玩家和電腦人

       person = new Person[]

       { new Person(), new PersonWithAI() };

       // 給玩家和電腦人發牌

       ZhaJinHua.faPai(person);

       // 對玩家和電腦人的牌排序

       for (Person p : person)

       {

           ZhaJinHua.sort(p.myCards);

       }

}

3、圖檔和文字的繪制;

// 建立Paint的執行個體

Paint paint;

// 設定遊戲的狀态

public int gamestate;

    protected void onDraw(Canvascanvas) {

        super.onDraw(canvas);

        // 繪制背景,繼續,結算等圖檔

        canvas.drawBitmap(back, 0, 0, paint);

        canvas.drawBitmap(next, 600, 300, paint);

        canvas.drawBitmap(over, 600, 400, paint);

        // 繪制52張牌

        ZhaJinHua.drawSelf(canvas, paint, cardBitmap, 0, 0);

        // 繪制玩家和電腦人的牌

        for (int i = 0; i < person.length; i++) {

            Person p = person[i];

            p.drawSelf(canvas, paint, cardBitmap, 0, 150 * (i + 1));

        }

        // 設定遊戲的狀态

        String str = "";

        switch (gamestate) {

        case 0:

            str = "洗牌中,遊戲即将開始!";

            break;

        case 1:

            str = "玩家操作!";

            break;

        case 2:

            str = "電腦操作!";

            break;

        case 3:

            str = "遊戲結束,下一輪即将開始!";

            break;

        default:

            break;

        }

        canvas.drawText(str, 200, 400, paint);

}

4、初始化遊戲的狀态:遊戲的初始化,自己下注的狀态,電腦下注的狀态,遊戲結算狀态。

    public void logic()

    {

        // 0:遊戲初始化 1:玩家下注2:電腦下注 3:遊戲結算

        switch (gamestate)

        {

        case 0:

            ZhaJinHua.faPai(person);

            for (Person p : person)

            {

                ZhaJinHua.sort(p.myCards);

            }

            gamestate = 1;

            break;

        case 1:

            break;

        case 2:

            PersonWithAI pai = (PersonWithAI) person[1];

            if (pai.isContinue(person[0]))

            {

                pai.score--;

                pai.wager++;

                gamestate = 1;

            } else

            {

                gamestate = 3;

            }

            break;

        case 3:

            // 比較兩副牌的大小

            int i = ZhaJinHua.biJiao(person[0].myCards, person[1].myCards);

            // 玩家勝利,加上自己押注和電腦押注的分值

            if (i == 1)

            {

                person[0].score += person[0].wager + person[0].wager;

            }

            // 電腦勝利,則加上自己和電腦押注的分值

            if (i == -1)

            {

                person[1].score += person[0].wager + person[0].wager;

            }

            // 打平手,各自加上各自押注的分值

            if (i == 0)

            {

                person[0].score += person[0].wager;

                person[1].score += person[1].wager;

            }

            // 完成分值計算,把押注清零

            person[0].wager = 0;

            person[1].wager = 0;

            // 重新發牌

            gamestate = 0;

            break;

        default:

            break;

        }

}

5、設定螢幕觸摸事件;

    public boolean onTouch(View v, MotionEvent event)

    {

        // 如果沒有按下,則傳回

        if (event.getAction() != event.ACTION_DOWN)

        {

            return true;

        }

        // 如果不是玩家操作,則傳回

        if (gamestate != 1)

        {

            return true;

        }

        // 擷取點選的x,y坐标

        float x = event.getX();

        float y = event.getY();

        if (x > 600 && x < 750 &&y > 300 && y < 370)

        {

            person[0].score--;

            person[0].wager++;

            gamestate = 2;

        }

        if (x > 600 && x < 750 &&y > 400 && y < 470)

        {

            // 遊戲結束

            gamestate = 3;

        }

        return true;

    }