JAVASE项目之狼人杀

狼人杀规则介绍

12人局的一个游戏
平民阵营(好人阵营):4个平民
神职阵营(好人阵营):4个,分别是预言家,女巫,猎人,白痴
狼人阵营(狼人阵营):4个,4个狼人
2个大的阶段:黑夜阶段,白天阶段

    黑夜阶段:(第一阶段)
    4个狼人见面,共同去决定猎杀一名玩家,狼人的行为就结束了
    神职阵营行动:
    1.预言家行动:预言家会查验一个玩家的身份是好人还是狼人
    查验3号,3号身份--女巫,查验的结果为好人,查验4号,4号身份--狼人,查验的结果就是狼人。
    2.女巫:一局游戏一共有两瓶药,分别解药与毒药。当女巫有解药的时候,会告诉当天晚上谁被狼人袭击了,决定是否救这名玩家。
    一旦解药被使用,就无法得知谁被杀了。在解药没有任何操作的时候,进行毒药的操作,选择一名玩家的序号,直接毒杀。一旦两瓶药都用完,晚上无任何操作。
    女巫两瓶药都在,4号被猎杀了,提示:今晚4号死了,是否使用解药?1.救 2不救
    1 -->今天晚上女巫环节就结束了 2-->是否使用毒药?(给定序号) 10 -->10,4两个都死了
    3.猎人:晚上无任何行动。当晚上他被狼人猎杀、放逐的时候,白天宣布死亡的那刻,他可以发动技能开枪带走一名玩家。
    4.白痴:晚上无任何行动。当白天公投阶段被放逐出时,可以发动技能免除放逐。
    平民阵营:无任何行动。

    白天阶段:(第二阶段)
    1.宣布死讯:公布死亡的玩家序号(不公布其身份),死亡的玩家发表遗言
    2.随机指定剩下存活的人的序号,开始发言(3号发言之后,5号发言,6号...)
    3.当所有人都发言完毕时候,所有玩家公投一名玩家进行放逐(死亡),如果他的身份是猎人或白痴的话,会发动技能(猎人是带走一名玩家,白痴免疫此次放逐)
    黑夜-->白天-->交替进行 直到每个阶段阶段结束后,进行胜负判定

    胜负判定:
    当其中一方阵营全部死亡,即另一方阵营获胜。
    好人获胜:4名狼人全都死了
    狼人获胜:4个神职死亡 或者 4个平民死亡 都算狼人获胜

小习题

  1. 狼人杀,身份分配。
    12人身份,3个阵营。分配身份。
    阵营:
    神民:预言家、女巫、猎人、白痴
    平民:4民
    狼人:4 狼人
    程序执行:
    1.分配身份
    2.退出
    点击分配身份,将12个身份随机分给12个用户,打印出来。
    例如:
    1.预言家 7.女巫
    2.平民 8.狼人
    3.猎人 9狼人
    4.狼人 10.平民
    5.白痴 11狼人
    6.平民 12.平民
    每次分配身份结果都随机

代码习题:

   IdentityArr = new String[]{"女巫", "平民", "平民", "平民", "平民", "狼人", "狼人", "狼人",
                "狼人", "猎人", "白痴", "预言家"};
        Collections.shuffle(Arrays.asList(IdentityArr));
        System.out.println(Arrays.toString(IdentityArr));

直接使用Collections.shuffle()方法进行打乱数组即可。

习题代码运行结果:

欢迎来到狼人杀
[平民, 狼人, 预言家, 平民, 女巫, 平民, 猎人, 白痴, 狼人, 平民, 狼人, 狼人]
玩家1的身份为:平民       玩家2的身份为:狼人       
玩家3的身份为:预言家       玩家4的身份为:平民       
玩家5的身份为:女巫       玩家6的身份为:平民       
玩家7的身份为:猎人       玩家8的身份为:白痴       
玩家9的身份为:狼人       玩家10的身份为:平民       
玩家11的身份为:狼人       玩家12的身份为:狼人       

