Android斗地主游戲的牌桌實現

pc688 9年前發布 | 6K 次閱讀 Java Android

發一個Android斗地主游戲的牌桌實現。

為了節約內存資源,每張撲克牌都是剪切形成的,當然這也是當前編程的主流方法。

1、主Activity

package com.bison;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

/**

  • 求某公司包養
  • @author Bison
  • /
    public class PukeActivity extends Activity {
    /** Called when the activity is first created.
    /
    @Override
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);  
    // 這個事隱藏標題欄,不解釋   
    requestWindowFeature(Window.FEATURE_NO_TITLE);  
    // 隱藏狀態欄,你懂的   
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
            WindowManager.LayoutParams.FLAG_FULLSCREEN);  
    /* 
     * 開始有考慮使屏幕上撲克的排列隨屏幕的分辨率變動 結果貌似不好做,注釋掉了 Display display = 
     * getWindowManager().getDefaultDisplay(); int screenWidth = 
     * display.getWidth(); int screenHeight = display.getHeight(); 
     */  
    
    // 使用代碼鎖定橫屏   
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
    // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);這個是豎屏   
    setContentView(new GameView(this));  
    

    }
    } 2、牌桌頁面

package com.bison;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import com.bison.utils.Person;

/**

  • 牌桌,會被老婆罵,最好不要上去,你懂的
  • 撲克圖片來源,和牌桌背景在文章的下面。 撲克背面圖等我沒上傳,玩家自行百度
  • @author Bison
  • */
    public class GameView extends SurfaceView implements SurfaceHolder.Callback {
    private FlushThread thread = null;// 刷幀線程
    private Bitmap sourceBitmap = null;// 撲克圖片來源
    private Bitmap backgroundDesk = null;// 牌桌背景
    private Bitmap backgroundPuke = null;// 撲克背面

    private final Person person;
    private int pukeWidth = 0;// 撲克的寬
    private int pukeHeight = 0;// 撲克的高
    private int deskWidth = 0;// 牌桌的寬
    private int deskHeight = 0;// 牌桌的高
    private int left = 0;// 我自己首張牌左距離

    public GameView(Context context) {

    super(context);  
    getHolder().addCallback(this);  
    this.thread = new FlushThread(getHolder(), this);// 實例化線程   
    initBitmap();// 實例化圖片   
    this.person = new Person();// 實例化Person類   
    this.left = deskWidth / 2 - (16 * 25 + pukeWidth) / 2;// 左距開始時賦值   
    

    }

    private void initBitmap() {// 初始化圖片

    sourceBitmap = BitmapFactory.decodeResource(getResources(),  
            R.drawable.smallcard);  
    pukeWidth = sourceBitmap.getWidth() / 14;// 每張撲克的寬高   
    pukeHeight = sourceBitmap.getHeight() / 4;  
    
    backgroundDesk = BitmapFactory.decodeResource(getResources(),  
            R.drawable.gameback2);  
    
    deskWidth = backgroundDesk.getWidth();// 牌桌的寬高   
    deskHeight = backgroundDesk.getHeight();  
    
    backgroundPuke = BitmapFactory.decodeResource(getResources(),  
            R.drawable.cardback);  
    

    }

    @Override
    protected void onDraw(Canvas canvas) {

    // 繪制牌桌   
    canvas.drawBitmap(backgroundDesk, 0, 0, null);  
    personPaint(canvas, pukeWidth, pukeHeight);  
    deskthreePukes(canvas, pukeWidth, pukeHeight);  
    

    }

    /* 繪制每個玩家手里的牌 /
    public void personPaint(Canvas c, int pukeWidth, int pukeHeight) {

    Rect src = new Rect();  
    Rect dst = new Rect();  
    
    // 遍歷數組   
    for (int i = 0; i < 3; i++) {  
        for (int j = 0; j < 17; j++) {  
            if (i == 0) {// 左手邊玩家,不用繪出正面   
                // src = person.cardRect(person.person1[j], pukeWidth,   
                // pukeHeight);   
                // dst.set(10, j * 20, 10 + pukeWidth, j * 20 + pukeHeight);   
                c.drawBitmap(backgroundPuke, 35, 85, null);  
            }  
            if (i == 1) {// 自己   
                src = person.cardRect(person.person2[j], pukeWidth,  
                        pukeHeight);  
                dst.set(left + j * 25, this.deskHeight - 20 - pukeHeight,  
                        left + j * 25 + pukeWidth, deskHeight - 20);  
                c.drawBitmap(sourceBitmap, src, dst, null);  
            }  
            if (i == 2) {// 右手邊玩家,同樣不用繪出正面   
                // src = person.cardRect(person.person3[j], pukeWidth,   
                // pukeHeight);   
                // dst.set(this.screenWidth - 10 - pukeWidth, j * 20,   
                // this.screenWidth - 10, j * 20 + pukeHeight);   
                c.drawBitmap(backgroundPuke, deskWidth - 35 - pukeWidth,  
                        85, null);  
            }  
        }  
    }  
    

    }

    /* 繪制三張底牌 /
    private void deskthreePukes(Canvas c, int pukeWidth, int pukeHeight) {

    Rect src = new Rect();  
    Rect dst = new Rect();  
    for (int i = 0; i < 3; i++) {  
        src = person.cardRect(person.threePukes[i], pukeWidth, pukeHeight);  
        dst.set(280 + i * pukeWidth, 12, 280 + (i + 1) * pukeWidth,  
                12 + pukeHeight);  
        c.drawBitmap(sourceBitmap, src, dst, null);  
    }  
    

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

    // 正在研究點擊彈出相應的撲克   
    return super.onTouchEvent(event);  
    

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,

        int height) {  
    

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

    this.thread.setFlag(true);  
    this.thread.start();  
    

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    boolean retry = true;  
    this.thread.setFlag(false);  
    while (retry) {  
        try {  
            thread.join();  
            retry = false;  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
    }  
    
    

    }

    // 刷幀線程,這個不解釋,實在看不懂,M我:289302487@qq.com
    class FlushThread extends Thread {

    private boolean flag = false;  
    private final int span = 500;  
    private final GameView gameView;  
    private final SurfaceHolder holder;  
    
    public FlushThread(SurfaceHolder holder, GameView gameView) {  
        this.gameView = gameView;  
        this.holder = holder;  
    }  
    
    @Override  
    public void run() {  
        Canvas canvas;  
        while (this.flag) {  
            canvas = null;  
            try {  
                canvas = this.holder.lockCanvas(null);  
                synchronized (this.holder) {  
                    this.gameView.onDraw(canvas);  
                }  
            } finally {  
                if (canvas != null) {  
                    this.holder.unlockCanvasAndPost(canvas);  
                }  
            }  
    
            try {  
                Thread.sleep(span);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
    
    public boolean isFlag() {  
        return flag;  
    }  
    
    public void setFlag(boolean flag) {  
        this.flag = flag;  
    }  
    
    

    }

}
</pre>
3、相關實體類

撲克牌類:

package com.bison.utils;

import java.util.Random;

/**

  • 生成一副洗好的牌,并且 設計為單例模式
  • @author Bison
  • */
    public class Cards {
    // 聲明一副撲克牌
    public int[] pukes = new int[54];

    private static Cards cardsInstance = null;

    private Cards() {

    setPuke();  
    shuffle();  
    

    }

    public static Cards getInstance() {

    if (cardsInstance == null) {  
        cardsInstance = new Cards();  
    }  
    return cardsInstance;  
    

    }

    /* 給54張撲克牌賦值 :1~54 /
    private void setPuke() {

    for (int i = 0; i < 54; i++) {  
        pukes[i] = i + 1;  
    }  
    

    }

    /* 洗牌 /
    private void shuffle() {

    Random rdm = new Random();  
    for (int i = 0; i < 54; i++) {  
        // random.nextInt();是個前閉后開的方法:0~53   
        int rdmNo = rdm.nextInt(54);  
        int temp = pukes[i];  
        pukes[i] = pukes[rdmNo];  
        pukes[rdmNo] = temp;  
    }  
    

    }
    }

玩家類:

package com.bison.utils;

import android.graphics.Rect;

/**

  • 這個是玩家的實體類
  • @author Bison
  • */
    public class Person {
    private final Cards mCards = Cards.getInstance();

    public int[] person1 = new int[17];
    public int[] person2 = new int[17];
    public int[] person3 = new int[17];

    // 余下三張屬于地主的
    public int[] threePukes = new int[3];

    public Person() {

    personHold(mCards.pukes);  
    

    }

    /* 分牌 /
    private void personHold(int[] pukes) {

    int k = 0;  
    for (int i = 0; i < 3; i++) {  
        if (i == 0) {  
            for (int j = 0; j < 17; j++) {  
                person1[j] = pukes[k++];  
            }  
            // 將其排序   
            sort(person1);  
        }  
        if (i == 1) {  
            for (int j = 0; j < 17; j++) {  
                person2[j] = pukes[k++];  
            }  
            // 將其排序   
            sort(person2);  
        }  
        if (i == 2) {  
            for (int j = 0; j < 17; j++) {  
                person3[j] = pukes[k++];  
            }  
            // 將其排序   
            sort(person3);  
        }  
    }  
    
    threePukes[0] = pukes[51];  
    threePukes[1] = pukes[52];  
    threePukes[2] = pukes[53];  
    

    }

    /* 對每個玩家手里的牌排序:使用冒泡排序 /
    private void sort(int[] ary) {

    for (int i = 0; i < ary.length; i++) {  
        for (int j = 0; j < ary.length - i - 1; j++) {  
            if (ary[j] > ary[j + 1]) {  
                int temp = ary[j];  
                ary[j] = ary[j + 1];  
                ary[j + 1] = temp;  
            }  
        }  
    }  
    

    }

    /**

    • 對應撲克所在圖片上的位置
    • 1 5 9 ………… 53
    • 2 6 10 ………… 54
    • 3 7 11
    • 4 8 12 */
      public Rect cardRect(int cardValue, int width, int height) {
      int x = 0, y = 0;
      if (cardValue % 4 == 0) {

       x = cardValue / 4 - 1;  
       y = 4;  
      

      } else {

       x = cardValue / 4;  
       y = cardValue % 4;  
      

      }

      int left = x width;
      int top = (y - 1)
      height;
      int right = (x + 1) width;
      int bottom = (y)
      height;
      return new Rect(left, top, right, bottom);
      }
      }
      </pre> 斗地主還是可以做成很復雜的。相關圖片

 本文由用戶 pc688 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!