作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服
斗地主-android(棋牌)
包含内容: 源码,全套工具
作者QQ549710689
详情描述

如遇视频不清晰,请最大化观看演示

官网:http://www.ckplayer.com,版本号:X

以下仅列出部分功能,全部功能请至官网 《手册》查看

单独监听功能:


播放状态:
跳转状态:无
缓冲:100
当前音量:0.8
是否全屏:否
控制栏:显示
还未结束
当前播放时间(秒):0
前置广告状态:
鼠标位置
切换清晰度:
点击监听:
监听截图功能

Custom Tab

                                                                                                                本示例提供源码,需要源码的朋友可以下载 

android开发环境配置  http://wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1028


本项目是一个单机的斗地主项目源码,不过这个项目的分辨率有点问题,我在真机和模拟器的480*800上无论是横屏还是竖屏游戏都只能显示一部分画面,可能项目是使用的更低分辨率创建的,不过我玩了玩这个项目的却比javaapk.com以前发的斗地主项目算法要好一些,分配地主发牌都是随机的,根据谁的牌数先为0就是谁赢,再根据他的Id判断他是农民还是地主,每个人自动生成3分,结束后赢家加分输家扣分源码有注释,编码GBK默认编译版本4.4.2,需要的朋友可以下载研究一下 


 源码介绍:


扑克牌Card

public class Card {
	int value=0;
	int pokeType=0;
	int[] pokes;
	Bitmap pokeImage;
	int personID;
	public Card(int[] pokes,Bitmap pokeImage,int id)
	{
		this.personID=id;
		this.pokes=pokes;
		this.pokeImage=pokeImage;
		pokeType=Poke.getPokeType(pokes);
		value=Poke.getPokeTypeValue(pokes, pokeType);
		//显示的正确排列
//		如果有炸弹牌出现,分数翻倍
		if(pokeType==PokeType.huojian||pokeType==PokeType.zhadan)
		{
			Desk.currentScore*=2;
		}
	}
	
	public void paint(Canvas canvas,int left,int top,int dir)
	{
		Rect src = new Rect();
		Rect des = new Rect();
		for (int i = 0; i < pokes.length; i++) {
			int row = Poke.getImageRow(pokes[i]);
			int col = Poke.getImageCol(pokes[i]);
			if (dir == PokeType.dirV) {
				row = Poke.getImageRow(pokes[i]);
				col = Poke.getImageCol(pokes[i]);
				src.set(col * 35, row * 52, col * 35 + 35, row * 52 + 52);
				des.set(left, top + i * 13, left + 35, top + 52 + i * 13);
			} else {
				row = Poke.getImageRow(pokes[i]);
				col = Poke.getImageCol(pokes[i]);
				int select = 0;
				src.set(col * 35, row * 52, col * 35 + 35, row * 52 + 52);
				des.set(left + i * 13, top - select, left + 35 + i * 13, top
						- select + 52);
			}
			canvas.drawBitmap(pokeImage, src, des, null);
		}
	}
}

                                                                                                                   牌桌:Desk                                                                                                              

public class Desk {
	public static int winId = -1;
	Bitmap pokeImage;
	Bitmap tishi;
	Bitmap buyao;
	Bitmap chupai;

	public static int[] personScore = new int[3];

	public static int threePokes[] = new int[3];// 三张底牌
	private int threePokesPos[][] = new int[][] { { 170, 17 }, { 220, 17 },
			{ 270, 17 } };
	private int[][] rolePos = { { 60, 310 }, { 63, 19 }, { 396, 19 }, };

	public static Person[] persons = new Person[3];// 三个玩家
	public static int[] deskPokes = new int[54];// 一副扑克牌
	public static int currentScore = 3;// 当前分数
	public static int boss = 0;// 地主
	/**
	 * -2:发牌<br>
	 * -1:随机地主<br>
	 * 0:游戏中 <br>
	 * 1:游戏结束,重新来,活退出<br>
	 */
	private int op = -1;// 游戏的进度控制
	public static int currentPerson = 0;// 当前操作的人
	public static int currentCircle = 0;// 本轮次数
	public static Card currentCard = null;// 最新的一手牌

	public int[][] personPokes = new int[3][17];

