用Java开发斗地主游戏案例

需求

用Java开发一个斗地主游戏,如下:

在这里插入图片描述

需求分析

  • 1、共有54张牌。
  • 2、点数:“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“J”,“Q”,“K”,“A”,"2“。
  • 3、花色: “♠”, “♥”, “♣”, "♦“。
  • 4、大小王:“👲” , "🃏“ 。
  • 5、发出51张牌,剩下三张做底牌。

实现思路:

  • 1、创建一个房间,提前准备好一副牌
  • 2、再进行洗牌,发牌,对牌进行排序(方便玩家观观看和清晰的知道牌的情况),看牌等操作。

代码实现

  • 牌类
package com.itheima.d3_collection_test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Room { // 房间类
    // 房间里必须有一副牌
    private List<Card> allCards = new ArrayList<>();

    public Room() {
        // 准备一副牌
        // 1、点色
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        // 2、花色
        String[] colors = {"♠", "♥", "♣", "♦"};
        int size = 0; // 表示牌的大小
        // 3、把这些牌做好,存入allCards集合中
        for (int i = 0; i < numbers.length; i++) {
          size++;
            // 遍历花色 ,让点数和花色组合
            for (int j = 0; j < colors.length; j++) {
                Card card = new Card(numbers[i], colors[j], size);
                allCards.add(card);
            }
        }
        // 4、存入最后大小王
        allCards.add(new Card("", "🃏", ++size));
        allCards.add(new Card("", "👲", ++size));
        System.out.println("新牌:" + allCards);


        // 启动游戏,开始洗牌,发牌,排序,看牌
        start();
    }

    private void start() {
        // 1、洗牌
        Collections.shuffle(allCards);
        System.out.println("洗牌后:" + allCards);

        // 2、发牌,发51张,最后3张作为底牌
        // 发51张牌给三个玩家 List Set, List可重复:可以放好几张一样的牌,有序:可以打乱顺序,有索引:可以根据索引取第几张牌,打出去
        ArrayList<Card> lingHuChong = new ArrayList<>();
        ArrayList<Card> jiuMoZhi = new ArrayList<>();
        ArrayList<Card> renYingYing = new ArrayList<>();

        // 遍历这51张牌,给这三个玩家发牌
        for (int i = 0; i < allCards.size() - 3; i++) {
            // 轮询发牌:第0张:令狐冲,第1张:鸠摩智,第2张:任盈盈,第3张:令狐冲
            Card card = allCards.get(i);
            if (i % 3 == 0) {
                lingHuChong.add(card);
            } else if (i % 3 == 1) {
                jiuMoZhi.add(card);
            } else if (i % 3 == 2) {
                renYingYing.add(card);
            }
        }


        // 3、排序
        sort(lingHuChong);
        sort(jiuMoZhi);
        sort(renYingYing);

        // 4、看牌
        System.out.println("令狐冲:" + lingHuChong);
        System.out.println("鸠摩智:" + jiuMoZhi);
        System.out.println("任盈盈:" + renYingYing);

        // 抢地主:加入令狐冲抢到了地主
        // 把三张底牌发给令狐冲
        List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size());
        lingHuChong.addAll(lastThreeCards);
        System.out.println("令狐冲:" + lingHuChong);
    }

    private void sort(List<Card> cards) {
        Collections.sort(cards, new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                return o1.getSize() - o2.getSize();
            }
        });
    }
}

  • 房间类
package com.itheima.d3_collection_test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Room { // 房间类
    // 房间里必须有一副牌
    private List<Card> allCards = new ArrayList<>();

    public Room() {
        // 准备一副牌
        // 1、点色
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        // 2、花色
        String[] colors = {"♠", "♥", "♣", "♦"};
        int size = 0; // 表示牌的大小
        // 3、把这些牌做好,存入allCards集合中
        for (int i = 0; i < numbers.length; i++) {
          size++;
            // 遍历花色 ,让点数和花色组合
            for (int j = 0; j < colors.length; j++) {
                Card card = new Card(numbers[i], colors[j], size);
                allCards.add(card);
            }
        }
        // 4、存入最后大小王
        allCards.add(new Card("", "🃏", ++size));
        allCards.add(new Card("", "👲", ++size));
        System.out.println("新牌:" + allCards);


        // 启动游戏,开始洗牌,发牌,排序,看牌
        start();
    }

    private void start() {
        // 1、洗牌
        Collections.shuffle(allCards);
        System.out.println("洗牌后:" + allCards);

        // 2、发牌,发51张,最后3张作为底牌
        // 发51张牌给三个玩家 List Set, List可重复:可以放好几张一样的牌,有序:可以打乱顺序,有索引:可以根据索引取第几张牌,打出去
        ArrayList<Card> lingHuChong = new ArrayList<>();
        ArrayList<Card> jiuMoZhi = new ArrayList<>();
        ArrayList<Card> renYingYing = new ArrayList<>();

        // 遍历这51张牌,给这三个玩家发牌
        for (int i = 0; i < allCards.size() - 3; i++) {
            // 轮询发牌:第0张:令狐冲,第1张:鸠摩智,第2张:任盈盈,第3张:令狐冲
            Card card = allCards.get(i);
            if (i % 3 == 0) {
                lingHuChong.add(card);
            } else if (i % 3 == 1) {
                jiuMoZhi.add(card);
            } else if (i % 3 == 2) {
                renYingYing.add(card);
            }
        }


        // 3、排序
        sort(lingHuChong);
        sort(jiuMoZhi);
        sort(renYingYing);

        // 4、看牌
        System.out.println("令狐冲:" + lingHuChong);
        System.out.println("鸠摩智:" + jiuMoZhi);
        System.out.println("任盈盈:" + renYingYing);

        // 抢地主:加入令狐冲抢到了地主
        // 把三张底牌发给令狐冲
        List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size());
        lingHuChong.addAll(lastThreeCards);
        System.out.println("令狐冲:" + lingHuChong);
    }

    private void sort(List<Card> cards) {
        Collections.sort(cards, new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                return o1.getSize() - o2.getSize();
            }
        });
    }
}

  • 测试类:
package com.itheima.d3_collection_test;

/**
 * 目标:完成斗地主游戏案例的开发
 * 分析业务需求:
 * 总共有54张牌
 * 点数: "3","4","5","6","7","8","9","10","J","Q","K","A","2“
 * 花色: "♠", "♥", "♣", "♦“
 * 大小王: "👲" , "🃏“
 * 斗地主:发出51张牌,剩下3张做为底牌。
 * <p>
 * 实现思路:
 * 在启动房间的时候,应该提前准备好一副牌
 * 然后洗牌,发牌,对牌排序,看牌
 */
public class GameDemo {
    public static void main(String[] args) {
        // 1、启动房间,准备一副牌
        Room room = new Room();

        // 2、启动游戏,开始洗牌,发牌,排序,发牌,等一系列操作

    }


}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值