如果上班这样玩斗地主,老板应该不会骂你.....

Posted 谷哥的小弟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果上班这样玩斗地主,老板应该不会骂你.....相关的知识,希望对你有一定的参考价值。


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

摸鱼湿了脚

本来在工位上开开心心写代码。忽然,行政专员叫我去老板那里一趟。直觉告诉我:估计是犯事儿了。果然,不出所料;到了办公室老板把我劈头盖脸一顿批评:你们部门的实习生上班玩游戏斗地主,你没有看见么?工作怎么安排的?是不是每天都在浑水摸鱼?
在这里插入图片描述
等老板发泄完,我回到了办公室;刚好迎面碰到满怀歉意的实习生。看见童鞋耷拉的脑袋,有点生气又有点想笑。本想说点什么的;想了想又算了。谁又没有年轻过呢?我又何必过分地指责他呢?于是,拉着他到会议室简单地聊了聊。

“童鞋啊,上班玩游戏是不对的;就算你想摸鱼也不要明目张胆地在电脑上玩呀。”

“嗯,我下次不玩了”

“不,你可以玩。”

“真的?”

“你自己写个程序玩。既锻炼了编程,又消磨了时间。”

“不会啊。太难了。我都还没有毕业呢。”

“很难?”

“嗯”

“来我给你写一个瞅瞅”

斗地主游戏梳理

斗地主这个游戏大家已经非常熟悉了。故,在此扼要梳理游戏中的相关要素。

游戏规则

  • 1、1副扑克牌
  • 2、3位玩家
  • 3、每位玩家17张牌
  • 4、底牌3张

原理分析

在明白了规则之后,我们的重点就可以放在游戏的实现上了。

牌的表示

除了大王和小王以外,每张牌都由花色(比如:梅花、红桃等)和符号(比如:2、3、K、Q等)组成。所以,我们可以定义两个数组来表示花色和符号:

// 牌的花色
public String[] colorArray = { "♠", "♥", "♣", "♦" };
// 牌的符号
public String[] numberArray = { "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3", "2" };

如果我们将数组colorArray 和 数组numberArray 组合起来不就是可以表示整副扑克了么?

牌的存取

为了便于存储,我们可将每张牌与一个唯一的编号对应起来。思路有了,就需要考虑选择存储的工具了。此时,TreeMap是个非常不错的选择。

要点概述:

  • 1、牌的序号从1开始
  • 2、利用ArrayList集合存放每张牌所对应的序号
  • 3、利用TreeMap集合存放每张牌
// 每张牌所对应的序号
public int cardSerialNumber = 1;
// 存放每张牌所对应的序号的ArrayList集合
public ArrayList<Integer> cardSerialNumberList = new ArrayList<Integer>();
// 存放每张牌的TreeMap集合
public TreeMap<Integer, String> cardTreeMap = new TreeMap<Integer, String>();

底牌的表示

类似地,我们留下3张底牌并且使用TreeSet集合存放它们。

// 底牌数
int remainCards = 3;
// 存放底牌的TreeSet集合
TreeSet<Integer> remainCardsTreeSet = new TreeSet<Integer>();

玩家的表示

3位玩家参与游戏,每位玩家持有17张扑克。所以,我们可以用TreeSet集合表示每位玩家持有的牌。

// 三位玩家
public TreeSet<Integer> player1CardsTreeSet = new TreeSet<Integer>();
public TreeSet<Integer> player2CardsTreeSet = new TreeSet<Integer>();
public TreeSet<Integer> player3CardsTreeSet = new TreeSet<Integer>();

斗地主游戏实现

OK,在梳理游戏中的相关要素之后,我们就可以动手开始编码了。

游戏准备