狼人杀完整玩法代码展示:

/**
 * @author  ProsperousEnding
 * @date  ${2021.9.9}
 * @version 1.0
 */
public class Enter {
    static int wik;
    static String[] IdentityArr;
    static Scanner input = new Scanner(System.in);
    static boolean withAntidote = true;
    static boolean hasPoison = true;
    static boolean flag=true;
    public static void main(String[] args) {
        System.out.println("欢迎来到狼人杀");
            identity();
       while(flag) {
           int isvictory = isVictory();  //用于判断是否胜利
           if (isvictory == 1) {
               System.out.println("人类胜利");
               flag = false;
           } else if (isvictory == 2) {
               System.out.println("狼人胜利");
               flag = false;
           }

           int wok = wolfActionNight(); //wok表示被狼人杀的人
           predictorAction();
           int wik = witchAction(wok);//wik 表示被女巫杀的人
           deadSay(wok, wik);
           othersSay();
           banish();
           printArr(wok, wik);
       }
    }


    /**
     * 分配身份数组,打乱数组,随机分配
     */
    public static void identity() {
        IdentityArr = new String[]{"女巫", "平民", "平民", "平民", "平民", "狼人", "狼人", "狼人",
                "狼人", "猎人", "白痴", "预言家"};
        Collections.shuffle(Arrays.asList(IdentityArr));
        System.out.println(Arrays.toString(IdentityArr));
        int i = 1;
        for (String a : IdentityArr
        ) {
            if (i % 2 == 1) {
                System.out.print("玩家" + i + "的身份为:" + a + "       ");//i:0 a:1
                i++;
            } else {
                System.out.println("玩家" + i + "的身份为:" + a + "       ");
                i++;
            }
        }
//        String[] IDArr=Arrays.copyOf(IdentityArr,IdentityArr.length);
        for (int j = 0; j < IdentityArr.length; j++) {
            if (IdentityArr[j].equals("狼人")) {
                System.out.println("狼人" + (j + 1) + "睁眼   ");   //j+1=a
            }
        }
    }

    /**
     * 狼人行动
     *
     * @return
     */
    public static int wolfActionNight() {
        //狼人猎杀玩家
        boolean flag = true;
        int wok=-1;
        while (flag) {
            System.out.println("\n狼人请选择你们要猎杀的对象:");

           wok= Integer.parseInt(input.nextLine());
            if (wok < 13) {
                return wok;
            } else {
                System.out.println("输入错误,请重新输入");
                continue;
            }
        }
        return wok;

    }

    /**
     * 预言家行动
     *
     * @return
     */
    public static int predictorAction() {
        //预言家预言
        System.out.println("预言家请睁眼,选择您要预言的对象");
        int y = Integer.parseInt(input.nextLine());
        if (IdentityArr[y - 1].equals("狼人")) {
            System.out.println(y + "狼人");
        } else {
            System.out.println("好人");
        }
        return y;
    }

    /**
     * 女巫行动1
     *
     * @param wok
     * @return
     */
    public static int witchAction(int wok) {
        while (withAntidote || hasPoison) {
            System.out.println("天黑请闭眼,女巫请睁眼,");
            if (withAntidote) {
                System.out.println("今晚" + wok + "号死了");
                System.out.println("请问您是否使用解药 1.使用 2.不使用");
                int m = Integer.parseInt(input.nextLine());
                if (m ==1) {
                    withAntidote = false;
                    //用了解药后还能用毒药
//                    if (hasPoison) {
//                        System.out.println("请问您是否使用毒药 1.使用 2.不使用");
//                        int n = Integer.parseInt(input.nextLine());
//                        if (n == 1) {
//                            System.out.println("请选择您要毒杀的对象:");
//                            intwik = Integer.parseInt(input.nextLine());
//                            hasPoison = false;
//                            returnwik;
//                        } else {
                            System.out.println(wok+"号被救活了"+"女巫今晚行动结束");
//                            break;
//                        }
                    } else {
                    if (hasPoison) {
                        System.out.println("请问您是否使用毒药 1.使用 2.不使用");
                        int n = Integer.parseInt(input.nextLine());
                        if (n == 1) {
                            System.out.println("请选择您要毒杀的对象:");
                            int wik = Integer.parseInt(input.nextLine());
                            hasPoison = false;
                            return wik;
                        } else {
                            System.out.println("女巫今晚行动结束");
                            break;
                        }
                    }
                    break;
                }
            }
            break;
        }
        return wik;
    }

