引言
这次主要完成一个小demo,利用Java实现对24张牌的随机抽取并实现牌的大小对比。本次便是使用的对比方法是跟德州扑克比较单个牌比较方法,及牌的大小判定方式为345678910JQKA 按从小到大顺序排列,花色大小排序为♤♡♧♢
- 代码一览
- 代码程序分析
- 坑点
- 总结
代码一览
工程截图

text1代码(实现输入牌类型的比较)
package foker;
import java.util.Scanner;
public class text1 {
public static void main(String[] args) {
System.out.println("请输入你要比较的俩个扑克牌的样式");
Scanner sc=new Scanner(System.in);
String poker1=sc.next();//第一张牌
String poker2=sc.next();//第二张牌
char replace1=poker1.charAt(0);//第一张牌首字符
char replace2=poker2.charAt(0);//第二张牌首字符
if(poker1.charAt(0)>='A'&&poker1.charAt(0)<='Z')//将首字符大写全部转换为小写
{
replace1+=32;
}
if(poker2.charAt(0)>='A'&&poker2.charAt(0)<='Z')
{
replace2+=32;
}
int foreign1=(int)replace1 -48;//使foreign从字符转换为实际表现的数
int foreign2=(int) replace2-48;
String shape="♤♡♧♢";
char shape1=poker1.charAt(1);
char shape2=poker2.charAt(1);
int idexshape1=0;
int idexshape2=0;
if(foreign1==foreign2)
{
for(int i=0;i<4;i++)//遍历寻找花色下标
{
if(shape1==shape.charAt(i))
{
idexshape1=i;
}
if(shape2==shape.charAt(i))
{
idexshape2=i;
}
}
if(idexshape1>idexshape2)
{
System.out.println("第一个大");
}
if(idexshape1==idexshape2)
{
System.out.println("一样大");
}
if(idexshape1<idexshape2)
{
System.out.println("第二个大");
}
}
else {
if(foreign1>foreign2)
{
System.out.println("第一个大");
}
if (foreign1<foreign2)
{
System.out.println("第二个da");
}
}
}
}
text2代码(实现随机抽牌)
package foker;
public class text2 {
public static void main(String[] args) {
System.out.println("随机从52张牌中抽取两张");
randomPoker text1=new randomPoker();
randomPoker text2=new randomPoker();
checks ck=new checks();
while(!ck.checkIFRDitISSame(text1,text2)){//防止出现重复的牌
text1.foreign= text1.findforeignrd();
text1.shape= text1.findshape();
text2.foreign= text2.findforeignrd();
text2.shape= text2.findshape();
}
ck.checkWhichIsBigger(text1,text2);
}
}
text2代码引用类
####### randomPoker(实现随机抽卡)
package foker;
import java.util.Random;
public class randomPoker {
randomPoker(){}
randomPoker t1;
protected char foreign=findforeignrd();
protected char shape=findshape();
protected int Foreignidex=getForeignidex();
protected int Shapeidex=getShapeidex();
public char findforeignrd(){
char rdforeign='a';
Random rd=new Random();
String maprd="345678910JQKA";
char thisif='p';
int index=rd.nextInt(maprd.length()-1);
if(maprd.charAt(index)=='1'||maprd.charAt(index)=='0')
{
return thisif;
}
return maprd.charAt(index);
}
public int getShapeidex()
{
String maprd="♤♡♧♢";
int idex=0;
for(int i=0;i<maprd.length();i++)
{
if(shape==maprd.charAt(i))
{
idex=i;
}
}
return idex;
}
public int getForeignidex(){
String maprd="3456789JQKA2";
if(foreign=='p')
{
return 8;
}
int idex=0;
for(int i=0;i<maprd.length();i++)
{
if(foreign==maprd.charAt(i))
{
if((foreign>='J'&&foreign<='A')||foreign=='2')
{
idex=i+1;
}
idex=i;
}
}
return idex;
}
public char findshape(){
char shape='a';
Random rd=new Random();
String maprd="♤♡♧♢";
int index=rd.nextInt(maprd.length()-1);
return maprd.charAt(index);
}
}
check(randomPoker的子类,同时包含检查、对比牌的功能)
package foker;
public class checks extends randomPoker{
public boolean checkIFRDitISSame(randomPoker t1,randomPoker t2)//检查随机生成的书是否相同
{
if(t1.foreign==t2.foreign&&t1.shape==t2.shape)
{
return false;
}
else
{
return true;
}
}
public void checkWhichIsBigger(randomPoker text1,randomPoker text2)
{
System.out.println("************");
if(text1.foreign=='p')
{
System.out.print("10");
}
else {
System.out.print(text1.foreign);
}
System.out.println("\n"+text1.shape);
System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println("************");
System.out.println();
System.out.println("************");
if(text2.foreign=='p')
{
System.out.print("10");
}
else {
System.out.print(text2.foreign);
}
System.out.println("\n"+text2.shape);
System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println("************");
if(text1.Foreignidex> text2.Foreignidex)
{
System.out.println("第一张随机牌更大");
}
else if(text1.Foreignidex<text2.Foreignidex)
{
System.out.println("第二张随机牌更大");
}
else{
if(text1.Shapeidex> text2.Shapeidex)
{
System.out.println("第一张随机牌更大");
}
else if(text1.Shapeidex<text2.Shapeidex)
{
System.out.println("第二张随机牌更大");
}
}
}
}
代码程序分析
温馨提示:对于Java能力十分自信的盆友可以跳过text1的程序分析,但是不要跳过text2的讲解,这样的骚操作一定会让你收益匪浅(对于text1的讲解我故意留了几个坑点,还有几个错误,率先找到的朋友可以获得5元现金奖励哟)
text1讲解
- 思路
情况分析 - 总结
思路
作为对比字符的题目,含有两个字符的比较也就增加了一定难度,但是问题不大!!!

