Java程序练习-A-黑帝君临

描述
西斯皇帝欺骗了议员,控制了议会。绝地武士传人Dastan为了正义,与西斯决斗。然而,西斯的天眼看出Dastan是个投机主义者。于是,西斯告诉Dastan,如果决斗的话会伤害的无辜的人,不如玩一把showhand,输的人将被流放。
ShowHand是一项紧张刺激的赌博游戏(香港赌神、赌侠系列中最常见的赌博方式)。以五张牌的排列、组合决定胜负。游戏开始时,每名玩家会获发一张底牌(此牌只能在最后才翻开);当派发第二张牌后,便由牌面较佳者决定下注额,其他人有权选择「跟」、「加注」、「放弃」或「晒冷」。当五张牌派发完毕后,各玩家翻开所有底牌来比较。
花式说明
黑桃♤>红心♥>方片◇>梅花♣
牌面说明
一共52张牌,23456789TJQKA 13张牌每种花式一套。 (T代表10)
A>K>Q>J>T>9>8>7>6>5>4>3>2
牌型说明
如果没有特殊说明,一般情况下同样的牌型比较最大的那张牌的大小,大小相同则比最大的那张牌的花式。牌型由大到小依次如下(有兴趣的同学可以验证一下概率)。
  No.1同花顺 拥有五张连续性同花色的顺子。以A为首的同花顺(TJQKA)最大。但JQKA2,QKA23,KA234不算顺子。A2345是最小的同花顺。
  No.2铁支 四张相同数字的牌,外加一单张。比数字大小,「A」铁支(AAAA)最大
  No.3葫芦 由「三条」加一个「对子」所组成的牌,若别家也有此牌型,则比三条数字大小
  No.4同花 不构成顺子的五张同花色的牌。先比数字最大的单张,如相同再比第二支、依此类推,如果5张牌大小都相同,那么比它们的花色。
  No.5顺子 五张连续数字的牌组。 以A为首的顺子最大,如果大家都是顺子,比最大的一张牌,如果大小还一样就比这张牌的花式(JQKA2,QKA23,KA234不算顺子).
  No.6三条 牌型由三张相同的牌组成,以A为首的三条(AAA)最大
  No.7二对 牌型中五张牌由两组两张同数字的牌所组成。若遇相同则先比这副牌中最大的一对,如又相同再比第二对,如果还是一样,比大对子中的最大花式
  No.8对子 牌型由两张相同的牌加上三张单张所组成。如果大家都是对子,比对子的大小,如果对子也一样,比这个对子中的最大花色
No.9散牌 单一型态的五张散牌所组成,不成对(二对),不成三条,不成顺(同花顺),不成同花,不成葫芦,不成铁支。先比最大一张牌的大小,如果大小一样,比这张牌的花色。

输入
多组测试数据。每组输入第一行是一个整数T 代表输入组数。每组输入一行,每行描述5张扑克,每个描述由一个字符(2-9,TJQKA)和一个数字(0-4分别代表黑桃,红桃,方片,梅花)组成。每个字符或数字用一个空格隔开。 输出
每组数据,请输出牌型所对应的编号。

Sample Input
4
A 3 Q 3 T 3 K 3 J 3
K 0 K 1 K 2 K 3 A 0
T 0 9 1 T 3 9 3 3 3
K 0 A 1 2 2 3 1 4 1
Sample Output
1
2
7
9
分析
按照描述一步一步写程序,可能会涉及排序和查找.

参考代码

/* 
* Title  :...
* From   :...
* Time   :...
* Author :Eric Zhou,binfeihan
* Email  :binfeihan@126.com
* Blog   :http://blog.csdn.net/binfeihan
*/
import java.util.*;
class Card{
	public char point;
	public int value;
};
public class Main {
	final public static int CN = 5;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int cases = sc.nextInt();
		Card card[] = new Card[CN];
		sc.nextLine();
		while(cases > 0){
			String s = sc.nextLine();
			String sd[] = s.split(" ");
			for(int i = 0;i < CN;++ i){
				card[i] = new Card();
				int j = i * 2;
				card[i].point = sd[j].charAt(0);
				switch(card[i].point){
					case 'T':
						card[i].point = '9' + 1;
						break;
					case 'J':
						card[i].point = '9' + 2;
						break;
					case 'Q':
						card[i].point = '9' + 3;
						break;
					case 'K':
						card[i].point = '9' + 4;
						break;
					case 'A':
						card[i].point = '9' + 5;
						break;
					default:
						break;
				}
				card[i].value = sd[j + 1].charAt(0) - '0';
			}
			System.out.println(check(card));
			cases --;
		}
	}
	private static int check(Card[] card) {
		int i,j;
		boolean samecolored = true;
		boolean sorted = true;
		boolean foured = true;
		boolean threed = true;
		int doubled = 0;
		int kind = 1;
		//check color
		int color = card[0].value;
		for(i = 0;i < CN;++ i){
			if(card[i].value != color){
				samecolored= false;
				break;
			}
		}
		//check sequence
		Card temp;
		boolean bl = true;
		for(i =  1;i < CN;++ i){
			for(j = 0;j < CN - i;++ j){
				bl = true;
				if(card[j].point > card[j + 1].point){
					temp = card[j];
					card[j] = card[j + 1];
					card[j + 1] =  temp;
					bl = false;
				}
			}
			if(bl){
				break;
			}
		}
		for(i = 0;i < CN - 1;++ i){
			if(card[i].point + 1 != card[i+ 1].point){
				sorted = false;
				break;
			}
		}
		//check 'A1234'
		if(!sorted){
			sorted = true;
			for(i = 0;i < CN - 2;++ i){
				if(card[i].point + 1 != card[i+ 1].point){
					sorted = false;
					break;
				}
			}
			if(sorted){
				if(card[0].point == '2' && card[4].point == ('9' + 5)){
					sorted = true;
				}else{
					sorted = false;
				}
			}
		}
		//kind = 1
		if(samecolored && sorted){
			return kind;
		}
		kind ++;
		//check four same point cards
		for(i =  0;i < CN - 2;++ i){
			if(card[i].point != card[i + 1].point){
				foured = false;
				break;
			}
		}
		if(!foured){
			for(i =  1;i < CN - 1;++ i){
				if(card[i].point != card[i + 1].point){
					foured = false;
					break;
				}
			}
		}
		//kind = 2
		if(foured){
			return kind;
		}
		kind ++;
		int cdlist[] = new int[13];
		for(i = 0;i < 13; ++ i){
			cdlist[i] = 0;
		}
		for(i = 0;i < CN;++ i){
			cdlist[card[i].point - '2'] ++;
		}
		threed = false;
		for(i = 0;i < 13;++ i){
			if(cdlist[i] == 3){
				threed = true;
			}
			if(cdlist[i] == 2){
				doubled ++;
			}
		}
		//kind = 3
		if(threed && doubled == 1){
			return kind;
		}
		kind ++;
		//kind = 4
		if(samecolored){
			return kind;
		}
		kind ++;
		//kind = 5
		if(sorted){
			return kind;
		}
		kind ++;
		//kind = 6
		if(threed){
			return kind;
		}
		kind ++;
		//kind = 7
		if(doubled == 2){
			return kind;
		}
		kind ++;
		//kind = 8
		if(doubled == 1){
			return kind;
		}
		kind ++;
		//kind = 9
		return kind;
	}
}


 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值