Java基础综合案列——扑克牌人机小游戏

/*
*
* Pooker
*
* */

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;

public class Pooker {
    //pookerMap存放数字与牌的对应关系,pookerList存放牌对应的数值
    private static HashMap<Integer,String> pookerMap=new HashMap<>();
    private static ArrayList<Integer> pookerList=new ArrayList<>();
    static{String[] colors="♠-♥-♣-♦".split("-");
        String[] nums="2-3-4-5-6-7-8-9-10-J-Q-K-A".split("-");
        int index=0;
        for (String color : colors) {
            for (String num : nums) {
                String onepooker=color+num;
                pookerMap.put(index,onepooker);
                pookerList.add(index++);}
        }
    }
    //打乱数值洗牌
    public static void shufflePooker(){
        Collections.shuffle(pookerList);
    }
    //发牌
    public static ArrayList<Integer>[] deal(ArrayList<Integer>... players){
        int nums= players.length;
        for (int i=0;i<3*nums;i++){
            int x=i%nums;
            players[x].add(pookerList.get(i));
        }
        return players;
    }
    //看牌,查看多人
    public static void show(String[] name,ArrayList<Integer>... players){
        for (int i = 0; i < players.length; i++) {
            Collections.sort(players[i], new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o1%13-o2%13;
                }
            });
            System.out.print(name[i]+":\t");
            for (Integer x : players[i]) {
                System.out.print(pookerMap.get(x)+"\t");
            }
            System.out.println(pookerGrade(players[i]));
        }
    }
    //看牌重载,只看一个人
    public static void show(String name,ArrayList<Integer> player){
            Collections.sort(player, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o1%13-o2%13;
                }
            });
            System.out.print(name+":\t");
            for (Integer x : player) {
                System.out.print(pookerMap.get(x)+"\t");
            }
            System.out.println(pookerGrade(player));

    }
    //查询牌型
    public static String pookerGrade(ArrayList<Integer> pooker){
        int max=pooker.get(0);
        int med=pooker.get(0);
        int min=pooker.get(0);
        for (int i = 1; i < pooker.size(); i++) {
            max=max>pooker.get(i)?max:pooker.get(i);
            min=min<pooker.get(i)?min:pooker.get(i);
        }
        med=pooker.get(0)+pooker.get(1)+pooker.get(2)-max-min;
        int imax=pooker.get(0)%13;
        int imed=pooker.get(0)%13;
        int imin=pooker.get(0)%13;
        for (int i = 1; i < pooker.size(); i++) {
            imax=imax>pooker.get(i)%13?imax:pooker.get(i)%13;
            imin=imin<pooker.get(i)%13?imin:pooker.get(i)%13;
        }
        imed=pooker.get(0)%13+pooker.get(1)%13+pooker.get(2)%13-imin-imax;

        if (imax-imin==0){
            return "豹子";
        }
        else if (imax-imin==2&&max/13==min/13){
            return "顺金";
        }
        else if (max/13==min/13){
            return "金花";
        }
        else if (imax+imin==2*imed&&imax-imin==2){
            return "顺子";
        }
        else if(imax==imed||imin==imed){
            return "对子";
        }
        else {
            return "单张";
        }
    }
    //比牌,player1赢返回true
    public static boolean compare(ArrayList<Integer> pooker1,ArrayList<Integer> pooker2){
        int max=pooker1.get(0);
        int med=pooker1.get(0);
        int min=pooker1.get(0);
        for (int i = 1; i < pooker1.size(); i++) {
            max=max>pooker1.get(i)?max:pooker1.get(i);
            min=min<pooker1.get(i)?min:pooker1.get(i);
        }
        med=pooker1.get(0)+pooker1.get(1)+pooker1.get(2)-max-min;
        int imax=pooker1.get(0)%13;
        int imed=pooker1.get(0)%13;
        int imin=pooker1.get(0)%13;
        for (int i = 1; i < pooker2.size(); i++) {
            imax=imax>pooker1.get(i)%13?imax:pooker1.get(i)%13;
            imin=imin<pooker1.get(i)%13?imin:pooker1.get(i)%13;
        }
        imed=pooker1.get(0)%13+pooker1.get(1)%13+pooker1.get(2)%13-imin-imax;
        int dui=imax==imed?imax:imin;
        int max2=pooker2.get(0);
        int med2=pooker2.get(0);
        int min2=pooker2.get(0);
        for (int i = 1; i < pooker2.size(); i++) {
            max2=max2>pooker2.get(i)?max2:pooker2.get(i);
            min2=min2<pooker2.get(i)?min2:pooker2.get(i);
        }
        med2=pooker2.get(0)+pooker2.get(1)+pooker2.get(2)-max2-min2;
        int imax2=pooker2.get(0)%13;
        int imed2=pooker2.get(0)%13;
        int imin2=pooker2.get(0)%13;
        for (int i = 1; i < pooker2.size(); i++) {
            imax2=imax2>pooker2.get(i)%13?imax2:pooker2.get(i)%13;
            imin2=imin2<pooker2.get(i)%13?imin2:pooker2.get(i)%13;
        }
        imed2=pooker2.get(0)%13+pooker2.get(1)%13+pooker2.get(2)%13-imin2-imax2;
        int dui2=imax2==imed2?imax2:imin2;
        HashMap<String,Integer> gradeMap=new HashMap<>();
        gradeMap.put("豹子",6);
        gradeMap.put("顺金",5);
        gradeMap.put("金花",4);
        gradeMap.put("顺子",3);
        gradeMap.put("对子",2);
        gradeMap.put("单张",1);
        Integer p1Value=gradeMap.get(pookerGrade(pooker1));
        Integer p2Value=gradeMap.get(pookerGrade(pooker2));
        if (p1Value!=p2Value){
            return p1Value>p2Value?true:false;
        }
        else{
            switch (p1Value){
                case 2:
                    if (dui!=dui2){
                        return dui>dui2?true:false;
                    }
                    else if (3*imed-2*dui!=3*imed2-2*dui2){
                        return 3*imed-2*dui>3*imed2-2*dui2?true:false;
                    }
                    else
                        return false;
                case 1:

                case 3:

                case 4:
                    if (imax!=imax2){
                        return imax>imax2?true:false;
                    }
                    else if (imed!=imed2){
                        return imed>imed2?true:false;
                    }
                    else if (imin!=imin2){
                        return imin>imin2?true:false;
                    }
                    else {
                        return max<max2?true:false;
                    }
                case 5:
                    if(imax!=imax2){
                    return imax>imax2?true:false;}
                    else{
                        return max<max2?true:false;
                    }
                case 6:
                    return imax>imax2?true:false;
                default:
                    return false;
            }
        }
    }
    //构造方法
    public Pooker() {
    }

    public static HashMap<Integer, String> getPookerMap() {
        return pookerMap;
    }


    public static ArrayList<Integer> getPookerList() {
        return pookerList;
    }

}

 

 

 

