Java项目实战开发Day11 2020-03-29

本文详细介绍了使用Java实现德州扑克游戏的过程,从游戏规则到玩家管理,再到牌局流程,全面解析了游戏开发的各个环节。文章深入探讨了单例模式、集合操作、随机算法的应用,以及如何处理玩家下注、发牌、弃牌等复杂逻辑。

内容

纪念写的第一个项目(虽然还有很多没写完而且也有bug)

文件结构

Poker

package PokerPackage;

//管理一副牌
public class Poker {

    //保存这张牌的点数和花色
    private String dot;
    private String pic;
    
    //保存一副牌的点数(静态)
    public static String[] POKER_DOTS = {"3","4","5","6",
                    "7","8","9","10",
                    "J","Q","k","A","2"
    };
    
    //使用内部类保存一副牌的花色(静态),并设置映射关系
    public static class POKER_PICS{
        
        //①保存一副牌的花色
        static String[] pic = {"♠","♥","♣","♦"};
        
        //②将花色对应映射关系(难点一)
        int tag;
        
        //构造方法
        POKER_PICS(String pic,int tag){
            this.tag = tag;
        }
        
    }
    
    //给这张牌附上点数和花色
    public void setOnePoker(String dot,String pic) {
        
        this.dot = dot;
        this.pic = pic;
        
    }

}

PokerManager

package PokerPackage;

import java.util.*;

//管理一副牌的所有操作(使用单例模式)
public class PokerManager {

    ArrayList<Poker> pokers;
    
    //3.创建变量保存对象
    private static PokerManager pokermanager;
    
    //1.私有化构造方法
    private PokerManager() {
        
    }
    
    //2.对外部提供获得对象方法
    public static PokerManager getInstance() {
        
        if(pokermanager == null) {
          pokermanager = new PokerManager();
          return pokermanager;
        }
        
        return null;
    }
    
    //生成一副牌
    public void producePoker(){
        pokers = new ArrayList<>();
    }
    
    //获取一副牌
    public void getAllPokers() {
        
        //先得到点数
        for(int i=0;i < Poker.POKER_DOTS.length;i++) {
            //再得到花色
            for(int j=0;j < Poker.POKER_PICS.pic.length;j++) {
                
                //1.先创建一张牌
                Poker poker = new Poker();
                
                //2.给这张牌附上花色
                poker.setOnePoker(Poker.POKER_DOTS[i], Poker.POKER_PICS.pic[j]);
                
                //3.保存这张牌
                pokers.add(poker);
            }
        }
    }
    
    //打乱一副牌
    public void shuffle() {
        Collections.shuffle(pokers);//这里一开始又写错了
    }
    
    //获取一张牌
    public Poker getOnePoker(int i) {
        Poker onePoker = pokers.get(i);
        return onePoker;
    }
    
}

Player

package PokerPackage;



//管理一个玩家的信息
public class Player{

    int id;//编号
    String name;//姓名
    int chip;//筹码
    int state;//玩家的状态
    
    Poker poker;//玩家的一张牌
    
    int finalMoney = chip;//最后还剩多少钱
    int curlost;//当前下的赌注
    
    //初始化某个玩家
    Player(int id,String name,int chip){
        this.id = id;
        this.name = name;
        this.chip = chip;
    }
    
    //玩家状态
    public int playerState(int state){
        
        this.state = state;
        
        if(this.state == 0) {
            System.out.println(""+name+"玩家弃牌,请下一位玩家出牌");
            return 0;
        }
        
        return 1;
    }
    
    //玩家的一张牌
    public void getPlayerPoker(Poker poker) {
        this.poker = poker;
    }
    
    //加注时扣钱方法
    public int lostMoney(int lostmoney) {
        finalMoney = finalMoney - lostmoney;
        return finalMoney;
    }
    
    //赢钱的时候加钱方法
    public int winMoney(int winmoney) {
        finalMoney = finalMoney + winmoney;
        return finalMoney;
    }
    
    //退还金钱方法
    public void returnMoney(int returnmoney) {
        finalMoney = finalMoney = returnmoney;
    }
    
}

PlayManager

package PokerPackage;

import java.util.*;

//管理玩家的类
public class PlayManager {

    ArrayList<Player> players;//保存所有玩家
    int number;//一桌玩家的数目
    
    //2.保存对象
    private static PlayManager playmanager;
    
    //1.私有化构造方法
    private PlayManager() {
        
    }
    
    //3.创建获取对象方法
    public static PlayManager getInstance() {
        
        if(playmanager == null) {
            playmanager = new PlayManager();
            return playmanager;
        }
        
        return null;
    }
    
