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我: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斗地主棋牌游戏牌桌实现源码下载的更多相关文章
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- Android --- 斗地主 [牌桌实现源码]
1.主Activity <span style="font-size:18px;color:#3333ff;">package com.bison; import an ...
- delphi xe5 android 服务端和手机端的源码下载
xe5 android的服务端和手机客户端的源代码下载地址 http://files.cnblogs.com/nywh2008/AndroidTest.rar
- Android精品资源汇总,10个源码(持续更新)
最近一直在学习Android,在各大社区逛,总结下自己看到的一些不错的源码.希望可以给大家带来帮助. 1.Android精品源码:带动态效果的Button(按钮) 最喜欢各种效果的按钮了,没办法就是这 ...
- android源码-安卓源码-Android源码下载-安卓游戏源码
android源码 高仿精仿金山手机卫士应用源码V1.2 高仿精仿金山手机卫士应用源码,该应用的级别实现了金山卫士的级别功能了,可以说跟现实中我们使用的金山卫士应用的功能几乎差不 人气:9286 ...
- C#中国象棋+游戏大厅 服务器 + 客户端源码
来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- Android 源码下载方法(Git 方式clone)
Android源码对于Android开发者来说,迟早有一天你会用到的,所以就记录一下,分享给读者,希望对读者有用 这里需要使用到Git相关知识,不清楚的可以先阅读,了解的可以跳过 Git-Tortoi ...
- Android Studio2.x版本无法自动关联源码的解决方法
Android Studio2.x版本无法自动关联源码的解决方法 在学习android开发过程中,对于一个不熟悉的类,阅读源码是一个很好的学习方式,使用andorid studio开发工具的SDK M ...
随机推荐
- CSS中加号、星号及其他符号的作用
在理想世界里,正确的CSS应该在任何支持CSS的浏览器里工作良好.不幸的是, 我们并不是生活在理想的世界里,浏览 器们布满了BUG和不一致.创建一个跨浏览器并且显示一致的页面,CSS开发者必须想尽办法 ...
- PC端和移动端一些奇葩兼容性问题
IE10默认在input框中输入内容时会显示一个'X',密码框会显示一个'小眼睛',怎么把这个默认的'X'或者'小眼睛'删除掉. 在password输入框显示一个“小眼睛”的按钮,去掉他的方法如下: ...
- tab切换-2016.6.4
以前的tab切换,一般都是自己找网上的源代码,不知道含义,直接套,然后会有一些不知道的问题出现. 最近学习了jq(当然属于懒人的我,学习进度很慢),然后再工作中遇到了tab选项卡,所以决定自己写一个. ...
- BZOJ3000 Big Number
由Stirling公式: $$n! \approx \sqrt{2 \pi n} (\frac{n}{e})^n$$ 故:$$\begin{align} ans &= log_k n! + 1 ...
- umask
1. 首先我们来思考umask是什么? umask 是系统设置的权限的默认值,在etc/profile里面的shell 脚本有设置规则. 对于root用户和用户而言,不可以直接用的 需要用减法 比如 ...
- webfrrm基础
一.B/S和C/S 1.C/S C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据 ...
- 破解Google Gmail的https新思路
最近,Google针对gmail被攻击事件,全面默认启用了始终以https访问Gmail的方式了.但是,对于可以动用整个国家力量的黑客来说,从网络通讯数据中(在此不讨论对用户电脑种木马破解https的 ...
- Fortran版MPI_barrier出现错误可能情况
在Fortran中的MPI_开头函数都常有一个整数型的错误变量用以函数返回错误信息.如: call MPI_Barrier(MPI_COMM_WORLD,ierr) 在没有ierr参数时,程序可能会出 ...
- iOS程序 防止动态调试和代码注入
http://ruixiazun.blog.163.com/blog/static/9068791820141173588694/ iPhone真实的运行环境是没有sys/ptrace.h抛出.ptr ...
- Coding源码学习第三部分(EaseStartView.m)
首先接上篇的要做一个NSEnumerator 类的延展阅读. 枚举(NSEnumerator) (1)依附于集合类(NSArray,NSSet,NSDictionary),没有用来创建实例的接口. ( ...