	// gaming
	private int timeLimite = 310;
	private int[][] timeLimitePos = { { 130, 205 }, { 118, 76 }, { 327, 76 } };
	private int opPosX = 240;
	private int opPosY = 200;

	DDZ ddz;

	public Desk(DDZ ddz) {
		this.ddz = ddz;
		pokeImage = BitmapFactory.decodeResource(ddz.getResources(),
				R.drawable.poker3552);
		tishi = BitmapFactory
				.decodeResource(ddz.getResources(), R.drawable.cp0);
		buyao = BitmapFactory
				.decodeResource(ddz.getResources(), R.drawable.cp1);
		chupai = BitmapFactory.decodeResource(ddz.getResources(),
				R.drawable.cp2);
		// init();

	}

	public void gameLogic() {
		switch (op) {
		case -2:
			break;
		case -1:
			init();
			op = 0;
			break;
		case 0:
			gaming();
			break;
		case 1:
			break;
		case 2:
			break;
		}
	}

	// 存储当前一句的胜负得分信息
	int rs[] = new int[3];

	private void gaming() {
		for (int k = 0; k < 3; k++) {
			// 当三个人中其中一个人牌的数量为0,则游戏结束
			if (persons[k].pokes.length == 0) {
				// 切换到游戏结束状态
				op = 1;
				// 得到最先出去的人的id
				winId = k;
				// 判断哪方获胜
				if (boss == winId) {
					// 地主方获胜后的积分操作
					for (int i = 0; i < 3; i++) {
						if (i == boss) {
							// 地主需要加两倍积分
							rs[i] = currentScore * 2;
							personScore[i] += currentScore * 2;
						} else {
							// 农民方需要减分
							rs[i] = -currentScore;
							personScore[i] -= currentScore;
						}
					}
				} else {
					// 如果农民方胜利
					for (int i = 0; i < 3; i++) {
						if (i != boss) {
							// 农民方加分
							rs[i] = currentScore;
							personScore[i] += currentScore;
						} else {
							// 地主方减分
							rs[i] = -currentScore * 2;
							personScore[i] -= currentScore * 2;
						}
					}
				}
				return;
			}
		}

		// 游戏没有结束,继续。
		// 如果本家ID是NPC,则执行语句中的操作
		if (currentPerson == 1 || currentPerson == 2) {
			if (timeLimite <= 300) {
				// 获取手中的牌中能够打过当前手牌
				Card tempcard = persons[currentPerson].chupaiAI(currentCard);
				if (tempcard != null) {
					// 手中有大过的牌,则出
					currentCircle++;
					currentCard = tempcard;
					nextPerson();
				} else {
					// 没有打过的牌,则不要
					buyao();
				}
			}

		}
		// 时间倒计时
		timeLimite -= 2;

	}

	public void init() {
		deskPokes = new int[54];
		personPokes = new int[3][17];
		threePokes = new int[3];

		winId = -1;
		currentScore = 3;
		currentCard = null;
		currentCircle = 0;
		currentPerson = 0;

		for (int i = 0; i < deskPokes.length; i++) {
			deskPokes[i] = i;
		}
		Poke.shuffle(deskPokes);
		fenpai(deskPokes);
		randDZ();
		Poke.sort(personPokes[0]);
		Poke.sort(personPokes[1]);
		Poke.sort(personPokes[2]);
		persons[0] = new Person(personPokes[0], 234, 96, PokeType.dirH, 0,
				this, ddz);
		persons[1] = new Person(personPokes[1], 54, 28, PokeType.dirV, 1, this,
				ddz);
		persons[2] = new Person(personPokes[2], 54, 417, PokeType.dirV, 2,
				this, ddz);
		persons[0].setPosition(persons[1], persons[2]);
		persons[1].setPosition(persons[2], persons[0]);
		persons[2].setPosition(persons[0], persons[1]);
		AnalyzePoke ana = AnalyzePoke.getInstance();

		for (int i = 0; i < persons.length; i++) {
			boolean b = ana.testAnalyze(personPokes[i]);
			if (!b) {
				init();
				System.out.println("chongqinglaiguo");
				break;
			}
		}
		for (int i = 0; i < 3; i++) {
			StringBuffer sb = new StringBuffer();
			sb.append("chushipai---" + i + ":");
			for (int j = 0; j < personPokes[i].length; j++) {
				sb.append(personPokes[i][j] + ",");
			}
			System.out.println(sb.toString());
		}
	}

