Android --- 斗地主 [牌桌实现源码]
1、主Activity
- <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 android.view.WindowManager;
- /**
- * </span>
- <span style="font-size:18px;color:#3333ff;"> * @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));
- }
- }</span>
2、牌桌页面
- <span style="color:#3333ff;">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();
- }
- }
- }
- // 刷帧线程</span>
- <span style="color:#3333ff;"> 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;
- }
- }
- }
- </span>
3、相关实体类
扑克牌类:
- <span style="font-size:18px;color:#3333ff;">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;
- }
- }
- }
- </span>
玩家类:
- <span style="font-size:18px;color:#3333ff;">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);
- }
- }
- </span>
PS:斗地主还是可以做成很复杂的。相关图片
Android --- 斗地主 [牌桌实现源码]的更多相关文章
- Android斗地主棋牌游戏牌桌实现源码下载
本次给大家分享下Android斗地主棋牌游戏牌桌实现源码下载如下: 为了节约内存资源,每张扑克牌都是剪切形成的,当然这也是当前编程的主流方法. 1.主Activity package com.biso ...
- ubuntu 14.04.5 编译Android 4.4.4 r1源码(最新)
本文博客链接:http://blog.csdn.net/qq1084283172/article/details/54426189 吐槽:ubuntu系统真是让人又爱又恨,也有可能是VMware Wo ...
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
- android应用商店完整版源码
这个是从一个安卓学习的网站上转载过来的,android应用商店完整版源码,大家可以看看一下吧. _op><ignore_js_op> <ignore_js_op>< ...
- Android版的疯狂猜图游戏源码完整版分享
这个游戏源码是在安装教程网那么分享过来的,Android版的疯狂猜图游戏源码完整版分享,也是本人之前很早以前发的一款游戏源码的,大家如果想了解一下,可以看看吧,不说多了,上一个图先吧. > ...
- 多种的android进度条的特效源码
多种的android进度条的特效源码,这个源码是在源码天堂那个网站上转载过来的,我已经修改一部分了,感觉很实用的,大家可以学习一下吧,我就不上传源码了,大家可以直接到那个网站上下载吧. 源码天堂下载地 ...
- Android IntentService使用介绍以及源码解析
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.IntentService概述及使用举例 IntentService内部实现机制用到了HandlerThread,如果对HandlerThrea ...
- Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机
Android源码浅析(三)--Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机 最近比较忙,而且又要维护自己的博客,视频和公众号,也就没 ...
- Android 7.1.1系统源码下载、编译、刷机-Nexus 6实战
想成为一位合格的Android程序员或者一位Android高级工程师是十分有必要知道Android的框架层的工作原理,要知道其工作原理那么就需要阅读Android的源代码. 想要阅读Android的源 ...
随机推荐
- .NET错误The 'targetFramework' attribute in the <compilation> element of the Web.config file is used only to target version 4.0 and later of the .NET Framework
错误描述: The 'targetFramework' attribute in the <compilation> element of the Web.config file is u ...
- Git教程学习(五)
14. 解决冲突 14.1. 场景 当分支A和分支B在同一个文件上都有修改时会出现冲突.常见的情况是从master分支的基础上生成了新分支dev,然后在dev上进行了修改并add&commit ...
- 好老板VS坏老板
以下是漫画图解: 现在大家应该都能做出正确的判断了吧? 那90后的员工碰上70后的老板又会如何呢? 过去30多年来,基于资源禀赋.行政区划及产业政策等,形成了不同城市发展格局,接下来十年中国经济结构调 ...
- spring中配置了事务,数据业务层捕获异常,事务配置不成功?
原理:spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常 ...
- Run same command on all SQL Server databases without cursors
original: https://www.mssqltips.com/sqlservertip/1414/run-same-command-on-all-sql-server-databases-w ...
- thinking in object pool
1.背景 对象池为了避免频繁创建耗时或耗资源的大对象,事先在对象池中创建好一定数量的大对象,然后尽量复用对象池中的对象,用户用完大对象之后放回对象池. 2.问题 目前纵观主流语言的实现方式无外乎3个步 ...
- alt属性和title属性差异---终于分清楚了!
凡是接触过前端的开发者,相信都会接触到<img>标签,自然alt title更是不会陌生,但对他们真正的含义和使用方法,你确定了解吗? 参考: http://www.junchenwu.c ...
- android自定义RadioGroup实现可以添加多种布局
android自带的RadioGroup是继承自LinearLayout,如果布局的时候不是直接写radiobutton,即radiobutton外面还包了一层容器,这时分组是不成功的,因为查找不到r ...
- 使用Aspose.Cells 根据模板生成excel里面的 line chart
目的: 1.根据模板里面的excel数据信息,动态创建line chart 2.linechart 的样式改为灰色 3.以流的形式写到客户端,不管客户端是否装excel,都可以导出到到客户端 4.使用 ...
- Unix sed实用教程系列目录[已完成]
本系列文章已经译完了,译自awk-sed@theunixschool,收获颇丰,作者没有讲明白的我做了补充,并且尝试讲的更清楚,整理成系列索引,方便学习,开篇非译文,是我为了方便后面的理解写的一篇,感 ...