java设计扑克牌比大小_2019-08-09Day10 单例设计模式,扑克牌比大小游戏(Java)
目的
学习了解单例设计模式的相关知识,并在前几天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)相关推荐
- java day07第七课静态的和单例设计模式
静态的(static)和单例模式 main函数 主函数是一个特殊的函数,作为程序的入口,可以被jvm调用 主函数的定义 public 表示该函数的访问权限是最大的. static 代表主函数随着类的加 ...
- Java设计模式——单例设计模式/权限修饰符的使用
1. 单例模式含义 所谓的单例设计模式,就是采取一定的方法保证整个软件系统中,某个类只能存在一个对象实例. 单例设计模式 2. 单例设计模式的两种实现方法 饿汉式:不管是否需要该实例,我事先就把该实例 ...
- Java查漏补缺(08)关键字:static、单例设计模式、理解main方法、类的成员之四:代码块、final关键字、抽象类、接口、内部类、枚举类、注解、包装类
Java查漏补缺(08)关键字:static.单例设计模式.理解main方法.类的成员之四:代码块.final关键字.抽象类.接口.内部类.枚举类.注解.包装类 本章专题与脉络 1. 关键字:stat ...
- Java笔记017-类变量和类方法、理解main方法语法、代码块、单例设计模式、final关键字
目录 面向对象编程(高级部分) 类变量和类方法 类变量-提出问题 传统方法解决 问题分析: 类变量快速入门 类变量内存布局 什么是类变量 如何定义类变量定义语法: 如何访问类变量 定义语法: 类变量使 ...
- 笔记:Java中的单例设计模式
之前接触过单例模式,当初不明白这样的设计用意,今天特地研究了下java中的单例设计模式的用处及用法. 单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.一个类 ...
- Java设计模式-单例设计模式
文章目录 前言 一.什么是设计模式? 二.单例模式介绍 1.单例模式的目的 2.单例模式的定义 单例模式的设计与实现要点: 3.单例模式的两种实现方式 (一)饿汉式创建 (二)懒汉式创建 4.单例模式 ...
- java 单例内部类_9 java的关键字static、单例设计模式、初始化块、关键字final、抽象类、接口、内部类...
static关键字 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用.我们有时 ...
- 对于java程序语言的单例设计模式讲解
1.设计模式:解决某一类问题最行之有效的方法.(java中有23种通用设计模式) 单例设计模式:解决一个类在内存中只存在一个对象. 2.单例设计模式有两种方式: 1)饿汉式 先初始化对象.当类一进内存 ...
- java软件设计模式只单例设计模式
概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...
最新文章
- “由于/bin 不在PATH 环境变量中,故无法找到该命令”
- 这一次,吃透你项目中的每个资源!
- [译] 机器学习可以建模简单的数学函数吗?
- C# -- RSA加密与解密
- vim学习日志(7):替换、删除文件中的字符
- Spring boot (2)--- 基础
- jQuery.ajax()方法
- 在MySQL中创建cm-hive使用的数据库及账号
- 微软“作死”Windows
- 2018最新Web前端经典面试试题及答案
- hdoj--5620--KK's Steel(斐波那契数)
- python批量检索文献pubmed_推荐一个检索文献强大的浏览器插件(Pubmed plus)
- Android studio 导入项目运行
- Pdman数据库建模工具——使用教程
- 11月8日 课程设计幸运抽奖系统
- CocosCreator3D之相机跟随与旋转
- 向世界说你好的c语言程序,C语言你好,世界
- Swoole vs Workman
- 如何衡量每个特征的重要度?
- 08canvas画图
热门文章
- 个人主页增添超级玛丽小游戏与留言板功能
- 解决Client.Timeout exceeded while awaiting headers报错
- 记录:为啥没有雷电4接口的显卡扩展坞与移动硬盘?
- Windows 10驱动签名_win 10驱动数字签名_驱动签名注意事项
- 惠普打印机介质不匹配_打印机提示纸张不匹配该怎么解决?
- 尚硅谷谷粒商城第九天 模板引擎-Thymeleaf
- 为您的创业公司推荐5款类Slack开源协作工具
- 人力资源外包是什么?转型灵活用工系统,解决服务痛点
- 怎样通过一根网线,一台电脑,做到月入过万。
- “三高“Mysql - Mysql备份概览