麻将游戏实现:
实现功能点: 实现麻将的准备牌,洗牌,发牌,看牌 (集合知识) 麻将功能需求分析 a:具体规则:
1.组装136张麻将,条,筒,万加在一起的数目是108张 东,南,西,北风,红中,发财,白板是28张,总共136张
2.将136张牌顺序打乱
3.四个玩家参与游戏,四个人交替摸牌,每次4张,先摸3次,之后庄家摸2张(2张之间索引差4),其他人再摸一张,庄家14张,其余人13张牌,剩下的留作底牌。
4.查看四人手中的牌(按照牌的大小排序),底牌
代码的实现:
public class Mahjong {
public static void main(String[] args) {
//定义三个数组,用来组合麻将牌
int[] num = new int[]{1,2,3,4,5,6,7,8,9};
String[] name = new String[]{"条","筒","万"};
String[] tablet = new String[]{"东","南","西","北","中","白板","发财"};
//记录牌的编号
int k = 0;
//用来存放牌
HashMap<Integer,String> hashMap = new HashMap<>();
//用来记录麻将存放个数,和次序
List<Integer> number = new ArrayList<>();
//定义四个存放玩家牌的数组
List<Integer> player1 = new ArrayList<>();
List<Integer> player2 = new ArrayList<>();
List<Integer> player3 = new ArrayList<>();
List<Integer> player4 = new ArrayList<>();
//用来存放底牌
List<Integer> base = new ArrayList<>();
//准备牌,for循环添加条,筒,万
for(int i =0;i<num.length;i++) {
for(int j=0;j < name.length ;j++) {
String s = num[i] + name[j];
for(int l=0;l<4;l++) {
hashMap.put(k++, s);
//将牌的编号加入number中
number.add(k);
}
}
}
//for循环添加东南西北中白板发财
for(int i=0;i<tablet.length;i++) {
for(int j=1;j <= 4;j++) {
hashMap.put(k++,tablet[i]);
number.add(k);
}
}
System.out.println(hashMap.size());
System.out.println("看牌: ");
//用迭代器来遍历
Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();
while(iterator.hasNext()) {
System.out.print("(" + iterator.next() + ")" + " ");
}
System.out.println();
System.out.println("将牌打乱顺序: ");
//集合提供方法,将一个整形数组打乱
Collections.shuffle(number);
for(int i =0;i< number.size(); i++) {
System.out.print("(" + i + ":" + hashMap.get(number.get(i)) + ")" + " ");
}
System.out.println();
//发牌
//定义属性n,记录摸牌的位置
Integer n = 0;
//总共发三次,每一次每人摸四张牌,
for(int i=0;i<3;i++) {
for(int j=0;j<4;j++) {
player1.add(number.get(n++));
player2.add(number.get(n++));
player3.add(number.get(n++));
player4.add(number.get(n++));
}
}
//庄家摸两次牌,其他人摸一张(玩家1是庄家)
player1.add(number.get(n));
//需要跳牌(庄家第一次和第二次摸的位置索引值差4)
n = n + 4;
player1.add(number.get(n));
//回到庄家第一次摸牌的位置的下一个
n = n - 3;
player2.add(number.get(n));
player3.add(number.get(n));
player4.add(number.get(n));
//剩下的底牌
for(int i=n;i<number.size();i++) {
base.add(number.get(i));
}
System.out.println();
//对玩家手里的牌进行排序,集合提供排序方法
Collections.sort(player1);
Collections.sort(player2);
Collections.sort(player3);
Collections.sort(player4);
//看牌 , 4个for循环遍历
System.out.println("看牌 :");
System.out.print("player1 : ");
for(int i=0;i<player1.size();i++) {
System.out.print(hashMap.get(player1.get(i)) + " ");
}
System.out.println();
System.out.print("player2 : ");
for(int i=0;i<player2.size();i++) {
System.out.print(hashMap.get(player2.get(i)) + " ");
}
System.out.println();
System.out.print("player3 : ");
for(int i=0;i<player3.size();i++) {
System.out.print(hashMap.get(player3.get(i)) + " ");
}
System.out.println();
System.out.print("player4 : ");
for(int i=0;i<player4.size();i++) {
System.out.print(hashMap.get(player4.get(i)) + " ");
}
System.out.println();
System.out.print("底牌 : ");
for(int i=0;i<base.size();i++) {
System.out.print(hashMap.get(base.get(i)) + " ");
}
System.out.println();
}
看牌的代码块可以封装起来,会显得简洁明了;
//封装后的函数
looking("1号",player1,hashMap);
looking("2号",player2,hashMap);
looking("3号",player3,hashMap);
looking("4号",player4,hashMap);
looking("底牌",base,hashMap);
}
/**
* 输入想看的玩家的名字,传入该玩家的List数组,传入存放麻将牌的集合
* @param name
* @param player
* @param hashMap
*/
private static void looking(String name,List<Integer> player, HashMap<Integer,String> hashMap) {
System.out.print(name + ": ");
for(int i=0;i<player.size();i++) {
System.out.print(hashMap.get(player.get(i)) + " ");
}
System.out.println();
}
2561



被折叠的 条评论
为什么被折叠?