	// 随机地主,将三张底牌给地主
	private void randDZ() {
		boss = Poke.getDZ();
		currentPerson = boss;
		int[] newPersonPokes = new int[20];
		for (int i = 0; i < 17; i++) {
			newPersonPokes[i] = personPokes[boss][i];
		}
		newPersonPokes[17] = threePokes[0];
		newPersonPokes[18] = threePokes[1];
		newPersonPokes[19] = threePokes[2];
		personPokes[boss] = newPersonPokes;
	}

	public void fenpai(int[] pokes) {
		for (int i = 0; i < 51;) {
			personPokes[i / 17][i % 17] = pokes[i++];
		}
		threePokes[0] = pokes[51];
		threePokes[1] = pokes[52];
		threePokes[2] = pokes[53];
	}

	public void result() {

	}

	public void paint(Canvas canvas) {

		switch (op) {
		case -2:
			break;
		case -1:
			break;
		case 0:
			paintGaming(canvas);
			break;
		case 1:
			paintResult(canvas);
			break;
		case 2:
			break;
		}

	}

	private void paintResult(Canvas canvas) {
		Paint paint = new Paint();
		paint.setColor(Color.WHITE);
		paint.setTextSize(20);

		canvas.drawText("本局得分              总分      ", 110, 66, paint);
		for (int i = 0; i < 3; i++) {
			canvas.drawText(i + ":本局得分:" + rs[i] + "   总分:" + personScore[i],
					110, 96 + i * 30, paint);
		}

	}

	private void paintGaming(Canvas canvas) {
		persons[0].paint(canvas);
		persons[1].paint(canvas);
		persons[2].paint(canvas);
		paintThreePokes(canvas);
		paintRoleAndScore(canvas);
		if (currentPerson == 0) {
			Rect src = new Rect();
			Rect dst = new Rect();
			src.set(0, 0, chupai.getWidth(), chupai.getHeight());
			dst.set(opPosX, opPosY, opPosX + chupai.getWidth(), opPosY
					+ chupai.getHeight());
			canvas.drawBitmap(chupai, src, dst, null);
			if (currentCircle != 0) {
				src.set(0, 0, tishi.getWidth(), tishi.getHeight());
				dst.set(opPosX + 40, opPosY, opPosX + tishi.getWidth() + 40,
						opPosY + tishi.getHeight());
				canvas.drawBitmap(tishi, src, dst, null);
				src.set(0, 0, buyao.getWidth(), buyao.getHeight());
				dst.set(opPosX - 40, opPosY, opPosX + buyao.getWidth() - 40,
						opPosY + buyao.getHeight());
				canvas.drawBitmap(buyao, src, dst, null);
			}
		}

		if (persons[0].card != null) {
			persons[0].card.paint(canvas, 130, 140, PokeType.dirH);
		}
		if (persons[1].card != null) {
			persons[1].card.paint(canvas, 73, 56, PokeType.dirV);
		}
		if (persons[2].card != null) {
			persons[2].card.paint(canvas, 365, 56, PokeType.dirV);
		}

		paintTimeLimite(canvas);
		Paint paint = new Paint();
		paint.setTextAlign(Align.LEFT);
		paint.setStyle(Style.FILL_AND_STROKE);
		paint.setTextSize(14);
		canvas.drawText("当前底分:" + currentScore, 165, 308, paint);
	}

	private void paintTimeLimite(Canvas canvas) {
		Paint paint = new Paint();
		paint.setColor(Color.BLUE);
		paint.setTextSize(16);
		for (int i = 0; i < 3; i++) {
			if (i == currentPerson) {
				canvas.drawText("" + (timeLimite / 10), timeLimitePos[i][0],
						timeLimitePos[i][1], paint);
			}
		}
	}

	private void paintRoleAndScore(Canvas canvas) {
		Paint paint = new Paint();
		for (int i = 0; i < 3; i++) {
			if (boss == i) {
				paint.setColor(Color.RED);
				canvas.drawText("地主(得分:" + personScore[i] + ")", rolePos[i][0],
						rolePos[i][1], paint);
			} else {
				paint.setColor(Color.WHITE);
				canvas.drawText("农民(得分:" + personScore[i] + ")", rolePos[i][0],
						rolePos[i][1], paint);
			}
		}
	}

