2019-08-09

今天一整天都是在写一个关于扑克牌游戏的Demo。这个Demo对于现在初学Java的我们还是有一定的困难。许多地方都存在着疑问。当然,尝试去写这个Demo对我们还是有好处的,不仅可以去锻炼我们敲代码的速度和手对键盘的熟悉度,嘿嘿,主要是这次Demo代码有点多了。还能去训练的我们的思维逻辑能力,去思考当我们拿到一个Demo时如何去寻找突破口,如何构思它的步骤,如何让它更简洁方便实用等等。

public class Myclass {
        public static void main(String[] args){
            Utils.showText(true,true,new String[]{"西南大学荣昌校区"});
            pokermanager.manager.pai();//生成一副牌
            pokermanager.manager.show();//显示一副牌

            //提示输入玩家的人数
            Utils.showText(false,false,new String[]{"请输入来者人数:"});
            int count=Utils.getInput();//接收用户有多少人参加
            //初始化玩家
            playermanager.manager.initplayer(count);
            //显示玩家信息
           // playermanager.manager.show();
            //开始游戏
            GameCenter gameCenter=new GameCenter();
            gameCenter.start();

        }
}
import java.util.Scanner;

public class Utils {
    //如果不需要保存数据 没有成员变量
    //提供静态方法 访问方便
    public static void showText(boolean hasStar, boolean lineBreak, String... contents) {
        //判断是否需要显示分割线
        System.out.print(hasStar ? "******************\n" : "");

        //判断输出的内容是多行还是一行
        if (contents.length == 1) {
            System.out.print(contents[0]);

            //有分割线的时候需要换行
            System.out.print(hasStar ? "\n" : "");
        } else {
            //输出带编号的多行数据
            //1. 弃牌
            for (int i = 0; i < contents.length; i++) {
                System.out.println((i + 1) + ". " + contents[i]);
            }
        }
        System.out.print(hasStar ? "******************\n" : "");

        //判断是否需要换行
        System.out.print(lineBreak ? "\n" : "");

    }
    //接收用户收入
    public static int getInput(){
        Scanner scanner=new Scanner(System.in);//要接收就是Scanner
        return scanner.nextInt();
    }
}
public class pokermanager {
    /**
     * 管理牌的相关操作
     * 生成一副牌 洗牌 发牌  牌的比较
     */
    //首先想到用一个成员变量来保存一副牌,这里是定义了一组数组
    private ArrayList<poker> pokers = new ArrayList<>();

    //创建静态的变量
    public static final pokermanager manager = new pokermanager();

    //私有化构造方法
    private pokermanager() {

    }

    //定义一个 方法生成一副牌
    public void pai() {
        //遍历整个点数的数组
        for (int i = 0; i < constant.DOTS.length; i++)//获取对应的点数
        {
            String dot = constant.DOTS[i];
            //生成牌的4种花色
            for (int j = 0; j < constant.TYPES.length; j++) {
                //参加一张牌
                poker poker = new poker(dot, constant.TYPES[j]);
                //将这张牌保存起来
                pokers.add(poker);
            }
            /*黑桃
           // PokerType spades=new PokerType();
           // spades.setPic("♠");
            PokerType spades=new PokerType("♠",4);//用的默认构造方法
            //黑桃
            PokerType hearts=new PokerType("♥",3);
            //红桃
            PokerType clubs=new PokerType("♣",2);
            //梅花
            PokerType diamonds=new PokerType("♦",1);
            //方块*/

            //创建四张牌
            /*poker ps=new poker();
            ps.setDot(dot);
            ps.setType(spades);*/
           /* poker ps=new poker(dot,spades);//用的默认构造方法
            poker ph=new poker(dot,spades);
            poker pc=new poker(dot,spades);
            poker pd=new poker(dot,spades);*/

            //加到数组里面去
            /*pokers.add(ps);
            pokers.add(ph);
            pokers.add(pc);
            pokers.add(pd);*/
        }
        //洗牌
        Collections.shuffle(pokers);
    }

    //显示一副牌,看一下之前写的代码是否有错
    public void show() {
        for (poker poker : pokers) {
            System.out.print(poker.getDot() + poker.getType().getPic() + "");
        }
        System.out.println();
    }

