JAVA-(单例设计模式、数组、扑克demo)


心得体会

  • 今天主要写了关于扑克的demo,这对我来说很复杂,总而言之,就是今天上了那么久的课,课后我回想起来,在我脑海中留下的印象很少很少,整天下来我是云里雾里,刚开始,还能跟上进度,老师讲到哪,代码敲到哪,但在最后面的一段时间,我发现自己错误率越来越多,然后只能无奈的停下了手。老师一边讲课,我一边跟着敲代码,有时候会把精力放在跟着老师敲上面,往往知识点会听一半漏一半,可能我不太习惯边敲边听吧,应该还有一部分原因就是自己手速太慢,我已在慢慢尝试快捷键的使用,但还不太熟练,但我会努力加快自己手速的^^,今天有很多 东西都没听懂,所以晚上得重温一遍 今天的课,哈哈,今天晚上任重而道远呀

技术

  • 1.单例设计模式
    ----a.单例设计模式的特点
    ----b.单例模式的要点
    ----c.饿汉式单例和懒汉式单例
  • 2.数组引用
  • 3.扑克demo
    ----a.封装实现文本输出
    ----b.创建Poker类
    ----c.创建PokerManager管理牌的操作
    ----d.优化生成一副牌的操作
    ----e.创建玩家类Player
    ----f.创建玩家管理理器器PlayerManager 管理理玩家信息
    ----g.游戏中⼼心管理理游戏
    ----h.实现发牌

具体操作

1.单例设计模式

  • a.单例设计模式的特点
  • 1.单例类只能有一个实例。
  • 2.单例类必须自己创建自己的唯一实例。
  • 3.单例类必须给所有其他对象提供这一实例。
  • b.单例模式的要点
  • 1.私有的构造方法
  • 2.指向自己实例的私有静态引用
  • 3.以自己实例为返回值的静态的公有的方法
  • c.单例模式根据实例化对象时机的不同分为两种
  • 一种是饿汉式单例,一种是懒汉式单例。
  • 饿汉式单例在单例类被加载时候,就实例化一个对象交给自己用;
    懒汉式在调用取得实例方法的时候才会实例化对象。

-----------饿汉式单例

 class Poker{
        //defalt,share,Instance,manager
        //2.定义一个静态的成员变量 记录这个单例对象
        //饿汉式
        public static final Poker shared = new Poker();

        //1.默认构造函数
        private Poker() { }

        public void test() {
        }
    }
  • 步骤:1.默认构造方法 ----2.定义一个静态的成员变量 记录这个单例对象

-----------懒汉式单例

class Player { 
        public int count;
        //2.创建静态变量
        private static Player shared = null;
       //1.私有化
        private Player() { }
        //3.提供给外部一个访问的方法
        public static Player getInstance() {
            Object b = new Object();
            synchronized (b) {
                if (shared == null) {
                    //如果没有创建 那么就创建一个
                    shared = new Player();
                }
            }
            return shared;
        }
    }

步骤:1.私有化构造函数------2.创建静态变量------ 3.提供给外部一个访问的方法
解析:懒汉式单例先将构造函数私有化,外部无法直接访问,要让外部访问到,就必须提供提供给外部一个访问的方法,给外部一个 getInstance()方法。
懒汉式的缺点是:没有考虑到线程安全,可能存在多个访问者同时访问,并同时构造了多个对象的问题。之所以叫做懒汉模式,主要是因为此种方法可以非常明显的lazy loading。


2.数组引用

class Test2{
    public static void main(String[] args){
        //泛型
        /** 数组里面保存的都是对象的引用(指针)
         * 改变数组里面对象的属性变量
         * 原始对象的值也跟着改变
         * 因为大家都是指向同一个内存空间
         */
        ArrayList<Person> people=new ArrayList<>();
        //添加数据
        Person xw=new Person();
        people.add(xw);
        Person zs=new Person();
        people.add(zs);
        //访问数据
        Person xw2=people.get(0);
        xw2.name="小王";
        System.out.println(xw2.name);
    }
}
class Person{
    public String name;
}
image.png

