Android开发的斗地主牌桌实现代码
来源:http://blog.csdn.net/hopezhangbo/article/details/7434284
发一个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; } } }
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);  
    }  
}  