在正式开始游戏之前我们需要有一副牌,也就是说:需要把每张扑克放置于同一个集合中。

	public void prepareCard() {
		// 将大王所对应的序号存放至cardSerialNumberList
		cardSerialNumberList.add(cardSerialNumber);
		// 将大王存放至cardTreeMap
		cardTreeMap.put(cardSerialNumber, "RED-JOCKER");
		cardSerialNumber++;

		// 将小王所对应的序号存放至cardSerialNumberList
		cardSerialNumberList.add(cardSerialNumber);
		// 将小王存放至cardTreeMap
		cardTreeMap.put(cardSerialNumber, "BLACK-JOCKER");
		cardSerialNumber++;

		// 将除大小王以外的牌所对应的序号存放至cardSerialNumberList
		// 将除大小王以外的牌存放至cardTreeMap
		for (int i = 0; i < numberArray.length; i++) {
			for (int j = 0; j < colorArray.length; j++) {
				cardSerialNumberList.add(cardSerialNumber);
				String card = colorArray[j] + numberArray[i];
				cardTreeMap.put(cardSerialNumber, card);
				cardSerialNumber++;
			}
		}
	}

洗牌

扑克牌有了,在发牌之前我们需要先洗牌。在此,利用Collections.shuffle( )函数打乱cardSerialNumberList中原本的顺序。

public void shuffleCard() {
	Collections.shuffle(cardSerialNumberList);
}

发牌

每个玩家轮流获得一张牌,最后剩余三张底牌。
在这里插入图片描述

	public void dealCard() {
		for (int i = 0; i < cardSerialNumberList.size(); i++) {
			Integer serialNumber = cardSerialNumberList.get(i);
			int index = i % remainCards;
			if (i >= cardSerialNumberList.size() - remainCards) {
				remainCardsTreeSet.add(serialNumber);
			} else if (index == 0) {
				player1CardsTreeSet.add(serialNumber);
			} else if (index == 1) {
				player2CardsTreeSet.add(serialNumber);
			} else if (index == 2) {
				player3CardsTreeSet.add(serialNumber);
			}
		}
	}

看牌

发完牌之后,我们来看看各位玩家持有的牌。
在这里插入图片描述

	public void showCard() {
		System.out.println("玩家1所拿到的牌如下:");
		for (Integer i : player1CardsTreeSet) {
			System.out.print(cardTreeMap.get(i) + " ");
		}

		System.out.println();
		System.out.println();
		System.out.println("玩家2所拿到的牌如下:");
		for (Integer i : player2CardsTreeSet) {
			System.out.print(cardTreeMap.get(i) + " ");
		}
		System.out.println();
		System.out.println();
		System.out.println("玩家3所拿到的牌如下:");
		for (Integer i : player3CardsTreeSet) {
			System.out.print(cardTreeMap.get(i) + " ");
		}
		System.out.println();
		System.out.println();
		System.out.println("三张底牌如下:");
		for (Integer i : remainCardsTreeSet) {
			System.out.print(cardTreeMap.get(i) + " ");
		}
	}

测试

在这里插入图片描述

在这里插入图片描述

手里的牌和生活

给实习的童鞋讲完这个小Demo,我倒是想起来法外狂徒张三罗翔老师说过的话。
在这里插入图片描述

艾森豪威尔的母亲对他说:你在打牌的时候,即便你抓到一副最烂的牌,你也不能弃局。你也得把这个牌给干嘛呢?给打完。

我们很多时候是不是觉得我们抓的牌实在是太差了?但是,再差的牌你都应该打下去,有的时候我们惊奇的发现再差的牌有的时候最后还赢了,有没有这种可能呢?是有的。

如果在你的一生中遭遇到挫折,你有两种选择:一种选择是弃演;一种选择是把既定的剧本演好。

读到这些,感触颇多。牌是随机发的,我们改变不了的。我们能把握和改变的就是如何打好手里的牌。所以,年轻的童鞋们:不负时光,不负卿;不负春光,不负己;抓紧时间,努力让自己变得更好。

以上是关于如果上班这样玩斗地主,老板应该不会骂你.....的主要内容,如果未能解决你的问题,请参考以下文章

上班划水神器:一个可以在控制台玩斗地主项目!

高端程序员上班摸鱼指南

同事在上班期间在干私活,要不要告诉老板!

曝光,程序员的 10 个摸鱼神器

如果你是老板,你会不会踢了这样的员工?

设计模式这样玩泰简单(Golang版)-中介模式