Java狼人杀发牌

该文描述了一个狼人杀游戏的身份随机生成算法,根据玩家人数(12-18人)确定不同角色的配置,确保底牌不包含盗贼且最多一个狼人。程序使用Java实现,通过集合管理角色,随机抽牌分配给玩家和底牌,最后输出玩家手牌和底牌信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目描述

共计21张牌。在{村民,狼人,守护,预言家,猎人,丘比特,长老,盗贼,替罪羊,女巫}随机生成12-18个身份
(每个身份唯一,村民狼人除外)。有三张底牌,底牌必须不能出现盗贼身份。
玩家输入游戏人数:15
随机生成游戏人数配置:
游戏配置:12-18人(大于18人或者小于12人,输出超出游戏人数范围)
标准配置:
人数(狼,民,神)
18(5,7,5)人 5狼人 7村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1吹笛者 1盗贼 21张牌
17(5,6,6)人 5狼人 7村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼 20张牌
16(5,6,5)人 5狼人 6村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼 19张牌
15(5,5,5)人 5狼人 5村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼 18张牌
14(4,5,5)人 4狼人 5村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊1 盗贼 17张牌
13(4,5,4)人 4狼人 5村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 盗贼 16张牌
12(4,4,4)人 4狼人 4村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 盗贼 15张牌

盗贼是一个特殊身份:当某位玩家获得盗贼牌的时候,可以翻开底牌三张选择底牌中自己想要的身份(有狼人要选狼人)
要求:
1.底牌可以没有狼人,如果有,最多只能有一个狼人;
2.底牌不能有盗贼;
3.输出如下:
玩家手牌为:
{01:村民,02:丘比特,03:盗贼,… ,15:女巫}
盗贼底牌为:
{01:XX,02:XX ,03:XX}

解题思路

1.输入玩家人数
2.生成游戏人数配置
3.单独写出底牌的需求
4.输出发牌内容

代码

通过输入人数来确定应该有多少角色
nextInt():读取数值;


    public static void main(String[] args) {
        //1.输入人数
        Scanner scanner = new Scanner(System.in);
        int count = scanner.nextInt();
        if (count < 12 || count > 18){
            System.out.println("人数错误,无法游戏");
        }else {
            fapai(count);
        }
    

为什么用static:用static修饰方法,该方法可以不用创建对象就可以调用
为什么不用数组用集合 :输入人数不确定,数组值确定,用集合方便增加人数
List< String > 是集合不是泛型
注意:
因为底牌设置最多只有一个狼人,所以需要把剩下多余的狼人和盗贼牌放入发牌堆

//2.游戏配置
    public static void fapai(int count){
        List<String> list = new ArrayList<>();//所有可能是底牌的牌(只有一个狼人,没有盗贼)
        List<String> dipai = new ArrayList<>();
        List<String> player = new ArrayList<>();//发给玩家的牌
        //人数为12时
        if (count >= 12){
            for (int i = 0; i < 3; i++){
                player.add("狼人");
                list.add("村民");
            }
            list.add("狼人");
            list.add("村民");
            list.add("预言家");
            list.add("女巫");
            list.add("丘比特");
            list.add("守护");
            list.add("猎人");
            list.add("村长");
            player.add("盗贼");//底牌不能有盗贼
        }
        if (count >= 13){
            list.add("村民");
        }
        if (count >= 14){
            list.add("替罪羊");
        }
        if (count >= 15){
            player.add("狼人");
        }
        if (count >= 16){
            list.add("村民");
        }
        if (count >= 17){
            list.add("村民");
        }
        if (count == 18){
            list.add("吹笛人");
        }

Math.rodom随机数 [ 0~1)
random * 长度再向下取整(数组或集合的随机数
list.size:返回列表的个数

 //抽底牌
        for (int i = 0; i < 3; i++){
            //抽的范围 0 ~ list.size - 1
            int index = (int)Math.floor(Math.random() * list.size());
            String content = list.remove(index);
            dipai.add(content);
        }
player.addAll(list);//list剩下的移到player里
        Collections.shuffle(player);//洗player牌
        StringBuilder playerStr = new StringBuilder();
        StringBuilder dipaiStr = new StringBuilder();
        //加发牌序号
        for (int i =0 ; i < player.size() ; i++){
            playerStr.append(", ")
                    .append(getNum(i + 1))
                    .append(":")
                    .append(player.get(i));
        }
        //加底牌序号
        for (int i = 0; i < dipai.size();i++){
            dipaiStr.append(", ")
                    .append(getNum(i + 1))
                    .append(":")
                    .append(dipai.get(i));
        }
        //System.out.println(list);
        System.out.println("{" + playerStr.toString().substring(2) + "}");
        System.out.println("{" + dipaiStr.toString().substring(2) + "}");
    }
    //3.加序号
    public static String getNum(int num){
        StringBuilder builder = new StringBuilder();
        if (num < 10){
            builder.append("0");
        }
        builder.append(num);
        return builder.toString();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值