1、主Activity

  1. <span style="font-size:18px;color:#3333ff;">package com.bison;
  2. import android.app.Activity;
  3. import android.content.pm.ActivityInfo;
  4. import android.os.Bundle;
  5. import android.view.Window;
  6. import android.view.WindowManager;
  7. /**
  8. * </span>
  1. <span style="font-size:18px;color:#3333ff;"> * @author Bison
  2. *
  3. */
  4. public class PukeActivity extends Activity {
  5. /** Called when the activity is first created. */
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. // 这个事隐藏标题栏,不解释
  10. requestWindowFeature(Window.FEATURE_NO_TITLE);
  11. // 隐藏状态栏,你懂的
  12. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  13. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  14. /*
  15. * 开始有考虑使屏幕上扑克的排列随屏幕的分辨率变动 结果貌似不好做,注释掉了 Display display =
  16. * getWindowManager().getDefaultDisplay(); int screenWidth =
  17. * display.getWidth(); int screenHeight = display.getHeight();
  18. */
  19. // 使用代码锁定横屏
  20. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  21. // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);这个是竖屏
  22. setContentView(new GameView(this));
  23. }
  24. }</span>

2、牌桌页面

  1. <span style="color:#3333ff;">package com.bison;
  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.graphics.Canvas;
  6. import android.graphics.Rect;
  7. import android.view.MotionEvent;
  8. import android.view.SurfaceHolder;
  9. import android.view.SurfaceView;
  10. import com.bison.utils.Person;
  11. /**
  12. *
  13. * @author Bison
  14. *
  15. */
  16. public class GameView extends SurfaceView implements SurfaceHolder.Callback {
  17. private FlushThread thread = null;// 刷帧线程
  18. private Bitmap sourceBitmap = null;// 扑克图片来源
  19. private Bitmap backgroundDesk = null;// 牌桌背景
  20. private Bitmap backgroundPuke = null;// 扑克背面
  21. private final Person person;
  22. private int pukeWidth = 0;// 扑克的宽
  23. private int pukeHeight = 0;// 扑克的高
  24. private int deskWidth = 0;// 牌桌的宽
  25. private int deskHeight = 0;// 牌桌的高
  26. private int left = 0;// 我自己首张牌左距离
  27. public GameView(Context context) {
  28. super(context);
  29. getHolder().addCallback(this);
  30. this.thread = new FlushThread(getHolder(), this);// 实例化线程
  31. initBitmap();// 实例化图片
  32. this.person = new Person();// 实例化Person类
  33. this.left = deskWidth / 2 - (16 * 25 + pukeWidth) / 2;// 左距开始时赋值
  34. }
  35. private void initBitmap() {// 初始化图片
  36. sourceBitmap = BitmapFactory.decodeResource(getResources(),
  37. R.drawable.smallcard);
  38. pukeWidth = sourceBitmap.getWidth() / 14;// 每张扑克的宽高
  39. pukeHeight = sourceBitmap.getHeight() / 4;
  40. backgroundDesk = BitmapFactory.decodeResource(getResources(),
  41. R.drawable.gameback2);
  42. deskWidth = backgroundDesk.getWidth();// 牌桌的宽高
  43. deskHeight = backgroundDesk.getHeight();
  44. backgroundPuke = BitmapFactory.decodeResource(getResources(),
  45. R.drawable.cardback);
  46. }
  47. @Override
  48. protected void onDraw(Canvas canvas) {
  49. // 绘制牌桌
  50. canvas.drawBitmap(backgroundDesk, 0, 0, null);
  51. personPaint(canvas, pukeWidth, pukeHeight);
  52. deskthreePukes(canvas, pukeWidth, pukeHeight);
  53. }
  54. /** 绘制每个玩家手里的牌 */
  55. public void personPaint(Canvas c, int pukeWidth, int pukeHeight) {
  56. Rect src = new Rect();
  57. Rect dst = new Rect();
  58. // 遍历数组
  59. for (int i = 0; i < 3; i++) {
  60. for (int j = 0; j < 17; j++) {
  61. if (i == 0) {// 左手边玩家,不用绘出正面
  62. // src = person.cardRect(person.person1[j], pukeWidth,
  63. // pukeHeight);
  64. // dst.set(10, j * 20, 10 + pukeWidth, j * 20 + pukeHeight);
  65. c.drawBitmap(backgroundPuke, 35, 85, null);
  66. }
  67. if (i == 1) {// 自己
  68. src = person.cardRect(person.person2[j], pukeWidth,
  69. pukeHeight);
  70. dst.set(left + j * 25, this.deskHeight - 20 - pukeHeight,
  71. left + j * 25 + pukeWidth, deskHeight - 20);
  72. c.drawBitmap(sourceBitmap, src, dst, null);
  73. }
  74. if (i == 2) {// 右手边玩家,同样不用绘出正面
  75. // src = person.cardRect(person.person3[j], pukeWidth,
  76. // pukeHeight);
  77. // dst.set(this.screenWidth - 10 - pukeWidth, j * 20,
  78. // this.screenWidth - 10, j * 20 + pukeHeight);
  79. c.drawBitmap(backgroundPuke, deskWidth - 35 - pukeWidth,
  80. 85, null);
  81. }
  82. }
  83. }
  84. }
  85. /** 绘制三张底牌 */
  86. private void deskthreePukes(Canvas c, int pukeWidth, int pukeHeight) {
  87. Rect src = new Rect();
  88. Rect dst = new Rect();
  89. for (int i = 0; i < 3; i++) {
  90. src = person.cardRect(person.threePukes[i], pukeWidth, pukeHeight);
  91. dst.set(280 + i * pukeWidth, 12, 280 + (i + 1) * pukeWidth,
  92. 12 + pukeHeight);
  93. c.drawBitmap(sourceBitmap, src, dst, null);
  94. }
  95. }
  96. @Override
  97. public boolean onTouchEvent(MotionEvent event) {
  98. // 正在研究点击弹出相应的扑克
  99. return super.onTouchEvent(event);
  100. }
  101. @Override
  102. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  103. int height) {
  104. }
  105. @Override
  106. public void surfaceCreated(SurfaceHolder holder) {
  107. this.thread.setFlag(true);
  108. this.thread.start();
  109. }
  110. @Override
  111. public void surfaceDestroyed(SurfaceHolder holder) {
  112. boolean retry = true;
  113. this.thread.setFlag(false);
  114. while (retry) {
  115. try {
  116. thread.join();
  117. retry = false;
  118. } catch (InterruptedException e) {
  119. e.printStackTrace();
  120. }
  121. }
  122. }
  123. // 刷帧线程</span>
  1. <span style="color:#3333ff;">   class FlushThread extends Thread {
  2. private boolean flag = false;
  3. private final int span = 500;
  4. private final GameView gameView;
  5. private final SurfaceHolder holder;
  6. public FlushThread(SurfaceHolder holder, GameView gameView) {
  7. this.gameView = gameView;
  8. this.holder = holder;
  9. }
  10. @Override
  11. public void run() {
  12. Canvas canvas;
  13. while (this.flag) {
  14. canvas = null;
  15. try {
  16. canvas = this.holder.lockCanvas(null);
  17. synchronized (this.holder) {
  18. this.gameView.onDraw(canvas);
  19. }
  20. } finally {
  21. if (canvas != null) {
  22. this.holder.unlockCanvasAndPost(canvas);
  23. }
  24. }
  25. try {
  26. Thread.sleep(span);
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32. public boolean isFlag() {
  33. return flag;
  34. }
  35. public void setFlag(boolean flag) {
  36. this.flag = flag;
  37. }
  38. }
  39. }
  40. </span>

3、相关实体类

扑克牌类:

  1. <span style="font-size:18px;color:#3333ff;">package com.bison.utils;
  2. import java.util.Random;
  3. /**
  4. * 生成一副洗好的牌,并且 设计为单例模式
  5. *
  6. * @author Bison
  7. *
  8. */
  9. public class Cards {
  10. // 声明一副扑克牌
  11. public int[] pukes = new int[54];
  12. private static Cards cardsInstance = null;
  13. private Cards() {
  14. setPuke();
  15. shuffle();
  16. }
  17. public static Cards getInstance() {
  18. if (cardsInstance == null) {
  19. cardsInstance = new Cards();
  20. }
  21. return cardsInstance;
  22. }
  23. /** 给54张扑克牌赋值 :1~54 */
  24. private void setPuke() {
  25. for (int i = 0; i < 54; i++) {
  26. pukes[i] = i + 1;
  27. }
  28. }
  29. /** 洗牌 */
  30. private void shuffle() {
  31. Random rdm = new Random();
  32. for (int i = 0; i < 54; i++) {
  33. // random.nextInt();是个前闭后开的方法:0~53
  34. int rdmNo = rdm.nextInt(54);
  35. int temp = pukes[i];
  36. pukes[i] = pukes[rdmNo];
  37. pukes[rdmNo] = temp;
  38. }
  39. }
  40. }
  41. </span>

玩家类:

  1. <span style="font-size:18px;color:#3333ff;">package com.bison.utils;
  2. import android.graphics.Rect;
  3. /**
  4. * 这个是玩家的实体类
  5. *
  6. * @author Bison
  7. *
  8. */
  9. public class Person {
  10. private final Cards mCards = Cards.getInstance();
  11. public int[] person1 = new int[17];
  12. public int[] person2 = new int[17];
  13. public int[] person3 = new int[17];
  14. // 余下三张属于地主的
  15. public int[] threePukes = new int[3];
  16. public Person() {
  17. personHold(mCards.pukes);
  18. }
  19. /** 分牌 */
  20. private void personHold(int[] pukes) {
  21. int k = 0;
  22. for (int i = 0; i < 3; i++) {
  23. if (i == 0) {
  24. for (int j = 0; j < 17; j++) {
  25. person1[j] = pukes[k++];
  26. }
  27. // 将其排序
  28. sort(person1);
  29. }
  30. if (i == 1) {
  31. for (int j = 0; j < 17; j++) {
  32. person2[j] = pukes[k++];
  33. }
  34. // 将其排序
  35. sort(person2);
  36. }
  37. if (i == 2) {
  38. for (int j = 0; j < 17; j++) {
  39. person3[j] = pukes[k++];
  40. }
  41. // 将其排序
  42. sort(person3);
  43. }
  44. }
  45. threePukes[0] = pukes[51];
  46. threePukes[1] = pukes[52];
  47. threePukes[2] = pukes[53];
  48. }
  49. /** 对每个玩家手里的牌排序:使用冒泡排序 */
  50. private void sort(int[] ary) {
  51. for (int i = 0; i < ary.length; i++) {
  52. for (int j = 0; j < ary.length - i - 1; j++) {
  53. if (ary[j] > ary[j + 1]) {
  54. int temp = ary[j];
  55. ary[j] = ary[j + 1];
  56. ary[j + 1] = temp;
  57. }
  58. }
  59. }
  60. }
  61. /**
  62. * 对应扑克所在图片上的位置
  63. * 1 5 9 ………… 53
  64. * 2 6 10 ………… 54
  65. * 3 7 11
  66. * 4 8 12
  67. */
  68. public Rect cardRect(int cardValue, int width, int height) {
  69. int x = 0, y = 0;
  70. if (cardValue % 4 == 0) {
  71. x = cardValue / 4 - 1;
  72. y = 4;
  73. } else {
  74. x = cardValue / 4;
  75. y = cardValue % 4;
  76. }
  77. int left = x * width;
  78. int top = (y - 1) * height;
  79. int right = (x + 1) * width;
  80. int bottom = (y) * height;
  81. return new Rect(left, top, right, bottom);
  82. }
  83. }
  84. </span>

PS:斗地主还是可以做成很复杂的。相关图片

 
 

Android --- 斗地主 [牌桌实现源码]的更多相关文章

  1. Android斗地主棋牌游戏牌桌实现源码下载

    本次给大家分享下Android斗地主棋牌游戏牌桌实现源码下载如下: 为了节约内存资源,每张扑克牌都是剪切形成的,当然这也是当前编程的主流方法. 1.主Activity package com.biso ...

  2. ubuntu 14.04.5 编译Android 4.4.4 r1源码(最新)

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/54426189 吐槽:ubuntu系统真是让人又爱又恨,也有可能是VMware Wo ...

  3. Android Small插件化框架源码分析

    Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...

  4. android应用商店完整版源码

    这个是从一个安卓学习的网站上转载过来的,android应用商店完整版源码,大家可以看看一下吧. _op><ignore_js_op> <ignore_js_op>< ...

  5. Android版的疯狂猜图游戏源码完整版分享

    这个游戏源码是在安装教程网那么分享过来的,Android版的疯狂猜图游戏源码完整版分享,也是本人之前很早以前发的一款游戏源码的,大家如果想了解一下,可以看看吧,不说多了,上一个图先吧.   > ...

  6. 多种的android进度条的特效源码

    多种的android进度条的特效源码,这个源码是在源码天堂那个网站上转载过来的,我已经修改一部分了,感觉很实用的,大家可以学习一下吧,我就不上传源码了,大家可以直接到那个网站上下载吧. 源码天堂下载地 ...

  7. Android IntentService使用介绍以及源码解析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.IntentService概述及使用举例 IntentService内部实现机制用到了HandlerThread,如果对HandlerThrea ...

  8. Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机

    Android源码浅析(三)--Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机 最近比较忙,而且又要维护自己的博客,视频和公众号,也就没 ...

  9. Android 7.1.1系统源码下载、编译、刷机-Nexus 6实战

    想成为一位合格的Android程序员或者一位Android高级工程师是十分有必要知道Android的框架层的工作原理,要知道其工作原理那么就需要阅读Android的源代码. 想要阅读Android的源 ...

随机推荐

  1. IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍[zz]

    目前所能见到的硬盘接口类型主要有IDE.SATA.SCSI.SAS.FC等等. IDE是俗称的并口,SATA是俗称的串口,这两种硬盘是个人电脑和低端服务器常见的硬盘.SCSI是"小型计算机系 ...

  2. 有时候为了方便sql语句的对比和查询,我们可以使用declare来定义变量 上下篇的问题

    --定义一些参数 declare @nodeId int,@ekid int ,@ecid int,@eid int,@pid int --列表 SELECT * FROM ( SELECT *,RO ...

  3. Quartz 2D绘制简单图形

    在Quartz 2D中,绘图是通过图形上下文进行绘制的,以下绘制几个简单的图形 首先先创建一个QuartzView.swift文件继承自UIView,然后实现drawRect方法: import UI ...

  4. java ConcurrentModificationException探究

    当集合结构被修改,会抛出Concurrent Modification Exception. fail-fast会在以下两种情况下抛出ConcurrentModificationException ( ...

  5. java-cef系列视频第一集:从官方代码编译

    本视频介绍了如何从官方给出步骤编译java-cef代码,生成可运行可移植的发行版. 值得一提的是:截至2016-09-24java-cef代码编译方式有所改变,读者请自行查看bitbucket上关于编 ...

  6. TN035: Using Multiple Resource Files and Header Files with Visual C++

    TN035: Using Multiple Resource Files and Header Files with Visual C++ This note describes how the Vi ...

  7. 有了malloc/free为什么还要new/delete ?

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的 ...

  8. C primer plus 练习题 第一章

    1. #include <stdio.h> int main() { //将英寸转换为厘米 1英寸=2.54厘米 int inch; printf("请输入英寸:"); ...

  9. C++中文件按行读取和逐词读取 backup

    http://blog.csdn.net/zhangchao3322218/article/details/7930857 #include  <iostream>#include  &l ...

  10. 【转载】[JS]让表单提交返回后保持在原来提交的位置上

    有时候,在网页中点击了页面中的按钮或是刷新了页面后,页面滚动条又 会回到顶部,想看后面的记录就又要拖动滚动条,或者要按翻页键,非常不方便,想在提交页面或者在页面刷新的时候仍然保持滚动条的位置不变,最好 ...