对于两张牌首个字符也就是数字与"JQKA"的大小比较 比较简单,因为Ascll表完全符合这样的比较方式,所以我不过多赘述。接下来我着重讲解花色的比较。如果两张牌已经在这上面分出胜负,便没有必要比花色了。
花色比较
认真了解过了Ascll表的同鞋一定这三种花色是不存在于Ascll表内的,所以我们只能定义着这种字符,但是却无法进行有效的对比,所以我想到了自己定义大小顺序的方式,实现字符的对比,也就是这样
String shape="♤♡♧♢";
这样我们就能通过遍历我们所定义的shap字符串,寻找两张牌花色匹配shap的花色,并保存他们俩个花色所匹配位置在shap中的下标,然后通过比较他们的下标然后我们就能知道他们的大小关系。有关代码如下:
if(foreign1==foreign2)
{
for(int i=0;i<4;i++)
{
if(shape1==shape.charAt(i))
{
idexshape1=i;
}
if(shape2==shape.charAt(i))
{
idexshape2=i;
}
}
if(idexshape1>idexshape2)
{
System.out.println("第一个大");
}
if(idexshape1==idexshape2)
{
System.out.println("一样大");
}
if(idexshape1<idexshape2)
{
System.out.println("第二个大");
}
}
这样我们便完成了text1的主要介绍。
总结
对于无法比较的特殊字符,可以通过字符串的方式定义它的具体大小关系,然后获得输入字符的下标进行比较。
text2讲解
看完text1讲解和直接跳到这里的朋友们,你们真的很棒,接下来我即将讲述的text2继承了text1的主体思想,但是我们都知道Java语言不同于其他语言,它有更好的利用代码的封装性,这又就导致了我的text2代码只有短短的十行,不过就是这短短的十行里面的内容却是text1的几倍,为了让读者更加了解text2,我先不分析其中的方法如何运行,先给大家介绍text2的主体内容。
text2主体
-
构架
首先我们知道我们要应用方法随机抽取两张牌。也就是这样
System.out.println("随机从52张牌中抽取两张");
randomPoker text1=new randomPoker();
randomPoker text2=new randomPoker();
然后我们为了确定是否会因为有人捣乱让我们得到两个一样的牌,我们调用checks
如果相同,我们便会重新抽卡直到没有人捣乱
checks ck=new checks();
while(!ck.checkIFRDitISSame(text1,text2)){//防止出现重复的牌
text1.foreign= text1.findforeignrd();
text1.shape= text1.findshape();
text2.foreign= text2.findforeignrd();
text2.shape= text2.findshape();
}
(这个我本来打算也封装起来,但是考虑到main还是要有两位数行的代码便把这个方法单独写出来了)
最后便是紧张的check环节

