* 说明:棋牌
* 共有52张普通牌面,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张;每人抓三张牌。两人比较手中三张牌大小,大的为胜。
* 规则:
* 1、三张牌一样即为豹子
* 2、三张牌相连为顺子(A23不是顺子)
* 3、有且仅有两张牌一样的为对子
* 豹子>顺子>对子>普通牌型
* 在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2>10104)二人均无特殊牌型时,依次比较三张排中最大的。
* 大的人获胜,如果最大的牌一样,则比较第二大,以此类推(如37k>89Q)如二人牌面相同,则为平局。
*
* 输入描述:输入两个字符串代表两个玩家的牌(如:“10KQ”"354")先输入的玩家1,后输入的玩家2
* 输出描述:1代表玩家1赢;0代表平局;-1代表玩家2赢;-2代表不合法的输入
* 输入例子:KQ3 3Q9,10QA 6102,5810 7KK
* 输出例子:1,1,-1
实现代码与思路:
public class Chess { /** * 方法一: * 思路:(1)将牌数字化2-14 * (2)将牌进行排序 * (3)规定牌型,4-豹子,3-顺子,2-对子,1-普通 * (4)比较牌型数值,如果牌型一样,进入(5) * (5)比较牌值大小 */ private static int compareChecss1(String[] params1,String[] params2){ int num=-2; int num1=ChecssType1(params1); int num2=ChecssType1(params2); // System.out.println("方式一牌值比较:"+num1+","+num2); if(num1==0 || num2==0){ //判断不合法输入 }else if(num1>num2){ num= 1; }else if(num1<num2){ num= -1; }else if(num1==num2){ num= compareChecss(params1,params2); } return num; } private static int compareChecss(String[] params1,String[] params2){ int num=0; List<Integer> lists = listSort(params1); List<Integer> lists2 = listSort(params2); if(lists==null || lists2==null){ //判断不合法输入 return num=-2; } // System.out.println("方式一等值牌型比较:"+lists.toString()+","+lists2.toString()); for (int i = 0; i < lists.size(); i++) { if(lists.get(i)>lists2.get(i)){ num= 1; break; }else if(lists.get(i)<lists2.get(i)){ num= -1; break; } } return num; } /** * 方式二: * (1)将牌进行数字化,2-14, * (2)排序 * (3)规定: * ①普通牌型不动 * ②如果是对子,将对子牌值*10倍(保证:普通牌值最大14*3<对子最小牌值2*25) * ③如果是顺子,将顺子牌值*100倍(保证:对子最大牌值140*3<顺子最小牌值2*250) * ④如果是豹子,将豹子牌值*1000倍(保证:顺子最大牌值1400*3<豹子最小牌值2*2500) * (4)比较牌值大小 */ private static int compareChecss2(String[] params1,String[] params2){ int num=-2; int num1=ChecssType2(params1); int num2=ChecssType2(params2); // System.out.println("方式二牌值比较:"+num1+","+num2); if(num1==0 || num2==0){ //不合法输入 }else if(num1>num2){ num= 1; }else if(num1<num2){ num= -1; }else if(num1==num2){ num= 0; } return num; } /** * 方式一 * 判断牌型 * @param data * @return */ private static int ChecssType1(String[] data) { List<Integer> lists = new ArrayList<Integer>(); int type = 1; int num=0; if (data != null) { Set<String> sets = new HashSet<String>(Arrays.asList(data)); type = sets.size(); // 判断豹子,对子 switch (type) { case 1: type = 4; break; case 2: type = 2; break; case 3: for (String str : sets) { num= checkToNumber(str); if(num==0){//不合法输入 return type; } lists.add(checkToNumber(str)); } // 倒叙排列 Collections.sort(lists); Collections.reverse(lists); if (lists.get(0) == (lists.get(1) + 1) && (lists.get(2) + 1) == lists.get(1)) { type = 3; } else { type = 1; } break; default: type = 0; break; } } return type; } /** * 方式二 * 判断牌型,并改变牌值 * @param data * @return */ private static int ChecssType2(String[] data) { int type = 0; if (data != null) { List<Integer> list = listSort(data); if(list!=null){ if(list.get(0)==list.get(1) && list.get(2)==list.get(1)){ //豹子 type=list.get(0)*2500; type=type+type+type; }else if(list.get(0)==(list.get(1)+1) && (list.get(2)+1)==list.get(1)){//顺子 type=list.get(0)*250+list.get(1)*250+list.get(2)*250; }else if(list.get(0)==list.get(1) || list.get(2)==list.get(1)){ //对于 type=list.get(0)*25+list.get(1)*25+list.get(2)*25; }else{ type=list.get(0)+list.get(1)+list.get(2); } } } return type; } /** * 排序 */ private static List<Integer> listSort(String[] data){ List<Integer> lists=new ArrayList<Integer>(); int num=0; if(data==null || data.length<=0){ return null; }else{ for (String params : data) { num= checkToNumber(params); if(num==0){ //不合法输入 return null; } lists.add(checkToNumber(params)); } // List<Integer> list=Arrays.asList(data); //倒叙排列 Collections.sort(lists); //顺序排列 Collections.reverse(lists);//翻转 return lists; } } /** * 将牌进行数字化2-14 */ private static int checkToNumber(String params){ int num=0; if(params!=null && params.length()>0){ params=params.toUpperCase(); if(params.equals("A") || params.equals("J") || params.equals("Q") || params.equals("K")){ switch (params.toUpperCase()) { case "J": num=11; break; case "Q": num=12; break; case "K": num=13; break; default: num=14; break; } }else{ num=Integer.parseInt(params); if(num<2 || num>10){//不合法输入 num=0; } } } return num; } /** * 输出结果 */ private static void printResult(int params){ switch (params) { case 1: System.out.println("玩家1赢====="+params); break; case 0: System.out.println("平局======="+params); break; case -1: System.out.println("玩家1赢======"+params); break; default: System.out.println("输入不合法======"+params); break; } } public static void main(String[] args) { String[] data1_1={"K","Q","3"};String[] data2_1={"3","Q","9"}; String[] data1_2={"10","Q","A"};String[] data2_2={"6","10","2"}; String[] data1_3={"5","8","10"};String[] data2_3={"7","k","k"}; String[] data1_4={"6","3","2"};String[] data2_4={"7","4","J"}; // String[] data1_5={"10","10","2"};String[] data2_5={"K","7","7"}; // String[] data1_6={"J","K","J"};String[] data2_6={"9","2","6"}; // String[] data1_7={"6","8","K"};String[] data2_7={"2","7","A"}; System.out.println("=====方式1——打印比较结果1=========="); printResult(compareChecss1(data1_1,data2_1)); System.out.println("=====方式2——打印比较结果1=========="); printResult(compareChecss2(data1_1,data2_1)); System.out.println("=====方式1——打印比较结果2=========="); printResult(compareChecss1(data1_2,data2_2)); System.out.println("=====方式2——打印比较结果2=========="); printResult(compareChecss2(data1_2,data2_2)); System.out.println("=====方式1——打印比较结果3=========="); printResult(compareChecss1(data1_3,data2_3)); System.out.println("=====方式2——打印比较结果3=========="); printResult(compareChecss2(data1_3,data2_3)); System.out.println("=====方式1——打印比较结果4=========="); printResult(compareChecss1(data1_4,data2_4)); System.out.println("=====方式2——打印比较结果4=========="); printResult(compareChecss2(data1_4,data2_4)); } }