目的

学习了解单例设计模式的相关知识,并在前几天Java学习的基础上,完善所学的知识,完成扑克牌比大小的游戏,能实现的功能有,游戏显示页面,玩家信息页面(包括玩家姓名 编号 所持有的资金),生成一副扑克牌并随机发给玩家一张,玩家可选择弃牌,下注,跟注,具体功能可自己完善。

基础饿汉式单例设计模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

优点:

类加载时就去初始化,没有线程安全问题,不能通过new创建实例

缺点:

类加载时就创建好对象,可能会创建出来用不到的实例对象,这样对内存是种浪费

代码示例

public class Text {

public static void main(String[] args){

//1.正常情况下创建一个对象

Poker.shared.text();

}

}

class Poker{

//default sharedInstance,manager

//2.定义一个静态的成员变量 记录这个单例对象

//饿汉式

public static final Poker shared = new Poker();

//1.默认构造函数

private Poker(){}

public void text(){

}

扑克牌游戏

实现步骤

理清楚逻辑结构和大致需要的功能

结构图

封装游戏开始界面

创建一个Utils类,在里面封装所需要的输入语句。包括是否输入星号和换行

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":"");

}

}

创建Poker类

Poker类用于定义牌的点数和类型

定义一个Constant类(常量类,用于保存常量 数字 花色,人数等等常数 )

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.DIAMANDS};

//保存默认的玩家姓名

public static final String[] DEFAULT_NAMES = {"刘德华","周润发","张家辉","周星驰"};

//默认的资金

public static final int MONEY = 1000;

//每局消耗的金币

public static final int BASE = 10;

}

}

定义PokerType类 管理理 牌的花色和id号

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 DIAMANDS = 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;

}

}

创建PokerManager类来管理牌的相关操作 发牌洗牌

import java.util.ArrayList;

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

//创建一张牌

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 players){

for(int i = 0 ; i < players.size();i++){

Player player = players.get(i);

//将数组里面对应的扑克牌给对应的玩家

player.poker = pokers.get(i);

//

}

}

}

此时已经能将一副牌打乱后完整的发出来,接下来开始管理玩家的信息

创建Player类用于管理玩家信息

/**

* 管理玩家的信息

*

*/

public class Player {

public String name;

public int id;

public int money;

public Poker poker;

public boolean hasDiscard;//是否弃牌

public Player(){

}

public Player(String name, int id, int money){

this.name = name;

this.id = id;

this.money = money;

}

@Override

//当打印一个对象的时候 就会默认去调用对象的toString方法

//如果当前类里面没有实现这个方法 就到父类里面去查找

//object里面默认实现就是打印对象的首地址

public String toString() {

//一号玩家:xxx 金币 1000

return id+"号玩家: "+name+" 金币"+money ;

}

public String getPokerString(){

String pkString = "";

if(poker != null){

pkString = poker.getDot() +poker.getType().getPic();

}

return pkString;

}

//下注

public int bet(int count){

//判断自己的金币是否大于下注金额

if(money >= count){

money-=count;

return count;

}else{

return -1;

}

}

public void add(int count){

money += count;

}

}

创建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

//创建玩家

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);

}

}

//底注 count 每局消耗的金币 -1:失败 》0成功

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 = 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 == true ){

winner = w1;

}else{

winner = w2;

}

}

System.out.println(winner.id+"号玩家赢得"+total+"金币");

winner.add(total);

}

}

创建GameCenter类 管理游戏进行的相关操作

public class GameCenter {

//记录这局的筹码

public 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);

PlayerManager.manager.show();

int time = 0;//如果是两个人的次数

boolean isFirst = true;

int betMoney = 0;

while(true){

//获取当前玩家信息

Player player = PlayerManager.manager.currentPlayer();

//提示选择操作

System.out.println("请"+player.id+"号玩家选择操作:");

Utils.showText(true,true,new String[]{"看牌","弃牌",isFirst?"下注":"跟注"});

int choice = Utils.getInput();

boolean flag = false;

switch (choice){

case 1:

System.out.println(player.getPokerString());

flag = true;

break;

case 2:

System.out.println(player.id+"号玩家弃牌!");

player.hasDiscard = true;

break;

default:

//下注

if(isFirst){

while(true) {

System.out.print("请输入下注金额:");

betMoney = Utils.getInput();

int result = player.bet(betMoney);

if (result == -1) {

System.out.print("余额不足 ");

}else{

isFirst = false;

totalMoney += betMoney;

break;

}

}

}else{

//跟注

int result = player.bet(betMoney);

if(result == -1){

player.hasDiscard = true;

}else{

System.out.println("下注成功!");

totalMoney+=betMoney;

}

}

break;

}

if(flag == false){

//计算多少人还可以参与

int available = PlayerManager.manager.leftPlayerCount();

if(available ==1){

break;

}

if(available == 2){

time++;

if(time == 4){

//两个回合结束

break;

}

}

//切换到下一个人

PlayerManager.manager.changeNext();

}

}

PlayerManager.manager.awardWinner(totalMoney);

}

接口类