1.上图中用ArrayList<Person> people=new ArrayList<>();实现了动态分布数组内存空间

  1. Person xw=new Person();
    people.add(xw);
    Person zs=new Person();
    people.add(zs);
    这里分别创建了xw,zs两个对象,并通过add()把这两个对象加到数组里面去了

3.上图中System.out.println(xw2.name);打印了xw2,得到结果是小王,如果换成System.out.println(xw.name);,得到结果同样是小王
xw和xw2指向的是同一个内容,本来xw的打印结果应该是null的,但通过xw2将“小王”赋给了数组的第一个,于是xw指向的内容也就变成了“小王”,数组里面存的是地址


3.扑克demo

image.png

  • a.输出语句的封装

输出语句:完成如下指令

  • 1.输出语句不换行/换行
  • 2.输出语句加分隔符/不加分隔符
  • 3.输出语句一行/多行
package Demo;
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]);
            }
        }
        System.out.print(hasStar?"**********************\n":" ");
        System.out.print(lineBreak?"\n":" ");
    }
    public static int getInput(){
        Scanner scanner=new Scanner(System.in);
        return scanner.nextInt();
    }
}

1.如果不需要保存数据,没有成员变量,提供静态方法,访问方便

2.System.out.print(hasStar?"**********************\n":" "); 这里采用三目运算符实现有无分隔符的操作

  1. public static int getInput(){
    Scanner scanner=new Scanner(System.in);
    return scanner.nextInt();
    }
    这里将scanner输入语句封装起来

b.创建Poker类

  • 1.创建Constant类管理一些常量
用数组保存牌的点数
public static final String[] DOTS = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
  • 2.定义PokerType类管理理牌的花⾊色和id号
  • 因为pic和Id都是私有的,所以外部无法直接访问,为了使外部能够访问数据,使用了setter/getter方法
    getter方法不需要参数,有返回值
    setter方法需要参数,没有返回值
public class PokerType {
    private String pic;
    private int 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;
    }
}
  • 3.定义Poker类
    private String dot;
    private PokerType type;
    public PokerType getType() {
        return type;
    }
    public void setType(PokerType type) {
        this.type = type;
    }

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

c.创建PokerManager管理牌的操作

  • 1.生成一副牌
  • 1.首先用ArrayList保存一副牌。
  • 2.定义一个方法生成一副牌
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];

            //生成4种花色
            for(int j=0 ; j<Constant.TYPES.length; j++){
                //创建一张牌
                Poker poker=new Poker(dot,Constant.TYPES[j]);
                //将这张牌保存起来
                pokers.add(poker);
            }
  • 2.为Poker类和PokerType类提供构造方法


    image.png
  • 并不是所有的对象创建的时候都知道具体的值
    当提供一个自定义的构造方法时,默认的构造方法就被屏蔽了,此时就需要自己写一个默认的构造方法
  • 3.创建花色
            PokerType spades=new PokerType("♠",4);
            PokerType hearts=new PokerType("♥",3);
            PokerType clubs=new PokerType("♣",2);
            PokerType diamonds=new PokerType("♦",1);
    1. 创建四张牌
      public Poker(){}
      public Poker(String dot,PokerType type){
      this.dot=dot;
      this.type=type;
}
           //创建4张牌
           // Poker ps=new Poker();
           // ps.setDot(dot);
           // ps.setType(spades);
            Poker ps=new Poker(dot,spades);
            Poker ph=new Poker(dot,hearts);
            Poker pc=new Poker(dot,clubs);
            Poker pd=new Poker(dot,diamonds);
    1. 将产⽣的四张牌添加到数组
           //加到数组里面去
            pokers.add(ps);
            pokers.add(ph);
            pokers.add(pc);
            pokers.add(pd);

  • d.优化生成一副牌的操作
  • 1.在PokerType⾥面提供4个静态常量对象
  • 1.静态成员变量:把大家公有的东西抽出来,在对象没有创建前,这个东西已经有了
  • 2.此时进行花色比较,只要比花色所对应的id就可以了
   //静态的常量
    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);
  • 2.在Constant⾥里里⾯面提供数组保存这4个常量
   //保存固定的几个花色
    public static final PokerType[] TYPES = {PokerType.SPADES, PokerType.HEARTS, PokerType.CLUBS, PokerType.DIAMONDS};

