震惊!我居然做了澳门葡京发卡姬

引言

这次主要完成一个小demo,利用Java实现对24张牌的随机抽取并实现牌的大小对比。本次便是使用的对比方法是跟德州扑克比较单个牌比较方法,及牌的大小判定方式为345678910JQKA 按从小到大顺序排列,花色大小排序为♤♡♧♢

  • 代码一览
  • 代码程序分析
  • 坑点
  • 总结

代码一览

工程截图

image.png

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讲解

  • 思路
    情况分析
  • 总结
思路

作为对比字符的题目,含有两个字符的比较也就增加了一定难度,但是问题不大!!!

image.png

对于两张牌首个字符也就是数字与"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环节

image.png

ck.checkWhichIsBigger(text1,text2);//竟然只有一行

结果

随机从52张牌中抽取两张


4



J


第二张随机牌更大

然而这只是开胃菜,我们在text2学会了走路,接下来我们要学习如何铺砖了,我们先从randomPoker的子类checks开始说起。
  • checks详解
    我们从text2的详解可以知道checks类所包含的方法不仅可以判断两张牌是否相等,还可以判断两张牌的大小关系,那么首先我们从checks说起。
  1. 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内不存在字符的解决方案是整个发牌对比器的精髓,希望读者能够理解,如果对你有帮助,也不忘推荐给你的朋友哦。

image.png

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容