public class Myclass {

public static void main(String[] args){

//欢迎界面

Utils.showText(true,true,new String[]{"欢迎加入游戏"});

PokerManager.manager.deal();

//显示一副牌

PokerManager.manager.show();

//输入玩家人数

Utils.showText(false,false,new String[]{"输入玩家人数"});

int count = Utils.getInput();

//初始化玩家

PlayerManager.manager.initPlayer(count);

//显示玩家信息

PlayerManager.manager.show();

GameCenter center = new GameCenter();

center.start();

}

}

程序展示

1.png

2.png

3.png

小结

今天打的代码很多,虽然打代码能跟的上节奏,但是长时间下来很累,脑子慢慢就转不动了,今天就这样吧。

java设计扑克牌比大小_2019-08-09Day10 单例设计模式,扑克牌比大小游戏(Java)相关推荐

  1. java day07第七课静态的和单例设计模式

    静态的(static)和单例模式 main函数 主函数是一个特殊的函数,作为程序的入口,可以被jvm调用 主函数的定义 public 表示该函数的访问权限是最大的. static 代表主函数随着类的加 ...

  2. Java设计模式——单例设计模式/权限修饰符的使用

    1. 单例模式含义 所谓的单例设计模式,就是采取一定的方法保证整个软件系统中,某个类只能存在一个对象实例. 单例设计模式 2. 单例设计模式的两种实现方法 饿汉式:不管是否需要该实例,我事先就把该实例 ...

  3. Java查漏补缺(08)关键字:static、单例设计模式、理解main方法、类的成员之四:代码块、final关键字、抽象类、接口、内部类、枚举类、注解、包装类

    Java查漏补缺(08)关键字:static.单例设计模式.理解main方法.类的成员之四:代码块.final关键字.抽象类.接口.内部类.枚举类.注解.包装类 本章专题与脉络 1. 关键字:stat ...

  4. Java笔记017-类变量和类方法、理解main方法语法、代码块、单例设计模式、final关键字

    目录 面向对象编程(高级部分) 类变量和类方法 类变量-提出问题 传统方法解决 问题分析: 类变量快速入门 类变量内存布局 什么是类变量 如何定义类变量定义语法: 如何访问类变量 定义语法: 类变量使 ...

  5. 笔记:Java中的单例设计模式

    之前接触过单例模式,当初不明白这样的设计用意,今天特地研究了下java中的单例设计模式的用处及用法. 单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.一个类 ...

  6. Java设计模式-单例设计模式

    文章目录 前言 一.什么是设计模式? 二.单例模式介绍 1.单例模式的目的 2.单例模式的定义 单例模式的设计与实现要点: 3.单例模式的两种实现方式 (一)饿汉式创建 (二)懒汉式创建 4.单例模式 ...

  7. java 单例内部类_9 java的关键字static、单例设计模式、初始化块、关键字final、抽象类、接口、内部类...

    static关键字 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用.我们有时 ...

  8. 对于java程序语言的单例设计模式讲解

    1.设计模式:解决某一类问题最行之有效的方法.(java中有23种通用设计模式) 单例设计模式:解决一个类在内存中只存在一个对象. 2.单例设计模式有两种方式: 1)饿汉式 先初始化对象.当类一进内存 ...

  9. java软件设计模式只单例设计模式

    概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...

最新文章

  1. “由于/bin 不在PATH 环境变量中,故无法找到该命令”
  2. 这一次,吃透你项目中的每个资源!
  3. [译] 机器学习可以建模简单的数学函数吗?
  4. C# -- RSA加密与解密
  5. vim学习日志(7):替换、删除文件中的字符
  6. Spring boot (2)--- 基础
  7. jQuery.ajax()方法
  8. 在MySQL中创建cm-hive使用的数据库及账号
  9. 微软“作死”Windows
  10. 2018最新Web前端经典面试试题及答案
  11. hdoj--5620--KK's Steel(斐波那契数)
  12. python批量检索文献pubmed_推荐一个检索文献强大的浏览器插件(Pubmed plus)
  13. Android studio 导入项目运行
  14. Pdman数据库建模工具——使用教程
  15. 11月8日 课程设计幸运抽奖系统
  16. CocosCreator3D之相机跟随与旋转
  17. 向世界说你好的c语言程序,C语言你好,世界
  18. Swoole vs Workman
  19. 如何衡量每个特征的重要度?
  20. 08canvas画图

热门文章

  1. 个人主页增添超级玛丽小游戏与留言板功能
  2. 解决Client.Timeout exceeded while awaiting headers报错
  3. 记录:为啥没有雷电4接口的显卡扩展坞与移动硬盘?
  4. Windows 10驱动签名_win 10驱动数字签名_驱动签名注意事项
  5. 惠普打印机介质不匹配_打印机提示纸张不匹配该怎么解决?
  6. 尚硅谷谷粒商城第九天 模板引擎-Thymeleaf
  7. 为您的创业公司推荐5款类Slack开源协作工具
  8. 人力资源外包是什么?转型灵活用工系统,解决服务痛点
  9. 怎样通过一根网线,一台电脑,做到月入过万。
  10. “三高“Mysql - Mysql备份概览