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我:[email protected] 
 
        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斗地主棋牌游戏牌桌实现源码下载,码迷,mamicode.com

时间: 2024-11-03 22:17:07

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

网狐678正版全套共20多款棋牌游戏完整数据库+支付源码下载

网狐678正版全套含几款捕鱼共20多款游戏完整数据库+支付接口+原版模板+商业组件免费下载. 今天发布一个网狐678的正版源码!  带捕鱼游戏等20多款游戏!完整数据库+网站前台集成支付接口+原版模板+商业组件!亲测绝对可以使用,网狐678正版内核商业版,这都是在淘宝上卖上千的源码!同样的源码,在我们这里只需要免费下载.还不心动么亲. 源码下载地址:http://www.yxkfw.com/thread-20-1-1.html

WS彩票游戏完整商业程序源码下载

WS彩票游戏完整商业程序源码下载:http://www.ttkmwl.com/thread-640-1-1.html 源码介绍:完美架设不会架设的不要乱叫程序不完整   不能架设我头给你当凳子坐   求银票换点其他的程序 1.在IIS6.0  安装NET4.O 在IIS里面设置NET4.0版本 首页设置INDEX.ASPX   2.添加.htm  .auth   映射为aspx.dll3.安装SQL2008 R2 还原数据库 BAK 4.修改配置文件webconfig <add name="

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

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/51592930 手机的两种模式 : 在下面有详细的图片示例; -- Recovery 模式 : 音量键增加 + 电源键, 长按上述组合键, 看到 "MI" 的 LOGO 后即进入 Recovery 模式; -- Fastboot 模式 : 音量键减小 + 电源键, 长按上述组合键, 看到 "FASTBOOT" 后, 即 进入 FA

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

1.主Activity [java] view plain copy print? <span style="font-size:18px;color:#3333ff;">package com.bison; import android.app.Activity; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.view.Window; import andr

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

最近一直在学习Android,在各大社区逛,总结下自己看到的一些不错的源码.希望可以给大家带来帮助. 1.Android精品源码:带动态效果的Button(按钮) 最喜欢各种效果的按钮了,没办法就是这么的呆萌是不是?带动态效果的Button(按钮)可要比静态的按钮炫酷的多了,大家看到效果图就知道了,那么Android开发者们快动手做一个自己喜欢的动态按钮吧! 很炫的效果图,源码下载点击:Android精品源码:带动态效果的Button(按钮) 2.一个漂亮的按钮库[Android精品] 一个不要

cocos2d-X 棋牌手机游戏《萌妹斗地主》网络版完整源码下载

源码介绍 <萌妹斗地主>--cocos2d-x手机游戏源码下载 Client:客户端源代码(lua) 更改连接服务器地址两种方式: 1.打开C:\Windows\System32\drivers\etc\hosts文件,增加:127.0.0.1 ddz.36you.net 2.打开Lua文件:Client\lua\lib\NetHelper.lua, 修改67行代码 "ddz.36you.net:9700"改为"127.0.0.1:9700" Serve

cocos2d-X 卡牌手机游戏《刀塔传奇》完整源码下载

源码介绍 <刀塔传奇>--cocos2d-x手机游戏源码下载 <刀塔传奇>是一款以Dota故事为背景的动作卡牌手机游戏战斗DEMO,以创新的轻操作战斗玩法,打破传统卡牌游戏操作呆板.无脑等待的瓶颈,玩家指尖手动掌控英雄大招,把握施放大招的顺序,尽享酷炫技能带来的极致视觉体验.<刀塔传奇> iOS/安卓平台长时间高居排行榜榜首,创下了2014年手游人气神话. 大小:7 MB 测试环境 引擎版本:3.0 开发工具:vs2012 测试说明:基于cocos2d-x3.0和vs2

Q版疯狂大炮游戏android源码下载

给大家分享一款非常不错的Q版疯狂大炮游戏android源码下载,喜欢的朋友可以下载. 项目源码下载:http://code.662p.com/view/2314.html <ignore_js_op> <ignore_js_op>  详细说明:http://android.662p.com/thread-297-1-1.html

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

来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设置 游戏互不干扰 这个象棋大厅程序完全可以当做是C#委托事件的教程,而且游戏大厅功能也很多,服务器还可设置人数和桌数,大厅客户端也实时更新相关数据. 源码下载地址:http://www.ajerp.com/bbs/forum.php?mod=viewthread&tid=29&extra=pa