ck.checkWhichIsBigger(text1,text2);//竟然只有一行
结果
随机从52张牌中抽取两张
4
♡
J
♤
第二张随机牌更大
然而这只是开胃菜,我们在text2学会了走路,接下来我们要学习如何铺砖了,我们先从randomPoker的子类checks开始说起。
- checks详解
我们从text2的详解可以知道checks类所包含的方法不仅可以判断两张牌是否相等,还可以判断两张牌的大小关系,那么首先我们从checks说起。
- checkIFRDitISSame(判断两张牌是否相等)
public boolean checkIFRDitISSame(randomPoker t1,randomPoker t2)//检查随机生成的牌是否相同
{
if(t1.foreign==t2.foreign&&t1.shape==t2.shape)
{
return false;
}
else
{
return true;
}
}
t1和t2显而易见是定义的两张牌的参数,该方法通过比较两张牌两个字符是否相等来进行判断,巧用boolean类则是最好的方法。
2.checkWhichIsBigger(判断两张牌的大小关系)
public void checkWhichIsBigger(randomPoker text1,randomPoker text2)
{
System.out.println("************");
if(text1.foreign=='p')//判断输入是否为十
{
System.out.print("10");
}
else {
System.out.print(text1.foreign);
}
System.out.println("\n"+text1.shape);
System.out.println("************");
System.out.println();
System.out.println("************");
if(text2.foreign=='p')
{
System.out.print("10");
}
else {
System.out.print(text2.foreign);
}
System.out.println("\n"+text2.shape);
System.out.println("************");
if(text1.Foreignidex> text2.Foreignidex)
{
System.out.println("第一张随机牌更大");
}
else if(text1.Foreignidex<text2.Foreignidex)
{
System.out.println("第二张随机牌更大");
}
else{
if(text1.Shapeidex> text2.Shapeidex)
{
System.out.println("第一张随机牌更大");
}
else if(text1.Shapeidex<text2.Shapeidex)
{
System.out.println("第二张随机牌更大");
}
}
对于输出两张牌的方式,读者可以根据自己喜欢的方式进行修改,对于这一行
if(text1.foreign=='p')
{
System.out.print("10");
}
else {
System.out.print(text1.foreign);
}
暂时理解为10这个数据具有一定的特殊情况,所以需要通过'p'这样的方式进行输出,然后对于比较两个牌的大小可以参考上文对于text1的讲解,这里不做过多赘述
理解清楚checks类的工作原理后我们整理思路进入底层父类randomPoker的讲解
- 数据的应用
randomPoker(){}
protected char foreign=findforeignrd();//赋值第一个字符
protected char shape=findshape();//赋值花色
protected int Foreignidex=getForeignidex();//得到第一字符的字符位置(思路请看上文对text1的讲解
protected int Shapeidex=getShapeidex();//得到花色的字符位置
建立空的构造函数这没说的,通过英文大家可以看明白我对于每个数据的赋值使用了函数,这个也许大家会感到疑惑为什么我不把赋值放在在main函数里面进行,事实上我则是为了让main函数变得更加简洁。下面我一一讲解每个函数的具体操作
- findforeignrd
public char findforeignrd(){
char rdforeign='a';
Random rd=new Random();
String maprd="34567891JQKA";
char thisif='p';//判断10
int index=rd.nextInt(maprd.length()-1);
if(maprd.charAt(index)=='1')//判断10的情况
{
return thisif;
}
return maprd.charAt(index);
}
读者可能会感到疑惑我为什么要判断10,大家知道Ascll是缺少对10的码值的,所以说系统会自动识别我们输入的10为一个字符串而不是单个字符,所以我们则必须判断,并解析10,用另一种方式将10表现出来,首先我们用1代替了10,然后这里我想到了用字符替代法用来表示10(如果有更好的方法欢迎读者与我交流)对于随机数的使用方法,大家可以上网查阅。
- findshape
public char findshape(){
Random rd=new Random();
String maprd="♤♡♧♢";
int index=rd.nextInt(maprd.length()-1);
return maprd.charAt(index);
}
这个也同样十分清晰明了,需要注意的坑点是不要越界,这也是第四行代码处理方法。
- getForeignidex
public int getForeignidex(){
String maprd="3456789JQKA2";
if(foreign=='p')
{
return 8;
}
int idex=0;
for(int i=0;i<maprd.length();i++)
{
if(foreign==maprd.charAt(i))
{
if((foreign>='J'&&foreign<='A')||foreign=='2')
{
idex=i+1;
}
idex=i;
}
}
return idex;
}
一切往常如初,但是这里有个魔鬼细节——上文刚刚讲到Ascll是缺少对10的码值的,所以我们这次定义字符串时去掉了10,然后通过判断第一个字符是否为'p'也就是说他是10这种情况。
这里又有一个魔鬼细节我们在判断匹配的时候需要将JQKA2原本的位置加1这样就间接为10开辟了一个位置(实际上是没有的),这样我们就能顺利比较第一个字符了
- getShapeidex(获取花色的位置)
public int getShapeidex()
{
String maprd="♤♡♧♢";
int idex=0;
for(int i=0;i<maprd.length();i++)
{
if(shape==maprd.charAt(i))
{
idex=i;
}
}
return idex;
}
这个较为简单,读者结合上文理解。
总结
对于随机数的理解,对于不存在于Ascll内不存在字符的解决方案是整个发牌对比器的精髓,希望读者能够理解,如果对你有帮助,也不忘推荐给你的朋友哦。
