(demo)java代码实现炸金花(下注简化版)(希望大佬能帮忙优化)

一、游戏要求

1.设置参与的人数,并给每个人设置名字、序号和初始金币
2.设置本局消耗金币(底注)
3.开始玩游戏
每位玩家看牌后选择下注或者弃牌
当仅剩2名玩家的时候开始比牌
4、一局游戏结束,显示所有玩家当前的金币信息

二、代码分析

1、Java是面向对象编程,所以我们要抽类

  • ①Poker类(包含准备一副牌,产生发牌索引便于后续发牌
  • ②Player类(包含玩家的基本信息,getPoker方法==通过Poker类的索引获取三张牌,lostMoney抛出的钱,winMoney赢的钱,当然还有构造方法和getter and setter)

2、在主方法中按照代码要求依次实现

三、代码实现

1、Poker类

import java.util.*;
public class Poker {

    public Poker() {
    }



    //准备一副牌
    public HashMap<Integer, String> prePoker(){
        List<String> colors = List.of("♠", "♥", "♣", "♦");
        List<String> num = List.of("2", "A", "K", "Q", "J",  "9", "8", "7", "6", "5", "4", "3");
        HashMap<Integer, String> map = new HashMap<>();

        int index = 0;
        for (String color : colors) {
            for (String number : num) {
                map.put(index, "-"+color +"-"+ number+"-");
                index++;
            }
        }
        return map;
    }
    public List<Integer> index(){
        List<Integer> list=new ArrayList<>();
        for (int i = 0; i < 52; i++) {
            list.add(i);
        }
        Collections.shuffle(list);
        return list;
    }
}

PS:

  • 为什么我在拼接一副牌的时候前后都加了"-"
    在这里插入图片描述
    这是为饿了最后比牌的时候通过String类的split方法将花色与点数分开以便于比较

  • 调用shuffle方法后后续发牌只需要调用index集合中不重复的元素,即可实现洗牌和发牌。
    在这里插入图片描述

2、Player类

import java.util.*;

public class Player {
    private String name;
    private int number;
    private int money;
    //玩家的是否弃牌状态  true==继续游戏  false==弃牌
    private boolean flag=true;

    public Player(String name, int number, int money) {
        this.name = name;
        this.number = number;
        this.money = money;
    }

    public Player() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public void winnerMoney(int win){
        money=money+win;
    }

    public void lostMoney(int lost) {
        if (lost <= money) {
            money = money - lost;
        } else {
            System.out.println("下注失败请重新下注");
            lose(lost);
        }
    }
        private void lose(int lose){
        if(lose<=money ){
            money=money-lose;
        }
    }


    //产生三张玩家牌
    public ArrayList<String> getpocker(List<Integer> index,int number,HashMap<Integer, String> map){

       ArrayList<String > pai=new ArrayList<>();
        int r = 3 * number - 1;
       for (int i=0; i < 3; i++) {

            pai.add(map.get(index.get(r)));
            r--;
        }
        return pai;
    }
}

PS:

  • 1、为什么有两个关于输钱的方法
    在这里插入图片描述
    虽然他们都是关于输钱的方法但是当中的修饰符不一样private修饰的方法仅Player类内部可使用,是为了解决lostMoney方法中下注失败的问题

3、主方法

import java.util.*;

public class Run {


    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        //准备一副牌

        Poker poker=new Poker();
        HashMap<Integer, String> prePoker = poker.prePoker();
        List<Integer> index = poker.index();

        //创建玩家
        ArrayList<Player> players=new ArrayList<>();
        System.out.println("请输入参入人数(2-5)");



        Hashtable<Integer, String> playernamenum = new Hashtable();
        Hashtable<Integer, Integer> playermoney = new Hashtable();
        int playercount = sc.nextInt();
        for (int i = 1; i < playercount + 1; i++) {
            System.out.println("请输入第" + i + "号玩家的姓名");
            String name = sc.next();
            System.out.println("该玩家所拥有的初始金额");
            Integer money = sc.nextInt();
            playernamenum.put(i, name);
            playermoney.put(i, money);
        }


       /* for (int i = 0; i < playercount; i++) {
            players.add(sc.next(),sc.nextInt(),sc.nextInt());
        }*/
        //将玩家存储到玩家类里
        if(playercount==2){
            Player player1=new Player();
            player1.setMoney(playermoney.get(1));
            player1.setName(playernamenum.get(1));
            player1.setNumber(1);

            Player player2=new Player();
            player2.setMoney(playermoney.get(2));
            player2.setName(playernamenum.get(2));
            player2.setNumber(2);

            players.add(player1);
            players.add(player2);
        }else if(playercount==3){
            Player player1=new Player();
            player1.setMoney(playermoney.get(1));
            player1.setName(playernamenum.get(1));
            player1.setNumber(1);

            Player player2=new Player();
            player2.setMoney(playermoney.get(2));
            player2.setName(playernamenum.get(2));
            player2.setNumber(2);

            Player player3=new Player();
            player3.setMoney(playermoney.get(3));
            player3.setName(playernamenum.get(3));
            player3.setNumber(3);

            players.add(player1);
            players.add(player2);
            players.add(player3);
        }else if(playercount==4){
            Player player1=new Player();
            player1.setMoney(playermoney.get(1));
            player1.setName(playernamenum.get(1));
            player1.setNumber(1);

            Player player2=new Player();
            player2.setMoney(playermoney.get(2));
            player2.setName(playernamenum.get(2));
            player2.setNumber(2);

            Player player3=new Player();
            player3.setMoney(playermoney.get(3));
            player3.setName(playernamenum.get(3));
            player3.setNumber(3);

            Player player4=new Player();
            player4.setMoney(playermoney.get(4));
            player4.setName(playernamenum.get(4));
            player4.setNumber(4);

            players.add(player1);
            players.add(player2);
            players.add(player3);
            players.add(player4);
        }else if(playercount==5){
            Player player1=new Player();
            player1.setMoney(playermoney.get(1));
            player1.setName(playernamenum.get(1));
            player1.setNumber(1);

            Player player2=new Player();
            player2.setMoney(playermoney.get(2));
            player2.setName(playernamenum.get(2));
            player2.setNumber(2);

            Player player3=new Player();
            player3.setMoney(playermoney.get(3));
            player3.setName(playernamenum.get(3));
            player3.setNumber(3);

            Player player4=new Player();
            player4.setMoney(playermoney.get(4));
            player4.setName(playernamenum.get(4));
            player4.setNumber(4);

            Player player5=new Player();
            player5.setMoney(playermoney.get(5));
            player5.setName(playernamenum.get(5));
            player5.setNumber(5);

            players.add(player1);
            players.add(player2);
            players.add(player3);
            players.add(player4);
            players.add(player5);
    }

    //开始游戏
    int poolMoney=0;//场上金额
    //设置底注

        System.out.println("请设置底注");
    int leastMoney=sc.nextInt();

    poolMoney=leastMoney*playercount;
        for (Player player : players) {
        player.lostMoney(leastMoney);
    }

        //下注阶段

        while(playercount>2){
            for (Player player : players) {
                if(player.isFlag()==false){

                    continue;
                }else if(player.isFlag()==true){

                    System.out.println("玩家"+player.getName()+"的牌为"+player.getpocker(index,player.getNumber(),prePoker).toString());
                    System.out.println("请玩家选择 1、下注or 2、弃牌" );
                    int choice=sc.nextInt();
                    if(choice==1){
                        System.out.println("请玩家"+player.getName()+"开始下注"+"下注金额大于等于"+leastMoney);
                        int lost = sc.nextInt();
                        player.lostMoney(lost);
                        poolMoney=poolMoney+lost;

                    }
                    if(choice==2){
                        //玩家弃牌 状态改为false
                        player.setFlag(false);
                        // playernamenum.remove(count);
                        playercount--;
                        //只剩两人是结束战斗
                        if(playercount==2){
                            break;
                        }
                    }
                }
            }
        }

        System.out.println("开始比牌");
        //Hashtable<Integer, String> finalpai = new Hashtable();
        ArrayList<String> finalpai=new ArrayList<>();
       //提取出最后的牌
        int[] num=new int[2];
        int t=0;
        for (Player player : players) {
            if(player.isFlag()==true){
                finalpai.add(player.getpocker(index,player.getNumber(),prePoker).toString());
                num[t]=player.getNumber();
                t++;
            }
        }
        /*for (String s : finalpai) {
            System.out.println(s);
        }*/
        //System.out.println("=====================");
        String[] split = finalpai.get(0).split("-");
        String[] split2 = finalpai.get(1).split("-");
        /*for (int i = 0; i < split.length; i++) {
            System.out.println(split[i]+i);
        }*/
        /*
        * [-♦-8-, -♥-9-, -♦-A-]
        [-♣-5-, -♥-5-, -♥-8-]
        =====================
        [   0
        ♦   1
        8   2
        ,   3
        ♥   4
        9   5
        ,   6
        ♦   7
        A   8
        ]   9
        * */
        int score1 = score(split);
        int score2 = score(split2);
        if(score1>score2){
            for (Player player : players) {
                if(player.getNumber()==num[0]){
                    System.out.println("玩家:"+player.getName()+"获胜");
                    player.winnerMoney(poolMoney);
                }
            }
        }else if(score1<score2) {
            for (Player player : players) {
                if (player.getNumber() == num[1]) {
                    System.out.println("玩家:" + player.getName() + "获胜");
                    player.winnerMoney(poolMoney);
                }
            }
        }else if(score1==score2){
            for (Player player : players) {
                if (player.getNumber() == num[1]) {
                    System.out.println("平局");
                    player.winnerMoney((poolMoney)/2);
                }
                if(player.getNumber()==num[0]){
                    player.winnerMoney((poolMoney)/2);
                }
            }
        }

        for (Player player : players) {
            System.out.println("第"+player.getNumber()+"号"+player.getName()+"的金币为"+player.getMoney());
        }
    }
    public static int score(String[] split1){
        int score=0;
        if(split1[1]==split1[4]&&split1[4]==split1[7]){
            score=score+1000;
        }
        //对子
        if(split1[2]==split1[5]||split1[8]==split1[5]||split1[3]==split1[8]){
            score=score+50;
        }

        //顺子
        ArrayList<Integer> arr=new ArrayList<>();
        for (int i = 2; i < 9;i=i+3){
            switch (split1[i]){
                case "3":arr.add(3);
                case "4":arr.add(4);
                case "5":arr.add(5);
                case "6":arr.add(6);
                case "7":arr.add(7);
                case "8":arr.add(8);
                case "9":arr.add(9);
                case "J":arr.add(10);
                case "Q":arr.add(11);
                case "K":arr.add(12);
                case "A":arr.add(13);
                case "2":arr.add(14);

            }
        }
        int max=0;
        for (Integer integer : arr) {
            if(max<integer){
                max=integer;
            }
        }
        if(max-((arr.get(0)+arr.get(1)+arr.get(2))/3)==1){
            score=score+100;
        }
        //炸弹
        if(split1[2]==split1[5]&&split1[5]==split1[8]){
            score=score+2000;
        }
        //普通牌
        for (int i = 2; i < 9;i=i+3){
            switch (split1[i]){
                case "3":score=score+3;
                case "4":score=score+4;
                case "5":score=score+5;
                case "6":score=score+6;
                case "7":score=score+7;
                case "8":score=score+8;
                case "9":score=score+9;
                case "J":score=score+10;
                case "Q":score=score+11;
                case "K":score=score+12;
                case "A":score=score+13;
                case "2":score=score+14;
            }
        }
        return score;
    }
}

PS:

  • 1、首先就为什么有这么多的重复代码块在这里插入图片描述
    我也表示无奈
    我也尝试过
    在这里插入图片描述
    直接输入到players集合中,奈何报错,目前还没有想到好的方法解决
  • 2、这一块注释是split集合的遍历 便于确定索引来比牌在这里插入图片描述

四、写在最后(希望广大读者爸爸回复更好的方法)

因为我小白初学不久,很多
代码都显得冗余,杂乱;
思想也不够严谨
甚至一些功能都无法实现(比如这个demo中跟注,或者allin的代码都没有实现,说来惭愧学了这么旧,写个代码能把自己绕进去)
希望读者爸爸们,大佬们等给我建议,要是能帮我改改那就更好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值