java案例之-三国斗地主

Java实现三国斗地主
本文介绍了使用Java来实现三国斗地主游戏的思路和步骤。通过发牌编号进行游戏逻辑处理,详细讲解了需求分析、代码实现和最终的总结。

1.三国斗地主思路分析

需求:

4个人玩斗地主,底牌三张。51张牌发给三个人,每个人17张牌。每个人的牌要排好序。

思路分析:

总共有54张牌,四种花色,每种花色13张,大小王各一张。
首先肯定要把54张牌的编号按照斗地主的发牌对应表规则(自己制作的table)存到集合中,发牌是随机的(因为用shuffle(List list)方法可以实现洗牌功能),所以用到List集合类。如果直接发牌,那么牌不能自动排序。要想排序,那么就需要Set集合类。只能根据编号来找牌,那么就用到键和值。所以要用HashMap或者TreeMap集合。


主要思路:发的不是牌,发的是编号,看的是根据编号查找到的牌。



步骤:

1.创建ArrayList集合存储编号,方便随机发牌
2.创建TreeMap集合,按规定存储键值对。(相当于一张表一样,一一对应)
3.创建花色数组和牌值数组。
4.洗牌,用shuffle(List list)方法洗牌
5.发牌,每个人的牌用TreeSet集合接收,可以自动把编号排序。
6.看牌。按照4的编号在TreeMap集合中找编号所对应的牌

2.代码实现

package cn.jason01;

import java.util.ArrayList;
import java.util.Collections;
import java.util.TreeMap;
import java.util.TreeSet;

/**
 * 这是模拟斗地主的一个案例
 * 
 * @author cassandra
 * @version v1.1
 */
public class Doudizhu {
	public static void main(String[] args) {
		// 创建ArrayList集合
		ArrayList<Integer> array = new ArrayList<Integer>();
		// 存储编号
		for (int x = 0; x < 54; x++) {
			array.add(x);
		}
		// 创建TreeMap集合,制作发牌表
		TreeMap<Integer, String> table = new TreeMap<Integer, String>();
		// 创建花色数组
		String[] color = { "♦", "♥", "♠", "♣" };
		// 创建牌值数组
		String[] pokerNumber = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };
		// 把花色和扑克值字符串拼接,并且把键值对添加到集合TreeMap中
		int index = 0;
		for (int x = 0; x < color.length; x++) {
			for (int y = 0; y < pokerNumber.length; y++) {
				String value = new StringBuilder().append(color[x]).append(pokerNumber[y]).toString();
				table.put(index, value);
				index++;
			}
		}
		// 添加小王
		table.put(index, "小王");
		index++;
		// 添加大王
		table.put(index, "大王");

		// 洗牌
		Collections.shuffle(array);

		// 发牌
		// 第一个人的牌-刘备的牌
		TreeSet<Integer> liuBei = new TreeSet<Integer>();
		// 第二个人的牌-曹操的牌
		TreeSet<Integer> caoCao = new TreeSet<Integer>();
		// 第三个人的牌-孙权的牌
		TreeSet<Integer> sunQun = new TreeSet<Integer>();
		// 底牌
		TreeSet<Integer> bottom = new TreeSet<Integer>();
		for (int x = 0; x < array.size(); x++) {
			if (x >= array.size() - 3)
				bottom.add(array.get(x));
			else if (x % 3 == 0)
				liuBei.add(array.get(x));
			else if (x % 3 == 1)
				caoCao.add(array.get(x));
			else if (x % 3 == 2)
				sunQun.add(array.get(x));

		}

		// 看牌
		// 刘皇叔的牌是:
		showPoker("刘备", liuBei, table);
		// 曹操的牌是:
		showPoker("曹操", caoCao, table);
		// 孙权的牌是:
		showPoker("孙权", sunQun, table);
		// 底牌是:
		showPoker("底牌", bottom, table);

	}

	public static void showPoker(String player, TreeSet<Integer> user, TreeMap<Integer, String> table) {
		// 看牌,用TreeSet里面的编号在TreeMap里面找对应的牌就ok
		System.out.println(new StringBuilder().append("\n" + player).append("的牌是:" + "\n").toString());
		for (int key : user) {
			String value = table.get(key);
			System.out.print(value + "  ");
		}
	}
}

3.总结

1.洗牌的功能方法,用shuffle(List list)来实现

2.每个人的牌接收用TreeSet集合,可实现自动排序。TreeSet集合底层是TreeMap实现的,有自然排序和比较器排序。因为Integer包装类型已经实现了Comparable接口,重写了compareTo方法,所以可以直接排序。否则,自定义类需要实现Comparable接口或者实现Comparator比较器接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值