一甫煞、目的
目的很單純菇曲。就是用Java寫個撲克游戲,在寫的過程中鍛煉自己的邏輯思維能力抚吠,熟練使用快捷鍵(快捷鍵的相關(guān)文章:Android studio必備快捷鍵)常潮,提高自己的編程速度,同時注意編程風(fēng)格的養(yǎng)成楷力。
二喊式、知識點
1.單例設(shè)計模式
2.數(shù)組的使用 ArrayList
3.撲克牌游戲的實現(xiàn)
三、具體內(nèi)容
1.單例設(shè)計模式
定義:
指一個類只有一個實例弥雹,且該類能自行創(chuàng)建這個實例的一種模式垃帅。例如,Windows 中只能打開一個任務(wù)管理器剪勿,這樣可以避免因打開多個任務(wù)管理器窗口而造成內(nèi)存資源的浪費贸诚,或出現(xiàn)各個窗口顯示內(nèi)容的不一致等錯誤。
特點:
1.單例類只有一個實例對象;
2.該單例對象必須由單例類自行創(chuàng)建酱固;
3.單例類對外提供一個訪問該單例的全局訪問點械念;
其的兩種實現(xiàn)
1.餓漢式
該模式的特點是類一旦加載就創(chuàng)建一個單例,保證在調(diào)用 getInstance 方法之前單例已經(jīng)存在了,故多線程使用的時候是安全的运悲。
class Poker{
//default,sharedInstance,
//2. 定義一個靜態(tài)成員變量 記錄這個單例對象
//餓漢式
public static final Poker shared=new Poker();
//1. 構(gòu)造方法
private Poker(){}
public void test(){}
}
2.懶漢式
多線程使用時不安全龄减,可以通過加鎖來保證多線程訪問時會將完整的代碼加載完畢。
lass Player{
public int count;
//2.創(chuàng)建一個靜態(tài)變量
private static Player shared=null;//有final就只能賦值一次
//1構(gòu)造方法
private Player(){}
//3.提供給外部一個訪問方法
//懶漢式 多線程時不建議使用 不安全
//解決放法 加鎖
public static Player getInstance(){
Object b = new Object();//加鎖
synchronized (b) {//加鎖
if (shared == null) {
//如果沒有創(chuàng)建 那就創(chuàng)建一個
shared = new Player();
}
}
return shared;
}
}
2.數(shù)組的使用 ArrayList
/數(shù)組真實內(nèi)存
class Test2{
public static void main(String[] agrs){
/**
* //<>泛型
* 數(shù)組里面保存的都是對象的引用(指針 地址)
* 改變數(shù)組里面的屬性變量
* 原始對象的值也跟著改變
* 因為大家都是指向同一個內(nèi)存空間
*/
ArrayList<Person> people = new ArrayList<>();
//添加數(shù)據(jù)
Person xw = new Person();
people.add(xw);
Person zs = new Person();
people.add(zs);
//訪問數(shù)據(jù)
Person xw2 = people.get(0);//取出xw進行保存
xw2.name = "小王";
System.out.println(xw2.name);
System.out.println(xw.name); //均為小王
}
}
class Person{
public String name;
}
3.撲克牌游戲的實現(xiàn)
四班眯、實際應(yīng)用 撲克牌游戲
Constant類
public class Constant {
//用數(shù)組保存牌的點數(shù) 用ArrayList的話需要add 用一般數(shù)組
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 = {"極光","卡利亞","克拉","曼羅"};
//設(shè)置默認的金幣
public static final int MONEY = 1000;
//每局消耗的金幣數(shù) 底注
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();
//發(fā)牌
System.out.println("開始發(fā)牌");
PokerManager.manager.dealCards(PlayerManager.manager.players);
int time = 0;//記錄如果是2個人的次數(shù)
//下注
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){
//兩回合結(jié)束
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();
//提示輸入玩家人數(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();
}
}
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;
}
//當打印一個對象的時候 就會默認去調(diào)用toString方法
//如果當前來里面沒有實現(xiàn)這個方法 就到父類里面去查找
//object里面默認實現(xiàn)就是打印對象的首地址
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<Player> players = new ArrayList<>();
//創(chuàng)建靜態(tài)變量
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);
}
}
/**
* 打底注
* @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);
}
/**
* 當前剩余玩家數(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;
}
/**
* 查找下一個下注的人
*/
public void changeNext(){
int i=0;
if(i == players.size()-1 ){
i = 0;
}
//查找下一個可參與的玩家
for(;i<players.size(); 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;
/**
* 管理牌的相關(guān)操作
* 生成一副牌 洗牌 發(fā)牌 牌的比較
*/
public class PokerManager {
//保存一副牌
private ArrayList<Poker> pokers = new ArrayList<>();
//創(chuàng)建靜態(tài)變量
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<Constant.TYPES.length;j++) {
//創(chuàng)建一張牌
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();
}
}
/**
*給每個玩家發(fā)牌
* @param players 所有的玩家
*/
public void dealCards(ArrayList<Player> players){
for(int i = 0;i < players.size(); i++){
Player player = players.get(i);
//將數(shù)組里面對應(yīng)的撲克牌給對應(yīng)的玩家
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;
//提供一個自定義的構(gòu)造方法 默認的構(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;
}
}
Utils
import java.util.Scanner;
public class Utils {
//如果不需要保存數(shù)據(jù) 沒有成員變量
//提供靜態(tài)方法 方便訪問
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{
//輸出帶編號的多行數(shù)據(jù)
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();
}
}
五抑月、感悟
學(xué)習(xí)Java第四天了幼衰,今天真的是累的坐著(沒趴桌子)睡著了,簡直畫面太美不敢想象QAQ诊霹,看到聽到這些類滿腦子都是累羞延,還是要堅持下去,這個撲克游戲從開始自己一股腦寫完脾还,再到一修伴箩,再到現(xiàn)在的二修,花了很多精力和時間荠呐,從剛開始的粗略到現(xiàn)在的細致赛蔫,其實都是進步,雖然真的很累泥张,但是相信努力過后辛苦沒有白費的感覺是很不錯的呵恢,加油吧騷年!C拇础渗钉!