	private void paintThreePokes(Canvas canvas) {
		Rect src = new Rect();
		Rect dst = new Rect();
		for (int i = 0; i < 3; i++) {
			int row = Poke.getImageRow(threePokes[i]);
			int col = Poke.getImageCol(threePokes[i]);
			src.set(col * 35, row * 52, col * 35 + 35, row * 52 + 52);
			dst.set(threePokesPos[i][0], threePokesPos[i][1],
					threePokesPos[i][0] + 35, threePokesPos[i][1] + 52);
			canvas.drawBitmap(pokeImage, src, dst, null);
		}

	}

	public void onTuch(View v, MotionEvent event) {
		for (int i = 0; i < persons.length; i++) {
			StringBuffer sb = new StringBuffer();
			sb.append(i + " : ");
			for (int j = 0; j < persons[i].pokes.length; j++) {
				sb.append(persons[i].pokes[j]
						+ (persons[i].pokes[j] >= 10 ? "" : " ") + ",");
			}
			System.out.println(sb.toString());
		}

		if (op == 1) {
			System.out.println("ddz.handler:" + ddz.handler);
			init();
			op = 0;
			// ddz.handler.sendEmptyMessage(DDZActivity.MENU);
		}
		if (currentPerson != 0) {
			return;
		}
		int x = (int) event.getX();
		int y = (int) event.getY();

		if (Poke.inRect(x, y, opPosX, opPosY, 38, 23)) {
			System.out.println("chupai");
			Card card = persons[0].chupai(currentCard);
			if (card != null) {
				currentCard = card;
				currentCircle++;
				nextPerson();
			}
		}
		if (currentCircle != 0) {
			if (Poke.inRect(x, y, opPosX - 40, opPosY, 38, 23)) {
				System.out.println("buyao");
				buyao();
			}
		}
		if (Poke.inRect(x, y, opPosX + 40, opPosY, 38, 23)) {
			System.out.println("tishi");
			tishi();
		}
		persons[0].onTuch(v, event);
	}

	private void tishi() {

	}
	//不要牌的操作
	private void buyao() {
		// 轮到下一个人
		currentCircle++;
		// 清空当前不要牌的人的最后一手牌
		persons[currentPerson].card = null;
		// 定位下一个人的id
		nextPerson();
		// 如果已经转回来,则该人继续出牌,本轮清空,新一轮开始
		if (currentCard != null && currentPerson == currentCard.personID) {
			currentCircle = 0;
			currentCard = null;// 转回到最大牌的那个人再出牌
			persons[currentPerson].card = null;
		}
	}

	// 定位下一个人的id并重新倒计时
	private void nextPerson() {
		switch (currentPerson) {
		case 0:
			currentPerson = 2;
			break;
		case 1:
			currentPerson = 0;
			break;
		case 2:
			currentPerson = 1;
			break;
		}
		timeLimite = 310;
	}
}

                                                                                                                   胡牌分析器:AnalyzePoke                     

package com.peiandsky;

import java.util.Vector;

public class AnalyzePoke {
	private int[] pokes;
	private int[] countPokes = new int[12];
	private int count2;
	private int countWang;
	private Vector<int[]> card_zhadan = new Vector<int[]>(3);
	private Vector<int[]> card_sanshun = new Vector<int[]>(3);
	private Vector<int[]> card_shuangshun = new Vector<int[]>(3);
	private Vector<int[]> card_sanzhang = new Vector<int[]>(3);
	private Vector<int[]> card_danshun = new Vector<int[]>(3);
	private Vector<int[]> card_duipai = new Vector<int[]>(3);
	private Vector<int[]> card_danpai = new Vector<int[]>(5);

	public int[] getCountPokes() {
		return countPokes;
	}

	public int getCount2() {
		return count2;
	}

	public int getCountWang() {
		return countWang;
	}

	public Vector<int[]> getCard_zhadan() {
		return card_zhadan;
	}

	public Vector<int[]> getCard_sanshun() {
		return card_sanshun;
	}

	public Vector<int[]> getCard_shuangshun() {
		return card_shuangshun;
	}

	public Vector<int[]> getCard_sanzhang() {
		return card_sanzhang;
	}

