JavaEE项目之简单狼人杀

JAVASE项目之狼人杀

狼人杀规则介绍

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

黑夜阶段:(第一阶段)

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

白天阶段:(第二阶段)

  1. 宣布死讯:公布死亡的玩家序号(不公布其身份),死亡的玩家发表遗言

  2. 随机指定剩下存活的人的序号,开始发言(3号发言之后,5号发言,6号...)

  3. 当所有人都发言完毕时候,所有玩家公投一名玩家进行放逐(死亡),如果他的身份是猎人或白痴的话,会发动技能(猎人是带走一名玩家,白痴免疫此次放逐)

    黑夜-->白天-->交替进行 直到每个阶段阶段结束后,进行胜负判定

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

小习题

狼人杀,身份分配。
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;
    }
}
posted @ 2022-08-17 12:46  ProsperousEnding  阅读(596)  评论(0)    收藏  举报