今天一整天都是在写一个关于扑克牌游戏的Demo。这个Demo对于现在初学Java的我们还是有一定的困难。许多地方都存在着疑问。当然,尝试去写这个Demo对我们还是有好处的,不仅可以去锻炼我们敲代码的速度和手对键盘的熟悉度,嘿嘿,主要是这次Demo代码有点多了。还能去训练的我们的思维逻辑能力,去思考当我们拿到一个Demo时如何去寻找突破口,如何构思它的步骤,如何让它更简洁方便实用等等。
public class Myclass {
public static void main(String[] args){
Utils.showText(true,true,new String[]{"西南大学荣昌校区"});
pokermanager.manager.pai();//生成一副牌
pokermanager.manager.show();//显示一副牌
//提示输入玩家的人数
Utils.showText(false,false,new String[]{"请输入来者人数:"});
int count=Utils.getInput();//接收用户有多少人参加
//初始化玩家
playermanager.manager.initplayer(count);
//显示玩家信息
// playermanager.manager.show();
//开始游戏
GameCenter gameCenter=new GameCenter();
gameCenter.start();
}
}
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 {
//输出带编号的多行数据
//1. 弃牌
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" : "");
}
//接收用户收入
public static int getInput(){
Scanner scanner=new Scanner(System.in);//要接收就是Scanner
return scanner.nextInt();
}
}
public class pokermanager {
/**
* 管理牌的相关操作
* 生成一副牌 洗牌 发牌 牌的比较
*/
//首先想到用一个成员变量来保存一副牌,这里是定义了一组数组
private ArrayList<poker> pokers = new ArrayList<>();
//创建静态的变量
public static final pokermanager manager = new pokermanager();
//私有化构造方法
private pokermanager() {
}
//定义一个 方法生成一副牌
public void pai() {
//遍历整个点数的数组
for (int i = 0; i < constant.DOTS.length; i++)//获取对应的点数
{
String dot = constant.DOTS[i];
//生成牌的4种花色
for (int j = 0; j < constant.TYPES.length; j++) {
//参加一张牌
poker poker = new poker(dot, constant.TYPES[j]);
//将这张牌保存起来
pokers.add(poker);
}
/*黑桃
// PokerType spades=new PokerType();
// spades.setPic("♠");
PokerType spades=new PokerType("♠",4);//用的默认构造方法
//黑桃
PokerType hearts=new PokerType("♥",3);
//红桃
PokerType clubs=new PokerType("♣",2);
//梅花
PokerType diamonds=new PokerType("♦",1);
//方块*/
//创建四张牌
/*poker ps=new poker();
ps.setDot(dot);
ps.setType(spades);*/
/* poker ps=new poker(dot,spades);//用的默认构造方法
poker ph=new poker(dot,spades);
poker pc=new poker(dot,spades);
poker pd=new poker(dot,spades);*/
//加到数组里面去
/*pokers.add(ps);
pokers.add(ph);
pokers.add(pc);
pokers.add(pd);*/
}
//洗牌
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);
}
}
}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.MOENY);
//保存玩家
players.add(player);
}
}
//输出玩家信息
public void show() {
for (player player : players) {
System.out.println(player);
}
}
/**
* 打底注
*
* @param count 每句消耗的金币
* @return -1:失败 >0 成功
*/
public int betAll(int count) {//打底注
for (player player : players) {
int relust = player.bet(count);
if (relust == -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 = currentPlayerIndex;
if (i == players.size() - 1) {
i = 0;
} else {
i++;
}
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) {
winner = w1;
} else {
winner = w2;
}
}
System.out.println(winner.id + "号玩家赢得胜利" + total + "获得金币");
winner.add(total);
}
}
/**
* 管理玩家的信息
*/
public class player {
public String name;
public int id;
public int money;
public poker poker;
public boolean hasDiscard;
public player(String name,int id,int money){
this.name=name;
this.id=id;
this.money=money;
}
@Override
//当打印一个对象的时候,就会默认去调用对象的toString方法
//如果当前来里面没有实现这个方法 就到父类里面去找
//object里面默认实现就是打印对象的首地址
public String toString() {
//1好玩家:华仔 金币10000
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;
}
/**
* 首先打底
* 下注
* @param count 下注金额
* @return -1:失败 >0 成功
*/
public int bet(int count){
//判断自己的赌资是否大于底注金额
if (money>=count){
money-=count;
return count;
}else
{
return -1;
}
}
public void add(int count){
money+=count;
}
}
public class constant {
//保存数组的点数
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.diamonds};
//保存默认的玩家姓名
public static final String[] DEFAULT_NAMES={"华仔","赌圣发哥","渣渣辉","古校长"};
//设置默认的玩家金币
public static final int MOENY=100000;
//底注 每句消耗的金币数
public static final int BASE=10;
}
import java.util.Arrays;
public class poker {
private String dot;
private PokerType type;
public poker(){}
public poker(String dot,PokerType type){
this.dot=dot;
this.type=type;
}
public String getDot() {
return dot;
}
public PokerType getType() {
return type;
}
public void setType(PokerType type) {
this.type = type;
}
public boolean bigerThan(poker poker) {
int mIndex = Arrays.binarySearch(constant.DOTS, this.dot);
int oIndex =Arrays.binarySearch(constant.DOTS, poker.dot);
System.out.println(this.dot + mIndex);
System.out.println(this.dot + oIndex);
if (mIndex != oIndex) {
//点数不同 直接比较
return mIndex > oIndex;
} else {
//点数相同 比较花色
return this.type.getId() > poker.type.getId();
}
}
}
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 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;
}
}
public class GameCenter {
//记录这句的的筹码
private int totalmoney;
//开始游戏
public void start() {
System.out.println("游戏开始,请打底:");
playermanager manager=playermanager.manager;
//扣除底注
playermanager.manager.betAll(constant.BASE);
playermanager.manager.show();
//开始发牌
System.out.println("开始发牌");
pokermanager.manager.dealCards(manager.players);
manager.show();
int time=0;//记录游戏还剩下两个人的次数
boolean isFisrst=true;
int betmoney=0;
while(true){
//获取当前玩家信息
player player=playermanager.manager.currentPlayer();
//提示选择操作
System.out.println("请"+player.id+
"号玩家选择操作:");
Utils.showText(true,true,
new String[]{"看牌","弃牌",
isFisrst?"下注":"跟注"});
int chioce=Utils.getInput();
boolean flag=false;
switch (chioce){
case 1:
//看牌
System.out.println(player.getpokerString());
flag=true;
break;
case 2:
//弃牌
System.out.println(player.id+"号玩家选择操作:");
player.hasDiscard=true;
break;
default:
//下注
if (isFisrst) {
System.out.print("请输入下注金额:");
betmoney=Utils.getInput();
int result=player.bet(betmoney);
if(result==-1){
//下注失败
System.out.print("余额不足:");
}else{
//下注成功
isFisrst=false;
totalmoney+=betmoney;
break;
}
break;
}else{
//跟注
int reslut=player.bet(betmoney);
if (reslut==-1){
player.hasDiscard=true;
}else
{
System.out.println("下注成功!");
totalmoney+=betmoney;
}
}
break;
}
if(flag=false){
//计算当前还有多少人可以参与
int available=manager.leftPlayerCount();
if(available==1){
//本局结束了
break;
}
if (available==2){
time++;
if(time==4){
//两个回合结束
break;
}
}
//切换到下一个人
manager.changeNext();
}
}
manager.awardWinner(totalmoney);
}
}
这就是最终的代码,但好像在我的电脑运行时出错的,但时平台没有显示错误。我一时也不知道时哪里有问题,只能去请教一下他人。虽然这次写的代码是有点多,还老是出错。但一定要有耐心,慢慢来,总会弄好的。记住:耐得住烦恼,才是赢家。也感谢老师的今天辛苦付出,我感觉到他今天的嗓子都说话说得有点哑了。辛苦啦,大佬!!!