如何用Java实现扑克牌比大小游戏,看这一篇就够了!!!

一、目的

目的很单纯。就是用Java写个扑克游戏,在写的过程中锻炼自己的逻辑思维能力,熟练使用快捷键(快捷键的相关文章:Android studio必备快捷键),提高自己的编程速度,同时注意编程风格的养成。

@拾的柒

二、知识点

1.单例设计模式
2.数组的使用 ArrayList
3.扑克牌游戏的实现

三、具体内容

1.单例设计模式
定义:

指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。

特点:

1.单例类只有一个实例对象;
2.该单例对象必须由单例类自行创建;
3.单例类对外提供一个访问该单例的全局访问点;

其的两种实现

1.饿汉式
该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了,故多线程使用的时候是安全的。

class Poker{
    //default,sharedInstance,
    //2. 定义一个静态成员变量 记录这个单例对象
    //饿汉式
    public static final Poker shared=new Poker();
    //1. 构造方法
    private Poker(){}
    public void test(){}
}

2.懒汉式
多线程使用时不安全,可以通过加锁来保证多线程访问时会将完整的代码加载完毕。

lass Player{
    public int count;
    //2.创建一个静态变量
    private static Player shared=null;//有final就只能赋值一次
    //1构造方法
    private Player(){}
    //3.提供给外部一个访问方法
    //懒汉式  多线程时不建议使用 不安全
    //解决放法 加锁
    public  static Player getInstance(){
        Object b = new Object();//加锁
        synchronized (b) {//加锁
            if (shared == null) {
                //如果没有创建 那就创建一个
                shared = new Player();
            }
        }
        return shared;
    }
}
2.数组的使用 ArrayList
/数组真实内存
   class Test2{
        public static void main(String[] agrs){
                /**
                 * //<>泛型
                 * 数组里面保存的都是对象的引用(指针 地址)
                 * 改变数组里面的属性变量
                 * 原始对象的值也跟着改变
                 * 因为大家都是指向同一个内存空间
                 */

                ArrayList people = new ArrayList<>();

                //添加数据
                Person xw = new Person();
                people.add(xw);

                Person zs = new Person();
                people.add(zs);

                //访问数据
                Person xw2 = people.get(0);//取出xw进行保存
                xw2.name = "小王";
                System.out.println(xw2.name);
                System.out.println(xw.name); //均为小王
            }
        }
        class Person{
            public String name;
}
3.扑克牌游戏的实现
@拾的柒

四、实际应用 扑克牌游戏

Constant类

public class Constant {
   //用数组保存牌的点数 用ArrayList的话需要add 用一般数组
   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.DIAMOND};
   //保存默认的玩家姓名
   public static final String[] DEFAULT_NAMES = {"极光","卡利亚","克拉","曼罗"};
   //设置默认的金币
   public static final int MONEY = 1000;
   //每局消耗的金币数 底注
   public static final int BASE = 10;
}

GameCenter类

public class GameCenter {
    //记录这局的筹码
    private int totalMoney;

    //开始游戏
    public void start(){
        System.out.println("游戏开始,请打底");
        //扣除底注
        PlayerManager.manager.betAll(Constant.BASE);

        PlayerManager.manager.show();

        //发牌
        System.out.println("开始发牌");
        PokerManager.manager.dealCards(PlayerManager.manager.players);

        int time = 0;//记录如果是2个人的次数
        //下注
        while (true){
            //获取当前玩家的信息
            Player player = PlayerManager.manager.currentPlayer();
            //提示选择操作
            System.out.println("请"+player.id+"号玩家选择操作");
            Utils.showText(true,true,new String[]{"看牌","弃牌","下注"});
            int choice = Utils.getInput();

            boolean flag=false;
            switch(choice){
                case 1:
                    //看牌
                    System.out.println(player.getPokerString());
                    flag = true;
                    break;
                case 2:
                    //弃牌
                    player.hasDiscard=true;
                    System.out.println(player.id+"号玩家弃牌。");
                    break;
                default:
                    //下注
                    System.out.print("请输入下注金额:");
                    break;
            }

            if(flag == false){
                //计算当前多少人可参与
                int available = PlayerManager.manager.leftPlayerCount();

                if(available==1){
                    break;
                }
                if(available == 2){
                    time++;
                    if(time == 4){
                        //两回合结束
                        break;
                    }
                }
                //切换到下一个人
                PlayerManager.manager.changeNext();

            }
        }
    }
}

