热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法三:扎金花

*说明:棋牌*共有52张普通牌面,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张;每人抓三

 * 说明:棋牌
 * 共有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(num1num= -1;
}else if(num1==num2){
num= compareChecss(params1,params2);
}
return num;
}
private static int compareChecss(String[] params1,String[] params2){
int num=0;
List lists = listSort(params1);
List lists2 = listSort(params2);
if(lists==null || lists2==null){ //判断不合法输入
return num=-2;
}
// System.out.println("方式一等值牌型比较:"+lists.toString()+","+lists2.toString());
for (int i = 0; i if(lists.get(i)>lists2.get(i)){
num= 1;
break;
}else if(lists.get(i)num= -1;
break;
}
}
return num;
}
/**
* 方式二:
* (1)将牌进行数字化,2-14,
* (2)排序
* (3)规定:
* ①普通牌型不动
* ②如果是对子&#xff0c;将对子牌值*10倍(保证&#xff1a;普通牌值最大14*3<对子最小牌值2*25)
* ③如果是顺子&#xff0c;将顺子牌值*100倍(保证&#xff1a;对子最大牌值140*3<顺子最小牌值2*250)
* ④如果是豹子&#xff0c;将豹子牌值*1000倍(保证&#xff1a;顺子最大牌值1400*3<豹子最小牌值2*2500)
* (4)比较牌值大小
*/
private static int compareChecss2(String[] params1,String[] params2){
int num&#61;-2;
int num1&#61;ChecssType2(params1);
int num2&#61;ChecssType2(params2);
// System.out.println("方式二牌值比较&#xff1a;"&#43;num1&#43;","&#43;num2);
if(num1&#61;&#61;0 || num2&#61;&#61;0){ //不合法输入
}else if(num1>num2){
num&#61; 1;
}else if(num1num&#61; -1;
}else if(num1&#61;&#61;num2){
num&#61; 0;
}
return num;
}
/**
* 方式一
* 判断牌型
* &#64;param data
* &#64;return
*/
private static int ChecssType1(String[] data) {
List lists &#61; new ArrayList();
int type &#61; 1;
int num&#61;0;
if (data !&#61; null) {
Set sets &#61; new HashSet(Arrays.asList(data));
type &#61; sets.size();
// 判断豹子&#xff0c;对子
switch (type) {
case 1:
type &#61; 4;
break;
case 2:
type &#61; 2;
break;
case 3:
for (String str : sets) {
num&#61; checkToNumber(str);
if(num&#61;&#61;0){//不合法输入
return type;
}
lists.add(checkToNumber(str));
}
// 倒叙排列
Collections.sort(lists);
Collections.reverse(lists);
if (lists.get(0) &#61;&#61; (lists.get(1) &#43; 1) && (lists.get(2) &#43; 1) &#61;&#61; lists.get(1)) {
type &#61; 3;
} else {
type &#61; 1;
}
break;
default:
type &#61; 0;
break;
}
}
return type;
}
/**
* 方式二
* 判断牌型,并改变牌值
* &#64;param data
* &#64;return
*/
private static int ChecssType2(String[] data) {
int type &#61; 0;
if (data !&#61; null) {
List list &#61; listSort(data);
if(list!&#61;null){
if(list.get(0)&#61;&#61;list.get(1) && list.get(2)&#61;&#61;list.get(1)){ //豹子
type&#61;list.get(0)*2500;
type&#61;type&#43;type&#43;type;
}else if(list.get(0)&#61;&#61;(list.get(1)&#43;1) && (list.get(2)&#43;1)&#61;&#61;list.get(1)){//顺子
type&#61;list.get(0)*250&#43;list.get(1)*250&#43;list.get(2)*250;
}else if(list.get(0)&#61;&#61;list.get(1) || list.get(2)&#61;&#61;list.get(1)){ //对于
type&#61;list.get(0)*25&#43;list.get(1)*25&#43;list.get(2)*25;
}else{
type&#61;list.get(0)&#43;list.get(1)&#43;list.get(2);
}
}
}
return type;
}
/**
* 排序
*/
private static List listSort(String[] data){
List lists&#61;new ArrayList();
int num&#61;0;
if(data&#61;&#61;null || data.length<&#61;0){
return null;
}else{
for (String params : data) {
num&#61; checkToNumber(params);
if(num&#61;&#61;0){ //不合法输入
return null;
}
lists.add(checkToNumber(params));
}
// List list&#61;Arrays.asList(data);
//倒叙排列
Collections.sort(lists); //顺序排列
Collections.reverse(lists);//翻转
return lists;
}
}
/**
* 将牌进行数字化2-14
*/
private static int checkToNumber(String params){
int num&#61;0;
if(params!&#61;null && params.length()>0){
params&#61;params.toUpperCase();
if(params.equals("A") || params.equals("J") || params.equals("Q") || params.equals("K")){
switch (params.toUpperCase()) {
case "J":
num&#61;11;
break;
case "Q":
num&#61;12;
break;
case "K":
num&#61;13;
break;
default:
num&#61;14;
break;
}
}else{
num&#61;Integer.parseInt(params);
if(num<2 || num>10){//不合法输入
num&#61;0;
}
}
}
return num;
}
/**
* 输出结果
*/
private static void printResult(int params){
switch (params) {
case 1:
System.out.println("玩家1赢&#61;&#61;&#61;&#61;&#61;"&#43;params);
break;
case 0:
System.out.println("平局&#61;&#61;&#61;&#61;&#61;&#61;&#61;"&#43;params);
break;
case -1:
System.out.println("玩家1赢&#61;&#61;&#61;&#61;&#61;&#61;"&#43;params);
break;
default:
System.out.println("输入不合法&#61;&#61;&#61;&#61;&#61;&#61;"&#43;params);
break;
}
}
public static void main(String[] args) {
String[] data1_1&#61;{"K","Q","3"};String[] data2_1&#61;{"3","Q","9"};
String[] data1_2&#61;{"10","Q","A"};String[] data2_2&#61;{"6","10","2"};
String[] data1_3&#61;{"5","8","10"};String[] data2_3&#61;{"7","k","k"};
String[] data1_4&#61;{"6","3","2"};String[] data2_4&#61;{"7","4","J"};
// String[] data1_5&#61;{"10","10","2"};String[] data2_5&#61;{"K","7","7"};
// String[] data1_6&#61;{"J","K","J"};String[] data2_6&#61;{"9","2","6"};
// String[] data1_7&#61;{"6","8","K"};String[] data2_7&#61;{"2","7","A"};
System.out.println("&#61;&#61;&#61;&#61;&#61;方式1——打印比较结果1&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");
printResult(compareChecss1(data1_1,data2_1));
System.out.println("&#61;&#61;&#61;&#61;&#61;方式2——打印比较结果1&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");
printResult(compareChecss2(data1_1,data2_1));
System.out.println("&#61;&#61;&#61;&#61;&#61;方式1——打印比较结果2&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");
printResult(compareChecss1(data1_2,data2_2));
System.out.println("&#61;&#61;&#61;&#61;&#61;方式2——打印比较结果2&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");
printResult(compareChecss2(data1_2,data2_2));
System.out.println("&#61;&#61;&#61;&#61;&#61;方式1——打印比较结果3&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");
printResult(compareChecss1(data1_3,data2_3));
System.out.println("&#61;&#61;&#61;&#61;&#61;方式2——打印比较结果3&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");
printResult(compareChecss2(data1_3,data2_3));
System.out.println("&#61;&#61;&#61;&#61;&#61;方式1——打印比较结果4&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");
printResult(compareChecss1(data1_4,data2_4));
System.out.println("&#61;&#61;&#61;&#61;&#61;方式2——打印比较结果4&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");
printResult(compareChecss2(data1_4,data2_4));
}
}

 


推荐阅读
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
author-avatar
x08308926
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有