3.实现功能

  • Collections.shuffle(),方法,打乱顺序
  //生成4种花色
            for(int j=0 ; j<Constant.TYPES.length; j++){
                //创建一张牌
                Poker poker=new Poker(dot,Constant.TYPES[j]);
                //将这张牌保存起来
                pokers.add(poker);
            }
        //洗牌
        Collections.shuffle(pokers);
    }

4.提供⼀一个方法输出这副牌 :拼接每张牌的输出格式

 //显示一副牌
    public void  show(){
        for(Poker poker:pokers){
            System.out.print(poker.getDot()+poker.getType().getPic()+" ");
        }
        System.out.println();
    }

5.使⽤

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

image.png

e.创建玩家类Player

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

f.创建玩家管理理器器PlayerManager 管理理玩家信息

  • 1.Constant里⾯添加常量 保存默认提供的姓名和金币数
    //保存默认的玩家姓名
    public static final  String[] DEFAULT_NAMES={"张三","李四","王二","麻子"};
    1. 初始化玩家信息
   public class PlayerManager {
      public ArrayList<Player> players = new ArrayList<>();
      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);
        }
    }
  • 3.实现toString⽅法, 方便打印
  • 当打印一个对象的时候 就会默认去调用对象的toString方法
  • 如果当前里面没有实现这个方法 就到父类里面去查找
  • object里面默认实现就是打印对象的首地址
 public String toString() {
 return id+" 号玩家  "+name+"  筹码:"+money+pkString;
}
  • 4.输出玩家信息
 //输出玩家信息
    public  void show(){
        for(Player player:players){
            System.out.println(player);
        }
    }
  • 5.使用
       Utils.showText(false, false, new String[]{"请输入参与人数"});
        int count=Utils.getInput();

        //初始化玩家
        PlayerManager.manager.initPlayer(count);
        PlayerManager.manager.show();
  • 6.结果
image.png

g.游戏中⼼心管理理游戏

1.PlayerManager和PokerManager 提供单例对象

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

2.PlayerManager实现打底注的方法

  * 打底
     * @param count 每局消耗的金币
     * @return -1:失败 >0 成功
     */
    public int betAll(int count){
        int total=0;
        for(Player player:players){
            player.bet(count);
            int result =player.bet(count);
            if(result==-1){
                return -1;
            }
        }
        return count * players.size();
    }
    public Player currentPlayer(){
        //获取当前玩家
      return players.get(currentPlayerIndex);

    }

3.Player实现下注⽅方法

  public int bet(int count){
        //判断自己的金币是否大于下注金额
        if(money>= count){
           money -=count;
            return count;
        }else{
            return -1;
        }
    }
}

4.Gamecenter 开始游戏

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

h.实现发牌

  • 1.在Player类⾥里里⾯面添加Poker对象 每个⼈人有⼀一张牌


    image.png
  • 2.PokerManager类添加发牌⽅方法
 public void dealCards(ArrayList<Player> players){
        for(int i=0; i<players.size();i++){
            Player player=players.get(i);
            //将数组里面对应的扑克牌给对应玩家
            player.poker=pokers.get(i);
        }
    }
  • 3.GameCenter的start⽅方法调⽤用发牌
  System.out.println("开始发牌");      
  PokerManager.manager.dealCards(PlayerManager.manager.players);
  PokerManager.manager.show();

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

推荐阅读更多精彩内容