本次给大家分享下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);  
        }  
    }

PS:斗地主还是可以做的很复杂的。更多内容还请继续关注我,或者前往我组办的棋牌社区查看。

Android斗地主棋牌游戏牌桌实现源码下载的更多相关文章

  1. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  2. Android --- 斗地主 [牌桌实现源码]

    1.主Activity <span style="font-size:18px;color:#3333ff;">package com.bison; import an ...

  3. delphi xe5 android 服务端和手机端的源码下载

    xe5 android的服务端和手机客户端的源代码下载地址 http://files.cnblogs.com/nywh2008/AndroidTest.rar

  4. Android精品资源汇总,10个源码(持续更新)

    最近一直在学习Android,在各大社区逛,总结下自己看到的一些不错的源码.希望可以给大家带来帮助. 1.Android精品源码:带动态效果的Button(按钮) 最喜欢各种效果的按钮了,没办法就是这 ...

  5. android源码-安卓源码-Android源码下载-安卓游戏源码

    android源码   高仿精仿金山手机卫士应用源码V1.2 高仿精仿金山手机卫士应用源码,该应用的级别实现了金山卫士的级别功能了,可以说跟现实中我们使用的金山卫士应用的功能几乎差不 人气:9286  ...

  6. C#中国象棋+游戏大厅 服务器 + 客户端源码

    来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...

  7. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  8. Android 源码下载方法(Git 方式clone)

    Android源码对于Android开发者来说,迟早有一天你会用到的,所以就记录一下,分享给读者,希望对读者有用 这里需要使用到Git相关知识,不清楚的可以先阅读,了解的可以跳过 Git-Tortoi ...

  9. Android Studio2.x版本无法自动关联源码的解决方法

    Android Studio2.x版本无法自动关联源码的解决方法 在学习android开发过程中,对于一个不熟悉的类,阅读源码是一个很好的学习方式,使用andorid studio开发工具的SDK M ...

随机推荐

  1. 即时聊天IM之四 Android客户端IM帮助类编写

    图文无关一起娱乐: 这一篇我们开始写Android端的Smack版主类,后面Android的IM功能都是通过这个帮助类实现的 引用类库: 因为我用的是IDE是Android Studio,所以我通过g ...

  2. C# in depth学习(1)

    第一章,C#开发的进化史 1.简单数据类型 2.排序 Sorting an ArrayList using IComparer (C# 1) Sorting a List<Product> ...

  3. nano编辑器使用教程

    使用Linux VPS会经常和编辑器打交道,一般常用的是vi和nano,虽然vi功能强大,但是相对新手来要稍微难上手,GNU nano是一个体积小巧而功能强大的文本编辑器.这里就简单说一下nano的使 ...

  4. OpenGl在VS中的配置

    刚开始接触OpenGl的时候难免会遇到一些问题,这些问题可能和程序无关,只是一些编译环境的设置和头文件的安装,特别整理了一下,如下: (1)将gult32.dll,glut.dll复制到windows ...

  5. PE注入

    // PE注入.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include &l ...

  6. html5之canvas画图基础

    HTML5+CSS3的好处是,你可以编写一个页面分别用于不同的平台,只需要设置不同的css样式就可以了,现在基本主流浏览器都支持全新的HTML5和CSS3,因为它的跨平台开发.因为是原生代码所以它的页 ...

  7. 如何用python搞定验证码中的噪点

    背景:朋友在为"关山口男子职业技术学校"写一款校园应用,于是找MoonXue写一个学生选课系统的登录接口.为了搞定这个接口,不得不先搞定这个系统的验证码. 验证码大概是这个样子 看 ...

  8. (BFS)aoj0558-Cheese

    题目地址 根据题意,必须按从1吃到n的顺序.建立vi数组记录去没去过某一点,从起点向四周搜索,合法且未去过就入队列.每当找到符合此时应吃的位置,就将这个位置改为'.'并刷新vi数组,清空队列(因为必须 ...

  9. SQL Server数据库性能优化之SQL语句篇【转】

    SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...

  10. JAVA内存管理

    java与c++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙.墙外面的人想进去,墙里面的人想出去. 1.java内存分布 程序计数器 栈(局部变量.操作数.动态链接.方法出口) 每一个方法从调用 ...