模拟斗地主的洗牌和发牌的小程序

模拟斗地主的洗牌和发牌

思路:
1)创建一个牌盒(容器:集合)
ArrayList<String>
2)装牌
红桃A,黑桃A,方片A,梅花A...
3)洗牌
Collections中的随机置换功能:shuffle()
4)发牌
遍历集合,获取集合中具体的牌
通过选择语句进行判断:
1--->A, 2--->B, 2--->C
4--->A,...
发给3个人,3个人分别用ArrayList<String>接收
如果当前牌  %3 == 0,1,2
5)看牌

将看牌封装成一个独立的功能

代码如下:

import java.util.ArrayList;
import java.util.Collections;

public class Poker {
	
	public static void main(String[] args) {
		
		//1.创建牌盒
		ArrayList<String> array = new ArrayList<String>() ;
		
		//2.装牌
		//2.1创建花色数组
		String[] colors = {"♥","♠","♦","♣"} ;
		//2.2 创建点数数组
		String[] numbers = {"A","2","3","4","5","6","7","8","9",
							"10","J","Q","K"} ;
		for(String color :colors) {
			for(String number:numbers) {
					String poker = color.concat(number) ;
					array.add(poker) ;
			}
		}
		
		//添加大王和小王
		array.add("大王") ;
		array.add("小王") ;
		
		//3.洗牌
		Collections.shuffle(array);
		//System.out.println(array);
		
		//4.发牌
		//现在3个人玩,把每个人都看做一个ArrayList
		ArrayList<String> player1 = new ArrayList<String>() ;
		ArrayList<String> player2 = new ArrayList<String>() ;
		ArrayList<String> player3 = new ArrayList<String>() ;
		ArrayList<String> diPai = new ArrayList<String>() ;
		
		//遍历ArrayList集合,使用普通for循环,获取到集合的元素
		//通过元素 % 玩家人数 = 0	 /1/2 /..
		for(int x = 0 ; x < array.size() ; x ++) {
			//获取到每一个元素
			if(x >= array.size() -3) {
				//底牌
				diPai.add(array.get(x)) ;
			}else if(x % 3 == 0) {
				//玩家1
				player1.add(array.get(x)) ;
			}else if(x % 3 == 1) {
				//玩家2
				player2.add(array.get(x)) ;
			}else if(x % 3 == 2) {
				//玩家3
				player3.add(array.get(x)) ;
			}
		}
		
		//5.看牌 
		//3个人看牌,将看牌封装成一个功能
		lookPoker("玩家1", player1);
		lookPoker("玩家2", player2);
		lookPoker("玩家3", player3);
		lookPoker("底牌", diPai);
	}
	
	public static void lookPoker(String name,ArrayList<String> array) {
		System.out.print(name+"的牌是:");
		for(String s : array) {
			System.out.print(s+" ");
		}
		System.out.println();
	}
}

运行后发现,虽然牌发到每一个人手中的基本功能完成了,但怎样才能保证牌发到每个人的手中都是有序的呢?我们可以通过Collections的sort()功能进行排序,但这种方法是以花色来排序的,也就是说每个花色都是有序的,但花色之间不是有序的(这种方法大家可以下去自己试一下),那怎么才能以点数来排序呢?我们联想到之前学习过的TreeMap集合:

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

public class Poker2 {

	public static void main(String[] args) {
		//1. 创建两个集合:HashMap<Integer,String>,ArrayList<Integer>
		HashMap<Integer, String> hm = new HashMap<Integer, String>();
		ArrayList<Integer> array = new ArrayList<Integer>();

		//2.装牌
		//2.1 定义花色数组和点数数组
		String[] colors = { "♥", "♠", "♦", "♣" };
		String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };

		//从0开始编号,将编号与编号对应的牌存储到HahMap集合中,同时往ArrayList集合中单独存储编号
		int index = 0;
		//拼接
		for (String number : numbers) {
			for (String color : colors) {
				String poker = color.concat(number);
				hm.put(index, poker);
				array.add(index);
				index++;
			}
		}

		//装大王和小王
		hm.put(index, "大王");
		array.add(index);
		index++;
		hm.put(index, "小王");
		array.add(index);
		//不能再++了,否则会出现角标越界

		//洗牌
		Collections.shuffle(array);
		//System.out.println(array);

		//4.发牌
		//发的也是编号,为了保证牌有序,用TreeSet集合接收
		TreeSet<Integer> player1 = new TreeSet<Integer>();
		TreeSet<Integer> player2 = new TreeSet<Integer>();
		TreeSet<Integer> player3 = new TreeSet<Integer>();
		TreeSet<Integer> diPai = new TreeSet<Integer>();

		//遍历ArrayList集合,使用普通for循环,获取到集合的元素
		//通过元素 % 玩家人数 = 0	 /1/2 /..
		for (int x = 0; x < array.size(); x++) {
			//获取到每一个元素
			if (x >= array.size() - 3) {
				//底牌
				diPai.add(array.get(x));
			} else if (x % 3 == 0) {
				//玩家1
				player1.add(array.get(x));
			} else if (x % 3 == 1) {
				//玩家2
				player2.add(array.get(x));
			} else if (x % 3 == 2) {
				//玩家3
				player3.add(array.get(x));
			}
		}
		//5.看牌,封装功能
		lookPoker("玩家1", player1, hm);
		lookPoker("玩家2", player2, hm);
		lookPoker("玩家3", player3, hm);
		lookPoker("底牌", diPai, hm);
		
	}
	
	public static void lookPoker(String name,TreeSet<Integer> ts,
			HashMap<Integer, String> hm) {
		System.out.print(name+"的牌是:");
		//遍历TreeSet集合获取到每一个编号
		for(Integer key :ts) {
			//获取编号,通过编号找牌(在HashMap中找)
			String value = hm.get(key) ;
			System.out.print(value+" ");
		}
		System.out.println();
	}	
}
至此,斗地主的小游戏就完成了~
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值