    /**
     * 给每个玩家发牌
     *
     * @param players 所有参与人员
     */
    public void dealCards(ArrayList<player> players) {
        for (int i = 0; i < players.size(); i++) {
            player player = players.get(i);

            //将数组里面的扑克牌给对应的玩家
            player.poker = pokers.get(i);
        }
    }

}public class playermanager {
    //记录当前下注的玩家编号,记住所有值
    public int currentPlayerIndex = 0;
    //保存所有玩家
    public ArrayList<player> players = new ArrayList<>();

    public static final playermanager manager = new playermanager();

    private playermanager() {

    }

    //初始化玩家 给外部调用
    public void initplayer(int count) {
        for (int i = 0; i < count; i++) {
            //创建玩家
            String name = constant.DEFAULT_NAMES[i];
            player player = new player(name, i + 1, constant.MOENY);
            //保存玩家
            players.add(player);
        }
    }

    //输出玩家信息
    public void show() {
        for (player player : players) {
            System.out.println(player);
        }
    }

    /**
     * 打底注
     *
     * @param count 每句消耗的金币
     * @return -1:失败   >0  成功
     */
    public int betAll(int count) {//打底注
        for (player player : players) {
            int relust = player.bet(count);
            if (relust == -1) {
                return -1;
            }
        }
        //返回总共下注的金额
        return count * players.size();
    }

    /**
     * 获取当前下注的玩家
     *
     * @return
     */
    public player currentPlayer() {
        //获取当前玩家
        return players.get(currentPlayerIndex);

    }

    /**
     * 当前剩余玩家
     *
     * @return
     */
    public int leftPlayerCount() {
        int total = 0;
        for (int i = 0; i < players.size(); i++) {
            player player = players.get(i);
            if (player.hasDiscard == false && player.money != 0)
                total++;
        }
        return total;
    }

    /**
     * 查找下一个下注的人
     */
    public void changeNext() {
        //查找下一个参与的玩家
        int i = currentPlayerIndex;
        if (i == players.size() - 1) {
            i = 0;
        } else {
            i++;
        }
        for (; i < players.size(); i++) {
            player player = players.get(i);
            if (player.hasDiscard == false && player.money > 0)
                currentPlayerIndex = i;

            return;

        }

    }


    /**
     * 奖励赢家
     */
    public void awardWinner(int total) {
        player winner;
        int available = leftPlayerCount();
        if (available == 1) {
            //只有一个玩家,这就是最终的赢家
            changeNext();
            winner = currentPlayer();
        } else {
            //需要比较这两个玩家的牌大小
            player w1 = null;
            player w2 = null;
            for (int i = 0; i < players.size(); i++) {
                player player = players.get(i);
                if (player.hasDiscard == false) {
                    if (w1 == null) {
                        w1 = player;
                    } else {
                        w2 = player;
                    }
                }
            }
            boolean result = w1.poker.bigerThan(w2.poker);
            if (result) {
                winner = w1;
            } else {
                winner = w2;
            }
        }
        System.out.println(winner.id + "号玩家赢得胜利" + total + "获得金币");
        winner.add(total);
    }
}
/**
 * 管理玩家的信息
 */

public class player {
    public String name;
    public int id;
    public int money;
    public poker poker;
    public boolean hasDiscard;

    public player(String name,int id,int money){
        this.name=name;
        this.id=id;
        this.money=money;

    }

    @Override
    //当打印一个对象的时候,就会默认去调用对象的toString方法
    //如果当前来里面没有实现这个方法 就到父类里面去找
    //object里面默认实现就是打印对象的首地址
    public String toString() {
        //1好玩家:华仔  金币10000
        String pkString="";
          if (poker!=null){
              pkString =" "+poker.getDot() + poker.getType().getPic();

          }
        return id+"号玩家;"+name+"筹码"+money+""+getpokerString();
    }

    public String getpokerString(){
        String pkString="";
        if (poker!=null){
            pkString = poker.getDot() + poker.getType().getPic();

        }
        return pkString;
    }
    /**
     * 首先打底
     * 下注
     * @param count 下注金额
     * @return -1:失败   >0  成功
     */
    public int bet(int count){
        //判断自己的赌资是否大于底注金额
        if (money>=count){
            money-=count;
            return count;
        }else
        {
            return -1;
        }
    }
    public void add(int count){
        money+=count;
    }

}

public class constant {
    //保存数组的点数
    public static final String[] DOTS = {"2","3","4","5","6","7","8","9","10",
            "J","Q","K","A"};
    //保存几个固定的花色 黑红梅方
    public static final PokerType[] TYPES={PokerType.spades,PokerType.hearts,PokerType.clubs
    ,PokerType.diamonds};
    //保存默认的玩家姓名
    public static final String[] DEFAULT_NAMES={"华仔","赌圣发哥","渣渣辉","古校长"};
    //设置默认的玩家金币
    public static final int MOENY=100000;
    //底注  每句消耗的金币数
    public static final int BASE=10;

}
import java.util.Arrays;