    /**
     * 死亡玩家发言
     */
    public static void deadSay(int wok, int wik) {
        System.out.println("天亮请睁眼");
        if (withAntidote==false) {
            System.out.println("平安夜");
        } else {
            System.out.println("玩家" + wok + "死亡");
            System.out.println("请死亡玩家"+wok+"发言");
            String d1Say = input.nextLine();
            IdentityArr[wok-1]="已死亡";
            if(wik>0) {
                System.out.println("玩家" +wik + "死亡");
                System.out.println("请死亡玩家"+wik+"发言");
                String d2Say = input.nextLine();
                IdentityArr[wik-1]="已死亡";
            }
        }
    }
    /**
     * 其他玩家发言
     */
    public static void othersSay() {
        System.out.println("请其他玩家发言");
        for(int i=0;i<IdentityArr.length;i++){
            if(IdentityArr[i]=="已死亡"){
                continue;
            }
            System.out.println("玩家" + (i+1) + "发言");
            String othersay = input.nextLine();
        }
        
    }
    /**
     * 投票放逐,猎人带走一个人,白痴免死
     */
    public  static int banish() {
        boolean flag = true;
        int b=-1;
        while (flag) {
            System.out.print("请玩家投票决定放逐的人是:");
             b = Integer.parseInt(input.nextLine());
            if (b < 13) {
                if(IdentityArr[b-1].equals("猎人")){
                    System.out.println("请选择您需要带走的人");
                   int z= Integer.parseInt(input.nextLine());
                    System.out.println(b+"号"+z+"号死亡");
                    IdentityArr[b]="已死亡";
                    IdentityArr[z]="已死亡";
                }else if(IdentityArr[b-1].equals("白痴")){
                    System.out.println("免疫死亡,无事发生");
                }else{
                    System.out.println(b+"号死亡");
                    IdentityArr[b-1]="已死亡";
                }
                return b;
            } else {
                System.out.println("输入错误,请重新输入");
                continue;
            }
        }
            return b;
    }

    /**
     * 打印数组
     */
    private static void printArr(int wok,int wik) {
        for(int i=0;i<IdentityArr.length;i++) {
            if (IdentityArr[i].equals("已死亡")){
                System.out.println("玩家"+(i+1)+"已出局");
            }else {
                if (i%2 == 1) {
                    System.out.println("玩家"+(i+1)+"的身份为"+IdentityArr[i]+"        ");
                }else {
                    System.out.print("玩家"+(i+1)+"的身份为"+IdentityArr[i]+"       ");
                }
            }
        }
    }

    /**
     * 判断输赢的方法
     */
    private static int isVictory(){
        int person = 0, wolf = 0, god = 0;
        for (int i = 0; i < IdentityArr.length; i++) {
            if (IdentityArr[i].equals("狼人")) {
                wolf++;
            } else if (IdentityArr[i].equals("平民")) {
                person++;
            } else
                god++;
        }
        if (wolf == 0) {
            return 1;}
        else if (person == 0) {
            return 2;}
        else if (god == 0) {
            return 2;}
        else
            return 0;
    }
}

本文为自主练习,不可商用,本文是通过写方法来构建狼人杀的规则,还可通过创建类来解决方法,只为提供思路,请各路大神指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值