iShare 技术 爪哇斗地主 Sun
-
Upload
jun-sun -
Category
Technology
-
view
500 -
download
10
description
Transcript of iShare 技术 爪哇斗地主 Sun
程序实现题
编写程序模拟“斗地主”游戏的分牌过程,且输出每个人分配到扑克牌信息
1) 扑克牌信息可用 1-54之间的数字代替;
2) 要求分配的扑克牌不能是连续性的
3) “斗地主”规则是:只有三个人参加,且预留底牌 3张,由“地主”收底牌,
默认第一个玩家为地主(也就是第一个玩家有 20张牌,其它二玩家各 17张
牌)
思路
生成一幅牌, 将 1 ~ 54之间的数字共 54个放入一个数组中
对数组进行乱排序(模拟洗牌过程).
随机选出一位地主, 用一个大小为 20的数组表示
从中取出所有数字分别放入 3个新的子数组中, 其中 1个包含 20个数字, 其他
2个各包含 17个数字
实现
/**
* 模拟实现斗地主发牌过程
*
* @author Sun * @version FightLandlord.java 2011-10-14 17:00:47 */public class FightLandlord { public static void main(String[] args) {
// 构造一副新牌
Stack<Integer> newPoker = new Stack<Integer>(); for (int i = 1; i <= 54; i++) { newPoker.add(i); }
// 洗牌
Collections.shuffle(newPoker);
// 玩家闪亮登场
Map<Integer, List<Integer>> players = new HashMap<Integer, List<Integer>>(); List<Integer> jobs = new ArrayList<Integer>(); List<Integer> gates = new ArrayList<Integer>(); List<Integer> page = new ArrayList<Integer>(); players.put(0, jobs); players.put(1, gates); players.put(2, page);
// 猥琐的地主
int whoIsTheLord = (int) (Math.random() * 3);
// 发牌, 每轮发 3张
for (int i = 0, length = newPoker.size() - 3; i < length; i+=3) {
// 地主先抓牌
for (int j = whoIsTheLord, count = 0; count < 3; count++) { players.get(j).add(newPoker.pop());
// 谁下一个抓牌(保持抓牌顺序始终从地主开始)
// 例如 2是地主, 那么以后的抓牌顺序都是 2, 0, 1
j++;
if (j > 2) {
// 确保抓了一圈牌
j = 0; } } }
// 底牌给地主
players.get(whoIsTheLord).add(newPoker.pop()); players.get(whoIsTheLord).add(newPoker.pop()); players.get(whoIsTheLord).add(newPoker.pop());
// 测试
System.out.println("哪个是地主?\n" + whoIsTheLord + "\
n"); for (Integer p : jobs) { System.out.println(p); } System.out.println("=> 0, jobs: " + jobs.size() + "\n");
for (Integer p : gates) { System.out.println(p); } System.out.println("=> 1, gates: " + gates.size() + "\n");
for (Integer p : page) { System.out.println(p); } System.out.println("=> 2, page: " + page.size()); }}
输出
哪个是地主?
2
929283644261714263039483475446=> 0, jobs: 17
19223850216373132114582710433540=> 1, gates: 17
34724121