如何用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<Person> 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<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.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(;i<players.size(); i++){
            Player player = players.get(i);
            if (player.hasDiscard == false&&player.money>0){
                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<Poker> 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<Constant.TYPES.length;j++) {
                //创建一张牌
                Poker poker = new Poker(dot, Constant.TYPES[j]);
                //保存这张牌
                pokers.add(poker);//?
            }
        }
        //洗牌
        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);

        }
    }
}

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,看到听到这些类满脑子都是累,还是要坚持下去,这个扑克游戏从开始自己一股脑写完,再到一修,再到现在的二修,花了很多精力和时间,从刚开始的粗略到现在的细致,其实都是进步,虽然真的很累,但是相信努力过后辛苦没有白费的感觉是很不错的,加油吧骚年!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,983评论 6 537
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,772评论 3 422
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,947评论 0 381
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,201评论 1 315
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,960评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,350评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,406评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,549评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,104评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,914评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,089评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,647评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,340评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,753评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,007评论 1 289
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,834评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,106评论 2 375