一、目的
- 学习单例设计模式
- 利用Java完成扑克游戏的Demo
二、技术及其实现
1.牌的花色及大小管理
public class PokerType {
public static final PokerType SPADES=new PokerType("♠",4);
public static final PokerType HEART=new PokerType("♥",3);
public static final PokerType CLUBS=new PokerType("♣",2);
public static final PokerType DIAMONDS=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;
}
}
2.牌的相关操作管理
public class PokerManager {
//保存一副牌
private ArrayList<Poker> 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<Constant.TYPES.length;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<Player>players){
for(int i=0;i<players.size();i++){
Player player=players.get(i);
//将数组里面对应的扑克牌给对应的玩家
player.poker=pokers.get(i);
}
}
}
3.玩家信息
public class Player {
public String name;
public int id;
public int money;
public Poker poker;
public Player(){
}
public Player(String name,int id,int money){
this.name=name;
this.id=id;
this.money=money;
}
@Override
public String toString() {
//1号玩家 张家辉 筹码1000
String pkString = "";
if (poker!=null){
pkString = ""+poker.getDot()+poker.getType().getPic();
}
return id+"号玩家: "+name+" 筹码"+money+" "+getPokerString();
}
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;
}
}
}
4.玩家信息操作管理
public class PlayerManager {
//记录当前下注的玩家编号
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++){
//创建玩家信息
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);
}
}
//打底
public int betAll(int count){
int total=0;
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);
}
public void changeNext(){
//查找下一个可以参与的玩家
if ()
}
}
5.游戏中心
public class GameCenter {
//记录这局的筹码
private int totaMoney;
//开始游戏
public void start(){
System.out.println("游戏开始,请打底:");
//扣底注
PlayerManager.manager.betAll(Constant.base);
PlayerManager.manager.show();
//发牌
PokerManager.manager.dealCards(PlayerManager.manager.);
PlayerManager.manager.show();
while (true){
//获取当前玩家信息
Player player=PlayerManager.manager.currentPlayer();
//提示选择操作
System.out.println("请"+player.id+"号玩家选择操作");
Utils.showText(true,true,new String[]{"看牌","弃牌","下注"});
int choice=Utils.getInput();
}
}
}
三、心得体会
不得不说,对于我来说今天的Demo实在是太复杂了,刚开始还行到后来边听边写也才勉强跟上。我觉得要我自己单独写这个Demo还差得有点远,这样说来我还是慢慢看视频去吧。