/*
*
* 游戏界面
*
* */
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class PookerMainApp {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Random r=new Random();

        //设置电脑和玩家的初始金额,创建一个数组存放玩家和电脑的牌
        int computerM=100;
        int playerM=100;
        String[] name="电脑-玩家".split("-");
        ArrayList<Integer> computer=new ArrayList<>();
        ArrayList<Integer> player=new ArrayList<>();
        ArrayList<Integer>[] players=new ArrayList[]{computer,player};


        System.out.println("欢迎来到炸金花人机对战");
        String  s="Y";
        b:while (s.equalsIgnoreCase("Y")){
            System.out.println("电脑当前金额:"+computerM+"\t玩家当前金额:"+playerM+"");

            System.out.println("是否开始游戏?(Y/N");
            s=sc.next();
            if (!s.equalsIgnoreCase("y")){
                break;
            }

            System.out.println("开始洗牌");
            Pooker.shufflePooker();

            int money=0;//水钱初始化
            System.out.println("正在注入水钱");
            computerM-=2;
            playerM-=2;
            money+=4;
            System.out.println("当前水钱:"+money+"\t电脑当前金额:"+computerM+"\t玩家当前金额:"+playerM+"");

            System.out.println("现在开始发牌");
            players=Pooker.deal(players[0],players[1]);
            System.out.println("…………");
            System.out.println("牌已发好");

            //初始化每一注的价格,初始化倍数(看牌后为两倍)
            int wM=2;
            int MA=1;

            a:while (true){
                System.out.println("请选择你要进行的操作");
                System.out.println("放弃(1);看牌(2);跟注(3);加注(4);比牌(5");
                switch (sc.nextInt()){

                    //玩家放弃,电脑直接获胜
                    case 1:
                        System.out.println("您选择了放弃,电脑胜利,获得所有水钱");
                        computerM+=money;
                        System.out.println("电脑当前金额:"+computerM+"\t玩家当前金额:"+playerM+"");
                        System.out.println("是否再来一局?(Y/N)");
                        s=sc.next();
                        continue b;

                        //玩家看牌,倍数成为2
                    case 2:
                        System.out.println("您选择看牌,之后的每次跟注,加注都将是两倍");
                        MA=2;
                        Pooker.show(name[1],players[1]);
                        continue;

                        //玩家跟注
                    case 3:
                        System.out.println("你选择跟注,当前跟注价格为"+wM+"元(看牌后为两倍)");
                        money+=wM*MA;
                        playerM-=wM*MA;
                        System.out.println("当前水钱:"+money+"\t电脑当前金额:"+computerM+"\t玩家当前金额:"+playerM+"");
                        break;

                        //玩家加注
                    case 4:
                        System.out.println("你选择加注,请输入加注金额");
                        int jia1=sc.nextInt();
                        int yizhu=(jia1+wM)*MA;
                        money+=yizhu;
                        wM+=jia1;
                        playerM-=yizhu;
                        System.out.println("当前水钱:"+money+"\t电脑当前金额:"+computerM+"\t玩家当前金额:"+playerM+"");
                        break;

                        //玩家比牌
                    case 5:
                        System.out.println("你选择比牌");
                        money+=wM*MA;
                        playerM-=wM*MA;
                        System.out.println("当前水钱:"+money+"\t电脑当前金额:"+computerM+"\t玩家当前金额:"+playerM+"");
                        break a;
                        default:
                            System.out.println("没有该项选择,请重选");
                            continue ;
                            }

                 //电脑根据输赢结果进行选择,有一定的概率输
                System.out.println("电脑开始进行选择");
                if (Pooker.compare(players[0],players[1])){
                    if (r.nextInt(10)<8){
                        System.out.println("电脑选择跟注");
                        computerM-=wM;
                        money+=wM;
                        System.out.println("当前水钱:"+money+"\t电脑当前金额:"+computerM+"\t玩家当前金额:"+playerM+"");
                    }
                    else {
                        System.out.println("电脑选择比牌");
                        break ;
                    }
                }
                else {
                    if (r.nextInt(10)<7){
                        System.out.println("电脑选择放弃");
                        break ;
                    }
                    else {
                        System.out.println("电脑选择跟注");
                        computerM-=wM;
                        money+=wM;
                        System.out.println("当前水钱:"+money+"\t电脑当前金额:"+computerM+"\t玩家当前金额:"+playerM+"");
                    }
                }
               if (computerM<0||playerM<0){
                   System.out.println("已有一方没钱了,直接开牌");
                   break ;
               }
            }

            System.out.println("现在开牌");
            Pooker.show(name,players);

            //判定胜负,决定水钱归属
            if (Pooker.compare(players[0],players[1])){
                System.out.println("电脑获胜");
                computerM+=money;
                System.out.println("电脑当前金额:"+computerM+"\t玩家当前金额:"+playerM+"");
            }
            else {
                System.out.println("恭喜您取得胜利");
                playerM+=money;
                System.out.println("电脑当前金额:"+computerM+"\t玩家当前金额:"+playerM+"");
            }
            if (computerM<0||playerM<0){
                System.out.println("已有一方没钱了,游戏结束");
                break ;
            }

            System.out.println("是否再来一局?(Y/N)");
            s=sc.next();
        }

        System.out.println("谢谢惠顾,期待您的再次光临");
    }
}

 

 

/**

基础知识的综合运用

运行效果如下

 

*/Java基础综合案列——扑克牌人机小游戏