    //设置玩家数目
    public void setPlayerNum(int number) {
        this.number = number;
    }

    //初始化所有玩家
    public void initPlayers() {
        players = new ArrayList<>();//一开始忘了new集合,报了空指针异常的错误
        
        for(int i = 0;i < number;i++) {
            Player player = new Player(i,"我是"+i+"号",500);
            players.add(player);
        }
    }
    
    //获取一个玩家
    public Player getOnePlayer(int i) {
        return players.get(i);
    }
    
}

PlayGameCenter

package PokerPackage;

import java.util.*;

public class PokerGameCenter {

    int currentAllMoney;//当前游戏桌的总金额;
    int bottom;//当前底注
    Player curPlayer;//当前玩家
    PlayManager playmanager;//玩家管理器
    PokerManager pokermanager;//扑克管理器
    
    //2.保存当前对象
    private static PokerGameCenter pokergamecenter;
    
    //1.构造方法私有化
    private PokerGameCenter() {
        
    }
    
    //3.获取当前对象的方法
    public static PokerGameCenter getinstance() {
        
        if(pokergamecenter == null) {
            pokergamecenter = new PokerGameCenter();
            return pokergamecenter;
        }
        
        return null;
    }
    
    //初始化数据
    public void initGame() {
        
        //得到玩家管理器和游戏管理器
        playmanager = PlayManager.getInstance();
        pokermanager = PokerManager.getInstance();
        
        //设置玩家数目与初始化所有玩家
        playmanager.setPlayerNum(2);//有两个人参与游戏
        playmanager.initPlayers();
        
        //生成一副牌,保存,并打乱
        pokermanager.producePoker();
        pokermanager.getAllPokers();
        pokermanager.shuffle();
    }
    
    //开始游戏
    public void startGame() {
        
        //给每位玩家发牌
        for(int i = 0;i < playmanager.number;i++) {
            
            //得到一张牌
            Poker tempPoker = pokermanager.getOnePoker(i);
            
            //得到一个玩家
            Player tempPlayer = playmanager.getOnePlayer(i);
            
            //把这张牌发给玩家
            tempPlayer.getPlayerPoker(tempPoker);
            
        }
        
        //按照顺序下注
        for(int i = 0;i < playmanager.number;i++) {
            
            curPlayer = playmanager.getOnePlayer(i);
            
            //下注方法提示
            System.out.println("第"+(i+1)+"号玩家你好,请问您要选择哪种方式下注呢?");
            System.out.println("输入1:自由下注");
            System.out.println("输入2:跟注");
            /*System.out.println("输入1:自由下注");
            System.out.println("输入1:自由下注");*/
            System.out.println("输入5:放弃");
            System.out.println("请输入");
            Scanner input = new Scanner(System.in);
            int select = input.nextInt();
            
            switch(select) {
            
            case 1:
                //自由下注
                System.out.println("请输入自由下注金额");
                
                Scanner money = new Scanner(System.in);
                int lostmoney = money.nextInt();
                curPlayer.curlost = lostmoney;
                
                //如果是第一个玩家,或者是下注金额比前一个玩家的大,则直接下注
                if(i == 0 || lostmoney >= playmanager.getOnePlayer(i - 1).curlost) {
                    curPlayer.lostMoney(lostmoney);
                }else {
                    System.out.println("下注失败,请重新下注");
                    
                    continue;
                }
                break;
                
            case 2:
                //跟注
                curPlayer.lostMoney(playmanager.getOnePlayer(i - 1).curlost);
                break;
                
            case 5:
                //弃牌
                System.out.println("您选择弃牌");
                curPlayer.playerState(0);
                break;
                
            default:
                System.out.println("输入无效,视为弃牌");
                curPlayer.playerState(0);
                break;
            }
            
            System.out.println("下注成功!");
            
        }
    
        
        
        
        
    }
    
    
}

Main

package PokerPackage;

public class Main {

     public static void main(String[] args) {
         
         //创建游戏中心
         PokerGameCenter gameCenter = PokerGameCenter.getinstance();
         
         //初始化数据‘
         gameCenter.initGame();
         
         //开始游戏
         gameCenter.startGame();
     }
}

运行结果

遇到的问题

①不理解IGameState接口的好处,可以直接用int state,0表示弃牌,1表示正在玩吗?为什么要用接口来搞state?
②不晓得花色之间比较大小的方法思路怎么写
③不会用IGame接口
④比赛规则(all-in,比牌。这两个不太会写)。

加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值