Myclass

public class MyClass {
    public  static void main(String[] args){
        //欢迎界面
        Utils.showText(true,true,new String[]{"欢迎来到星游扑克"});

       // PokerManger manger = new PokerManger();
        //生成一副牌
        PokerManager.manager.deal();
        //显示一副牌
        PokerManager.manager.show();

       // PlayerManger playerManger = new PlayerManger();
        //提示输入玩家人数
        Utils.showText(false,false,new String("请输入玩家人数:"));
        int count = Utils.getInput();
        //初始化玩家
        PlayerManager.manager.initPlayer(count);
        //显示玩家信息
        PlayerManager.manager.show();

        //开始游戏
        GameCenter center = new GameCenter();
        center.start();
    }
}

Player

/**
 * 管理玩家的信息
 */
public class Player {
    public String name;
    public int id;
    public int money;
    public Poker poker;//记录玩家手上有哪张牌7
    public Boolean hasDiscard;

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

    //当打印一个对象的时候 就会默认去调用toString方法
    //如果当前来里面没有实现这个方法 就到父类里面去查找
    //object里面默认实现就是打印对象的首地址
    public String toString() {
        //1号玩家


        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;//??不是money?
        } else {
            return -1;
        }
    }

}

PlayerManager

import java.util.ArrayList;

public class PlayerManager {
    //记录当前下注的玩家编号
    public int currentPlayerIndex = 0;
    //保存所有的玩家
    public ArrayList 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.MONEY);
            //保存所有玩家
            players.add(player);
        }
    }
    //输出玩家信息
    public void show(){
        for (Player player:players){
            System.out.println(player);
        }
    }

    /**
     * 打底注
     * @param count
     * @return
     */


    public int betAll(int count){
        for(Player player:players){
            int result=player.bet(count);
            if(result==-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=0;
        if(i == players.size()-1 ){
            i = 0;
        }
        //查找下一个可参与的玩家
        for(;i0){
                currentPlayerIndex = i;
                return;
            }
        }
    }
}

Poker

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

    public Poker(String dot,PokerType type){
        this.dot=dot;
        this.type=type;
    }

    //setter/getter方法
    public void setDot(String dot){
        this.dot=dot;
    }
    public String getDot(){
        return dot;
    }

    public PokerType getType() {
        return type;
    }

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

PokerManager

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

/**
 * 管理牌的相关操作
 * 生成一副牌 洗牌 发牌 牌的比较
 */
public class PokerManager {
    //保存一副牌
    private ArrayList pokers = new ArrayList<>();

    //创建静态变量
    public static final PokerManager manager = new PokerManager();
    //私有化
    private PokerManager(){};

    //定义一个方法生成一副牌
    public void deal(){
        for(int i = 0;i < Constant.DOTS.length;i++){
            String dot = Constant.DOTS[i];

            //生成四种花色
            for(int j = 0;j players){
        for(int i = 0;i < players.size(); i++){
            Player player = players.get(i);
            //将数组里面对应的扑克牌给对应的玩家
            player.poker = pokers.get(i);

        }
    }
}

PokerType

/**
 * 管理牌的图案和比较大小
 */
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 DIAMOND = new PokerType("方片",1);
    private String  pic;
    private int id;
    //提供一个自定义的构造方法 默认的构造方法就被屏蔽了
    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;
    }
}

Utils

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{
            //输出带编号的多行数据
            for(int i = 0;i < contents.length; i++){
                System.out.println((i+1)+". "+contents[i]);
            }
        }

        if(hasStar){
            System.out.println("********************");
        }

        //换行否?
        System.out.print(LineBreak?"\n":"");
    }
    //接收用户输入
    public static int getInput(){
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

五、感悟

学习Java第四天了,今天真的是累的坐着(没趴桌子)睡着了,简直画面太美不敢想象QAQ,看到听到这些类满脑子都是累,还是要坚持下去,这个扑克游戏从开始自己一股脑写完,再到一修,再到现在的二修,花了很多精力和时间,从刚开始的粗略到现在的细致,其实都是进步,虽然真的很累,但是相信努力过后辛苦没有白费的感觉是很不错的,加油吧骚年!!!

你可能感兴趣的:(如何用Java实现扑克牌比大小游戏,看这一篇就够了!!!)