一、目的
目的很单纯。就是用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(;i0){
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 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,看到听到这些类满脑子都是累,还是要坚持下去,这个扑克游戏从开始自己一股脑写完,再到一修,再到现在的二修,花了很多精力和时间,从刚开始的粗略到现在的细致,其实都是进步,虽然真的很累,但是相信努力过后辛苦没有白费的感觉是很不错的,加油吧骚年!!!