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();
			}
		}

	}

	// 刷帧线程
	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:斗地主还是可以做成很复杂的。相关图片

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值