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 @   ProsperousEnding  阅读(471)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
  1. 1 原来你也在这里 周笔畅
  2. 2 世间美好与你环环相扣 柏松
  3. 3 起风了 吴青峰
  4. 4 极恶都市 夏日入侵企划
  5. 5 所念皆星河 CMJ
  6. 6 所念皆星河-歌词版 房东的猫
  7. 7 卡农-钢琴版 dylanf
  8. 8 The truth that you leave Pianoboy高至豪
  9. 9 虹之间 米叔啊
起风了 - 吴青峰
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 米果

作曲 : 高橋優

编曲 : 刘胡轶/貢多杰

制作人 : 刘胡轶/吴青峰

配唱制作人 : 刘胡轶

乐器监制 : 刘胡轶

吉他 : 胡晨

贝斯 : 甯子达

弦乐录音棚 : 中国剧院录音棚

录音工程师 : 倪涵文/李游/李杨/邢铜/韩宽/李巍

录音监制 : 倪涵文/李游

混音&母带工作室 : OKmastering studio

混音&母带工程师 : 全相彦

制作协力 : 刘西洋

制作发行 : 智慧大狗 × 天才联盟

出品人 : 张葛

监制 : 崔恕/王明宇

弦乐监制 : 李朋

弦乐 : 国际首席爱乐乐团

鼓(打击乐):祁大为

和音编写&演唱:鱼椒盐

人声&吉他&鼓(打击乐)录音棚:55Tec studio

我曾将青春翻涌成她

我曾将青春翻涌成她

也曾指尖弹出盛夏

心之所动 且就随缘去吧

这一路上走走停停

这一路上走走停停

顺着少年漂流的痕迹

迈出车站的前一刻

竟有些犹豫

不禁笑这近乡情怯

不禁笑这近乡情怯

仍无可避免

而长野的天

依旧那么暖

风吹起了从前

从前初识这世间

从前初识这世间

万般流连

看着天边似在眼前

也甘愿赴汤蹈火去走它一遍

如今走过这世间

如今走过这世间

万般流连

翻过岁月不同侧脸

措不及防闯入你的笑颜

我曾难自拔于世界之大

我曾难自拔于世界之大

也沉溺于其中梦话

不得真假 不做挣扎 不惧笑话

我曾将青春翻涌成她

我曾将青春翻涌成她

也曾指尖弹出盛夏

心之所动 且就随缘去吧

逆着光行走 任风吹雨打

短短的路走走停停

短短的路走走停停

也有了几分的距离

不知抚摸的是故事 还是段心情

也许期待的不过是 与时间为敌

再次看到你

微凉晨光里

笑得很甜蜜

从前初识这世间

从前初识这世间

万般流连

看着天边似在眼前

也甘愿赴汤蹈火去走它一遍

如今走过这世间

如今走过这世间

万般流连

翻过岁月不同侧脸

措不及防闯入你的笑颜

我曾难自拔于世界之大

我曾难自拔于世界之大

也沉溺于其中梦话

不得真假 不做挣扎 不惧笑话

我曾将青春翻涌成她

我曾将青春翻涌成她

也曾指尖弹出盛夏

心之所动 且就随缘去吧

晚风吹起你鬓间的白发

晚风吹起你鬓间的白发

抚平回忆留下的疤

你的眼中 明暗交杂 一笑生花

我仍感叹于世界之大

我仍感叹于世界之大

也沉醉于儿时情话

不剩真假 不做挣扎 无谓笑话

我终将青春还给了她

连同指尖弹出的盛夏

心之所动 就随风去了

以爱之名 你还愿意吗

点击右上角即可分享
微信分享提示