	public Vector<int[]> getCard_danshun() {
		return card_danshun;
	}

	public Vector<int[]> getCard_duipai() {
		return card_duipai;
	}

	public Vector<int[]> getCard_danpai() {
		return card_danpai;
	}

	private AnalyzePoke() {
	}

	public static AnalyzePoke getInstance() {
		// if (analyzePoke == null) {
		// analyzePoke = new AnalyzePoke();
		// }
		// return analyzePoke;
		return new AnalyzePoke();
	}

	private void init() {
		for (int i = 0; i < countPokes.length; i++) {
			countPokes[i] = 0;
		}
		count2 = 0;
		countWang = 0;
		card_zhadan.clear();
		card_sanshun.clear();
		card_shuangshun.clear();
		card_sanzhang.clear();
		card_danshun.clear();
		card_duipai.clear();
		card_danpai.clear();
	}

	public boolean lastCardTypeEq(int pokeType) {
		if (remainCount() > 1) {
			return false;
		}
		switch (pokeType) {
		case PokeType.sanzhang:
			return card_sanzhang.size() == 1;
		case PokeType.duipai:
			return card_duipai.size() == 1;
		case PokeType.danpai:
			return card_danpai.size() == 1;
		}
		return false;
	}

	public int[] getPokes() {
		return pokes;
	}

