java输出一副扑克牌_如何用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(;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 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);

}

}

}

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输出一副扑克牌)