總說(shuō)
今天學(xué)習(xí)的內(nèi)容主要就一個(gè)——設(shè)計(jì)一個(gè)撲克游戲,
實(shí)現(xiàn)的功能有游戲顯示頁(yè)面曹仗,玩家信息頁(yè)面(包括玩家姓名 編號(hào) 所持有的資金)碉纳,生成一副撲克牌并隨機(jī)發(fā)給玩家一張溅蛉,玩家可選擇棄牌货邓,下注秆撮,跟注,具體功能可自己完善换况。
餓漢式以及懶漢式單例設(shè)計(jì)模式
- 餓漢式
保證一個(gè)類僅有一個(gè)實(shí)例职辨,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)盗蟆。
優(yōu)點(diǎn):
類加載時(shí)就去初始化,沒(méi)有線程安全問(wèn)題舒裤,不能通過(guò)new創(chuàng)建實(shí)例
缺點(diǎn):
類加載時(shí)就創(chuàng)建好對(duì)象喳资,可能會(huì)創(chuàng)建出來(lái)用不到的實(shí)例對(duì)象,這樣對(duì)內(nèi)存是種浪費(fèi)
代碼示例
public class Text {
public static void main(String[] args){
//1.正常情況下創(chuàng)建一個(gè)對(duì)象
Poker.shared.text();
}
}
class Poker{
//default sharedInstance腾供,manager
//2.定義一個(gè)靜態(tài)的成員變量 記錄這個(gè)單例對(duì)象
//餓漢式
public static final Poker shared = new Poker();
//1.默認(rèn)構(gòu)造函數(shù)
private Poker(){}
public void text(){
}
- 懶漢式
優(yōu)點(diǎn):
不需要不占用空間仆邓,靈活性更高
缺點(diǎn):
安全性不強(qiáng),多線程運(yùn)行可能出現(xiàn)錯(cuò)誤
代碼示例
//懶漢式台腥,需要時(shí)在創(chuàng)建
public static player getInstance() {
//為了確保線程安全宏赘,需要加鎖
Object b = new Object();
synchronized (b) {
if (shared == null) {
shared = new player();
}
//提供給外部一個(gè)返回方法
return shared;
}
}
封裝游戲界面
創(chuàng)建一個(gè)Utils類绒北,在里面封裝所需要的輸入語(yǔ)句黎侈。
public class Utils {
//如果不需要保存數(shù)據(jù) 沒(méi)有成員變量
//提供靜態(tài)方法 訪問(wèn)方便
public static void showText(boolean hasStar,boolean lineBreak,String... contents){
//判斷是否需要分隔符
System.out.print(hasStar?"**********************\n":"");
//判斷輸出的內(nèi)容是多行還是一行
if(contents.length == 1){
System.out.print(contents[0]);
//有分割線的時(shí)候要進(jìn)行換行
System.out.print(hasStar?"\n":"");
}else {
//輸出帶編號(hào)的多行數(shù)據(jù)
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":"");
}
}
創(chuàng)建Poker類
Poker類用于定義牌的點(diǎn)數(shù)和類型
public class Poker {
private String dot;
private PokerType type;
public Poker(){}
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;
}
}
定義一個(gè)Constant類(常量類,用于保存常量 數(shù)字 花色闷游,人數(shù)等等常數(shù)
public class Constant {
//用數(shù)組保存牌的點(diǎn)數(shù)
public static final String[] DOTS = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
//保存固定的幾個(gè)花色
public static final PokerType[] TYPES = {PokerType.SPADES,PokerType.HEARTS,PokerType.CLUBS,PokerType.DIAMANDS};
//保存默認(rèn)的玩家姓名
public static final String[] DEFAULT_NAMES = {"劉德華","周潤(rùn)發(fā)","張家輝","周星馳"};
//默認(rèn)的資金
public static final int MONEY = 1000;
//每局消耗的金幣
public static final int BASE = 10;
}
}
定義PokerType類 管理理 牌的花色和id號(hào)
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(){}
//提供一個(gè)自定義的構(gòu)造方法
//默認(rèn)的構(gòu)造方法就被屏蔽了
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;
}
}
創(chuàng)建PokerManager類來(lái)管理牌的相關(guān)操作 發(fā)牌洗牌
import java.util.ArrayList;
import java.util.Collections;
/**
* 管理牌的相關(guān)操作
* 生成一副牌 洗牌 發(fā)牌 牌的比較
*/
public class PokerManager {
//保存一副牌
private ArrayList<Poker> pokers = new ArrayList<>();
//創(chuàng)建靜態(tài)的變量
public static final PokerManager manager = new PokerManager();
//私有化 構(gòu)造方法
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++){
//創(chuàng)建一張牌
Poker poker = new Poker(dot,Constant.TYPES[j]);
//將這張牌保存起來(lái)
pokers.add(poker);
}
}
//洗牌
Collections.shuffle(pokers);
}
//顯示一副牌(測(cè)試)
public void show(){
for(Poker poker: pokers){
System.out.print(poker.getDot()+poker.getType().getPic()+" ");
}
System.out.println();
}
/**
* 給每個(gè)玩家發(fā)牌
* @param players 所有參與的玩家
*/
public void dealCards(ArrayList<Player> players){
for(int i = 0 ; i < players.size();i++){
Player player = players.get(i);
//將數(shù)組里面對(duì)應(yīng)的撲克牌給對(duì)應(yīng)的玩家
player.poker = pokers.get(i);
//
}
}
}
接下來(lái)整理玩家信息
創(chuàng)建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
//當(dāng)打印一個(gè)對(duì)象的時(shí)候 就會(huì)默認(rèn)去調(diào)用對(duì)象的toString方法
//如果當(dāng)前類里面沒(méi)有實(shí)現(xiàn)這個(gè)方法 就到父類里面去查找
//object里面默認(rèn)實(shí)現(xiàn)就是打印對(duì)象的首地址
public String toString() {
//一號(hào)玩家:xxx 金幣 1000
return id+"號(hào)玩家: "+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;
}
}
創(chuàng)建PlayerManager管理 玩家的相關(guān)操作
import java.util.ArrayList;
import java.util.Collections;
/**
* 管理牌的相關(guān)操作
* 生成一副牌 洗牌 發(fā)牌 牌的比較
*/
public class PokerManager {
//保存一副牌
private ArrayList<Poker> pokers = new ArrayList<>();
//創(chuàng)建靜態(tài)的變量
public static final PokerManager manager = new PokerManager();
//私有化 構(gòu)造方法
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++){
//創(chuàng)建一張牌
Poker poker = new Poker(dot,Constant.TYPES[j]);
//將這張牌保存起來(lái)
pokers.add(poker);
}
}
//洗牌
Collections.shuffle(pokers);
}
//顯示一副牌(測(cè)試)
public void show(){
for(Poker poker: pokers){
System.out.print(poker.getDot()+poker.getType().getPic()+" ");
}
System.out.println();
}
/**
* 給每個(gè)玩家發(fā)牌
* @param players 所有參與的玩家
*/
public void dealCards(ArrayList<Player> players){
for(int i = 0 ; i < players.size();i++){
Player player = players.get(i);
//將數(shù)組里面對(duì)應(yīng)的撲克牌給對(duì)應(yīng)的玩家
player.poker = pokers.get(i);
//
}
}
}
創(chuàng)建PlayerManager管理 玩家的相關(guān)操作
import java.util.ArrayList;
public class PlayerManager {
//記錄當(dāng)前下注的玩家編號(hào)
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++){
//創(chuàng)建玩家
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();
}
/**
* 獲取當(dāng)前下注的玩家
* @return 玩家對(duì)象
*/
public Player currentPlayer(){
return players.get(currentPlayerIndex);
}
/**
* 當(dāng)前剩余玩家數(shù)
* @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;
}
/**
*
* 查找下一個(gè)下注的人
*/
public void changeNext(){
int i = currentPlayerIndex;
if(i == players.size()-1){
i =0;
}else{
i++;
}
//查找下一個(gè)可以參與的玩家
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+"號(hào)玩家贏得"+total+"金幣");
winner.add(total);
}
}
創(chuàng)建GameCenter類 管理游戲進(jìn)行的相關(guān)操作
public class GameCenter {
//記錄這局的籌碼
public int totalMoney;
public void start(){
System.out.println("游戲開(kāi)始 請(qǐng)下底注");
//扣除底注
PlayerManager.manager.betAll(Constant.BASE);
PlayerManager.manager.show();
//發(fā)牌
System.out.println("開(kāi)始發(fā)牌");
PokerManager.manager.dealCards(PlayerManager.manager.players);
PlayerManager.manager.show();
int time = 0;//如果是兩個(gè)人的次數(shù)
boolean isFirst = true;
int betMoney = 0;
while(true){
//獲取當(dāng)前玩家信息
Player player = PlayerManager.manager.currentPlayer();
//提示選擇操作
System.out.println("請(qǐng)"+player.id+"號(hào)玩家選擇操作:");
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+"號(hào)玩家棄牌!");
player.hasDiscard = true;
break;
default:
//下注
if(isFirst){
while(true) {
System.out.print("請(qǐng)輸入下注金額:");
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){
//計(jì)算多少人還可以參與
int available = PlayerManager.manager.leftPlayerCount();
if(available ==1){
break;
}
if(available == 2){
time++;
if(time == 4){
//兩個(gè)回合結(jié)束
break;
}
}
//切換到下一個(gè)人
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();
//輸入玩家人數(shù)
Utils.showText(false,false,new String[]{"輸入玩家人數(shù)"});
int count = Utils.getInput();
//初始化玩家
PlayerManager.manager.initPlayer(count);
//顯示玩家信息
PlayerManager.manager.show();
GameCenter center = new GameCenter();
center.start();
}
}
```.
#總結(jié)
今天不是很懂