	public void setPokes(int[] pokes) {
		Poke.sort(pokes);
		this.pokes = pokes;
		try {
			this.analyze();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public int remainCount() {
		return card_zhadan.size() + card_sanshun.size()
				+ card_shuangshun.size() + card_sanzhang.size()
				+ card_danshun.size() + card_duipai.size() + card_danpai.size();
	}

	public int[] getMinType(Person last, Person next) {

		AnalyzePoke lastAna = AnalyzePoke.getInstance();
		lastAna.setPokes(last.pokes);

		AnalyzePoke nextAna = AnalyzePoke.getInstance();
		nextAna.setPokes(next.pokes);

		int lastCount = lastAna.remainCount();
		int nextCount = nextAna.remainCount();

		int needSmart = -1;
		if (Desk.boss == next.id
				|| (Desk.boss != next.id && Desk.boss != last.id)) {
			// 是对手
			if (next.pokes.length <= 2) {
				needSmart = next.pokes.length;
			}
		}

		// TODO
		int pokeType = -1;
		int minValue = 55;
		int pokeIdx = 0;
		int size;
		Vector<int[]> temp;

		temp = card_sanshun;
		size = temp.size();

		for (int i = 0; i < size; i++) {
			int[] p = temp.elementAt(i);
			if (minValue > p[0]) {
				pokeType = PokeType.sanshun;
				minValue = p[0];
				pokeIdx = i;
			}
		}

		temp = card_shuangshun;
		size = temp.size();

		for (int i = 0; i < size; i++) {
			int[] p = temp.elementAt(i);
			if (minValue > p[0]) {
				pokeType = PokeType.shuangshun;
				minValue = p[0];
				pokeIdx = i;
			}
		}

		temp = card_danshun;
		size = temp.size();

		for (int i = 0; i < size; i++) {
			int[] p = temp.elementAt(i);
			if (minValue > p[0]) {
				pokeType = PokeType.danshun;
				minValue = p[0];
				pokeIdx = i;
			}
		}
		temp = card_sanzhang;
		size = temp.size();

		for (int i = 0; i < size; i++) {
			int[] p = temp.elementAt(i);
			if (minValue > p[0]) {
				pokeType = PokeType.sanzhang;
				minValue = p[0];
				pokeIdx = i;
			}
		}

		if (needSmart == 2) {
			if (pokeType != -1) {
				return new int[] { pokeType, pokeIdx };
			} else {
				temp = card_duipai;
				size = temp.size();
				int min2 = -1;
				for (int i = 0; i < size; i++) {
					int[] p = temp.elementAt(i);
					if (min2 <= p[0]) {
						pokeType = PokeType.duipai;
						minValue = p[0];
						min2 = p[0];
						pokeIdx = i;
					}
				}
			}

		} else {
			temp = card_duipai;
			size = temp.size();

			for (int i = 0; i < size; i++) {
				int[] p = temp.elementAt(i);
				if (minValue > p[0]) {
					pokeType = PokeType.duipai;
					minValue = p[0];
					pokeIdx = i;
				}
			}
		}
		if (needSmart == 1) {
			if (pokeType != -1) {
				return new int[] { pokeType, pokeIdx };
			} else {
				int min1 = -1;
				for (int i = 0; i < size; i++) {
					int[] p = temp.elementAt(i);
					if (min1 <= p[0]) {
						pokeType = PokeType.danpai;
						minValue = p[0];
						min1 = p[0];
						pokeIdx = i;
					}
				}
			}

		} else {
			temp = card_danpai;
			size = temp.size();

			for (int i = 0; i < size; i++) {
				int[] p = temp.elementAt(i);
				if (minValue > p[0]) {
					pokeType = PokeType.danpai;
					minValue = p[0];
					pokeIdx = i;
				}
			}
		}
		return new int[] { pokeType, pokeIdx };
	}

	public boolean testAnalyze(int pokes[]) {
		try {
			init();
			for (int i = 0; i < pokes.length; i++) {
				int v = Poke.getPokeValue(pokes[i]);
				if (v == 16 || v == 17) {
					countWang++;
				} else if (v == 15) {
					count2++;
				} else {
					countPokes[v - 3]++;
				}
			}
			// System.out.println(" analyze  sanshun");
			// 三顺
			int start = -1;
			int end = -1;
			for (int i = 0; i <= countPokes.length - 1; i++) {
				if (countPokes[i] == 3) {
					if (start == -1) {
						start = i;
					} else {
						end = i;
					}
				} else {
					if (end != -1 && start != -1) {
						int dur = end - start + 1;
						int[] ss = new int[dur * 3];
						int m = 0;
						for (int j = 0; j < pokes.length; j++) {
							int v = Poke.getPokeValue(pokes[j]) - 3;
							if (v >= start && v <= end) {
								ss[m++] = pokes[j];
							}
						}
						if (m == dur * 3 - 1) {
							System.out.println("sanshun is over!!!");
						} else {
							System.out.println("sanshun error!!!");
						}
						card_sanshun.addElement(ss);
						for (int s = start; s <= end; s++) {
							countPokes[s] = -1;
						}
						start = end = -1;
						continue;
					} else {
						start = end = -1;
					}
				}
			}
			// System.out.println(" analyze  shuangshun");
			// shuangshun
			int sstart = -1;
			int send = -1;
			for (int i = 0; i < countPokes.length; i++) {
				if (countPokes[i] == 2) {
					if (sstart == -1) {
						sstart = i;
					} else {
						send = i;
					}
				} else {
					if (sstart != -1 && send != -1) {
						int dur = send - sstart + 1;
						if (dur < 3) {
							sstart = send = -1;
							continue;
						} else {
							int shuangshun[] = new int[dur * 2];
							int m = 0;
							for (int j = 0; j < pokes.length; j++) {
								int v = Poke.getPokeValue(pokes[j]) - 3;
								if (v >= sstart && v <= send) {
									shuangshun[m++] = pokes[j];
								}
							}
							card_shuangshun.addElement(shuangshun);
							for (int s = sstart; s <= send; s++) {
								countPokes[s] = -1;
							}
							sstart = send = -1;
							continue;
						}
					} else {
						sstart = send = -1;
					}
				}
			}
			// System.out.println(" analyze  danshun");
			// danshun
			int dstart = -1;
			int dend = -1;
			for (int i = 0; i < countPokes.length; i++) {
				if (countPokes[i] >= 1) {
					if (dstart == -1) {
						dstart = i;
					} else {
						dend = i;
					}
				} else {
					if (dstart != -1 && dend != -1) {
						int dur = dend - dstart + 1;
						if (dur >= 5) {
							int m = 0;
							int[] danshun = new int[dur];
							for (int j = 0; j < pokes.length; j++) {
								int v = Poke.getPokeValue(pokes[j]) - 3;
								if (v == dend) {
									danshun[m++] = pokes[j];
									countPokes[dend]--;
									dend--;
								}
								if (dend == dstart - 1) {
									break;
								}
							}

							card_danshun.addElement(danshun);
						}
						dstart = dend = -1;
					} else {
						dstart = dend = -1;
					}
				}
			}
			// System.out.println(" analyze  sanzhang");
			// sanzhang
			for (int i = 0; i < countPokes.length; i++) {
				if (countPokes[i] == 3) {
					countPokes[i] = -1;
					int[] sanzhang = new int[3];
					int m = 0;
					for (int j = 0; j < pokes.length; j++) {
						int v = Poke.getPokeValue(pokes[j]) - 3;
						if (v == i) {
							sanzhang[m++] = pokes[j];
						}
					}
					card_sanzhang.addElement(sanzhang);
				}
			}
			// System.out.println(" analyze  duipai");
			// duipai
			for (int i = 0; i < countPokes.length; i++) {
				if (countPokes[i] == 2) {
					int[] duipai = new int[2];
					for (int j = 0; j < pokes.length; j++) {
						int v = Poke.getPokeValue(pokes[j]) - 3;
						if (v == i) {
							duipai[0] = pokes[j];
							duipai[1] = pokes[j + 1];
							card_duipai.addElement(duipai);
							break;
						}
					}
					countPokes[i] = -1;
				}
			}
			// System.out.println(" analyze  danpai");
			// danpai
			for (int i = 0; i < countPokes.length; i++) {
				if (countPokes[i] == 1) {
					for (int j = 0; j < pokes.length; j++) {
						int v = Poke.getPokeValue(pokes[j]) - 3;
						if (v == i) {
							card_danpai.addElement(new int[] { pokes[j] });
							countPokes[i] = -1;
							break;
						}

					}
				}
			}

			// System.out.println(" analyze  2 ");
			switch (count2) {
			case 4:
				card_zhadan.addElement(new int[] { pokes[countWang],
						pokes[countWang + 1], pokes[countWang + 2],
						pokes[countWang + 3] });
				break;
			case 3:
				card_sanzhang.addElement(new int[] { pokes[countWang],
						pokes[countWang + 1], pokes[countWang + 2] });
				break;
			case 2:
				card_duipai.addElement(new int[] { pokes[countWang],
						pokes[countWang + 1] });
				break;
			case 1:
				card_danpai.addElement(new int[] { pokes[countWang] });
				break;
			}
			// System.out.println(" analyze  zhadan");
			// 炸弹
			for (int i = 0; i < countPokes.length - 1; i++) {
				if (countPokes[i] == 4) {
					card_zhadan.addElement(new int[] { i * 4 + 3, i * 4 + 2,
							i * 4 + 1, i * 4 });
					countPokes[i] = -1;
				}
			}
			// System.out.println(" analyze  wang");
			if (countWang == 1) {
				card_danpai.addElement(new int[] { pokes[0] });
			} else if (countWang == 2) {
				card_zhadan.addElement(new int[] { pokes[0], pokes[1] });
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	// 分析几大主要牌型
	private void analyze() {
		// 初始化牌型容器
		init();
		// 分析王,2,普通牌的数量
		for (int i = 0; i < pokes.length; i++) {
			int v = Poke.getPokeValue(pokes[i]);
			if (v == 16 || v == 17) {
				countWang++;
			} else if (v == 15) {
				count2++;
			} else {
				countPokes[v - 3]++;
			}
		}
		// 分析三顺牌型
		int start = -1;
		int end = -1;
		for (int i = 0; i <= countPokes.length - 1; i++) {
			if (countPokes[i] == 3) {
				if (start == -1) {
					start = i;
				} else {
					end = i;
				}
			} else {
				if (end != -1 && start != -1) {
					int dur = end - start + 1;
					int[] ss = new int[dur * 3];
					int m = 0;
					for (int j = 0; j < pokes.length; j++) {
						int v = Poke.getPokeValue(pokes[j]) - 3;
						if (v >= start && v <= end) {
							ss[m++] = pokes[j];
						}
					}
					if (m == dur * 3 - 1) {
						System.out.println("sanshun is over!!!");
					} else {
						System.out.println("sanshun error!!!");
					}
					card_sanshun.addElement(ss);
					for (int s = start; s <= end; s++) {
						countPokes[s] = -1;
					}
					start = end = -1;
					continue;
				} else {
					start = end = -1;
				}
			}
		}
		// 分析双顺牌型
		int sstart = -1;
		int send = -1;
		for (int i = 0; i < countPokes.length; i++) {
			if (countPokes[i] == 2) {
				if (sstart == -1) {
					sstart = i;
				} else {
					send = i;
				}
			} else {
				if (sstart != -1 && send != -1) {
					int dur = send - sstart + 1;
					if (dur < 3) {
						sstart = send = -1;
						continue;
					} else {
						int shuangshun[] = new int[dur * 2];
						int m = 0;
						for (int j = 0; j < pokes.length; j++) {
							int v = Poke.getPokeValue(pokes[j]) - 3;
							if (v >= sstart && v <= send) {
								shuangshun[m++] = pokes[j];
							}
						}
						card_shuangshun.addElement(shuangshun);
						for (int s = sstart; s <= send; s++) {
							countPokes[s] = -1;
						}
						sstart = send = -1;
						continue;
					}
				} else {
					sstart = send = -1;
				}
			}
		}
		// 分析单顺牌型
		int dstart = -1;
		int dend = -1;
		for (int i = 0; i < countPokes.length; i++) {
			if (countPokes[i] >= 1) {
				if (dstart == -1) {
					dstart = i;
				} else {
					dend = i;
				}
			} else {
				if (dstart != -1 && dend != -1) {
					int dur = dend - dstart + 1;
					if (dur >= 5) {
						int m = 0;
						int[] danshun = new int[dur];
						for (int j = 0; j < pokes.length; j++) {
							int v = Poke.getPokeValue(pokes[j]) - 3;
							if (v == dend) {
								danshun[m++] = pokes[j];
								countPokes[dend]--;
								dend--;
							}
							if (dend == dstart - 1) {
								break;
							}
						}

						card_danshun.addElement(danshun);
					}
					dstart = dend = -1;
				} else {
					dstart = dend = -1;
				}
			}
		}
		// 分析三张牌型
		for (int i = 0; i < countPokes.length; i++) {
			if (countPokes[i] == 3) {
				countPokes[i] = -1;
				int[] sanzhang = new int[3];
				int m = 0;
				for (int j = 0; j < pokes.length; j++) {
					int v = Poke.getPokeValue(pokes[j]) - 3;
					if (v == i) {
						sanzhang[m++] = pokes[j];
					}
				}
				card_sanzhang.addElement(sanzhang);
			}
		}
		// 分析对牌
		for (int i = 0; i < countPokes.length; i++) {
			if (countPokes[i] == 2) {
				int[] duipai = new int[2];
				for (int j = 0; j < pokes.length; j++) {
					int v = Poke.getPokeValue(pokes[j]) - 3;
					if (v == i) {
						duipai[0] = pokes[j];
						duipai[1] = pokes[j + 1];
						card_duipai.addElement(duipai);
						break;
					}
				}
				countPokes[i] = -1;
			}
		}
		// 分析单牌
		for (int i = 0; i < countPokes.length; i++) {
			if (countPokes[i] == 1) {
				for (int j = 0; j < pokes.length; j++) {
					int v = Poke.getPokeValue(pokes[j]) - 3;
					if (v == i) {
						card_danpai.addElement(new int[] { pokes[j] });
						countPokes[i] = -1;
						break;
					}

				}
			}
		}

		// 根据2的数量进行分析
		switch (count2) {
		case 4:
			card_zhadan.addElement(new int[] { pokes[countWang],
					pokes[countWang + 1], pokes[countWang + 2],
					pokes[countWang + 3] });
			break;
		case 3:
			card_sanzhang.addElement(new int[] { pokes[countWang],
					pokes[countWang + 1], pokes[countWang + 2] });
			break;
		case 2:
			card_duipai.addElement(new int[] { pokes[countWang],
					pokes[countWang + 1] });
			break;
		case 1:
			card_danpai.addElement(new int[] { pokes[countWang] });
			break;
		}
		// 分析炸弹
		for (int i = 0; i < countPokes.length - 1; i++) {
			if (countPokes[i] == 4) {
				card_zhadan.addElement(new int[] { i * 4 + 3, i * 4 + 2,
						i * 4 + 1, i * 4 });
				countPokes[i] = -1;
			}
		}
		// 分析火箭
		if (countWang == 1) {
			card_danpai.addElement(new int[] { pokes[0] });
		} else if (countWang == 2) {
			card_zhadan.addElement(new int[] { pokes[0], pokes[1] });
		}
	}
}


Home