public class poker {
    private String dot;
    private PokerType type;

    public poker(){}
    public poker(String dot,PokerType type){
        this.dot=dot;
        this.type=type;
    }
    public String getDot() {
        return dot;
    }

    public PokerType getType() {
        return type;
    }

    public void setType(PokerType type) {
        this.type = type;
    }

   public boolean bigerThan(poker poker) {
       int mIndex = Arrays.binarySearch(constant.DOTS, this.dot);
       int oIndex =Arrays.binarySearch(constant.DOTS, poker.dot);
       System.out.println(this.dot + mIndex);
       System.out.println(this.dot + oIndex);
       if (mIndex != oIndex) {
           //点数不同 直接比较
           return mIndex > oIndex;
       } else {
           //点数相同 比较花色
           return this.type.getId() > poker.type.getId();
       }

   }
}
public class PokerType {
    /**
     * 管理牌的图案和比较图案的大小
     */
       public static final PokerType spades=new PokerType("♠",4);
       public static final PokerType hearts=new PokerType("♥",3);
       public static final PokerType clubs=new PokerType("♣",2);
       public static final PokerType diamonds=new PokerType("♦",1);
        private String pic;
        private int id;

        public PokerType(){}
//提供一个构造方法
    //默认的构造方法被屏蔽
    public PokerType(String pic,int id){
        this.pic=pic;
        this.id=id;
    }
    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    }
public class GameCenter {
    //记录这句的的筹码
    private int totalmoney;

    //开始游戏
    public void start() {
        System.out.println("游戏开始,请打底:");
        playermanager manager=playermanager.manager;

        //扣除底注
        playermanager.manager.betAll(constant.BASE);
        playermanager.manager.show();

        //开始发牌
        System.out.println("开始发牌");
        pokermanager.manager.dealCards(manager.players);
        manager.show();
        int time=0;//记录游戏还剩下两个人的次数
        boolean isFisrst=true;
        int betmoney=0;
        while(true){
            //获取当前玩家信息
            player player=playermanager.manager.currentPlayer();
            //提示选择操作
            System.out.println("请"+player.id+
            "号玩家选择操作:");
            Utils.showText(true,true,
            new String[]{"看牌","弃牌",
                    isFisrst?"下注":"跟注"});
            int chioce=Utils.getInput();
            boolean flag=false;
            switch (chioce){
                case 1:
                    //看牌
                    System.out.println(player.getpokerString());
                    flag=true;
                    break;
                case 2:
                    //弃牌
                    System.out.println(player.id+"号玩家选择操作:");
                    player.hasDiscard=true;
                    break;
                    default:
                        //下注
                        if (isFisrst) {
                            System.out.print("请输入下注金额:");
                            betmoney=Utils.getInput();

                            int result=player.bet(betmoney);
                            if(result==-1){
                                //下注失败
                                System.out.print("余额不足:");
                            }else{
                                //下注成功
                                isFisrst=false;
                                totalmoney+=betmoney;
                                break;
                            }
                            break;
                        }else{
                            //跟注
                            int reslut=player.bet(betmoney);
                            if (reslut==-1){
                                player.hasDiscard=true;
                            }else
                            {
                                System.out.println("下注成功!");
                                totalmoney+=betmoney;
                            }

                        }
                        break;
            }
            if(flag=false){
                //计算当前还有多少人可以参与
                int available=manager.leftPlayerCount();
                if(available==1){
                    //本局结束了

                    break;
                }
                if (available==2){
                    time++;
                    if(time==4){
                        //两个回合结束
                        break;
                    }

                }
                //切换到下一个人
                manager.changeNext();
            }
        }
        manager.awardWinner(totalmoney);
    }
}

这就是最终的代码,但好像在我的电脑运行时出错的,但时平台没有显示错误。我一时也不知道时哪里有问题,只能去请教一下他人。虽然这次写的代码是有点多,还老是出错。但一定要有耐心,慢慢来,总会弄好的。记住:耐得住烦恼,才是赢家。也感谢老师的今天辛苦付出,我感觉到他今天的嗓子都说话说得有点哑了。辛苦啦,大佬!!!

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

相关阅读更多精彩内容

友情链接更多精彩内容