JavaEE项目之简单狼人杀
JAVASE项目之狼人杀
狼人杀规则介绍
12人局的一个游戏
平民阵营(好人阵营):4个平民
神职阵营(好人阵营):4个,分别是预言家,女巫,猎人,白痴
狼人阵营(狼人阵营):4个,4个狼人
2个大的阶段:黑夜阶段,白天阶段
黑夜阶段:(第一阶段)
- 4个狼人见面,共同去决定猎杀一名玩家,狼人的行为就结束了
- 神职阵营行动:
- 预言家行动:预言家会查验一个玩家的身份是好人还是狼人:查验3号,3号身份--女巫,查验的结果为好人,查验4号,4号身份--狼人,查验的结果就是狼人。
- .女巫:一局游戏一共有两瓶药,分别解药与毒药。当女巫有解药的时候,会告诉当天晚上谁被狼人袭击了,决定是否救这名玩家。
- 一旦解药被使用,就无法得知谁被杀了。在解药没有任何操作的时候,进行毒药的操作,选择一名玩家的序号,直接毒杀。一旦两瓶药都用完,晚上无任何操作。
- 女巫两瓶药都在,4号被猎杀了,提示:今晚4号死了,是否使用解药?1.救 2不救
eg: -->今天晚上女巫环节就结束了 2-->是否使用毒药?(给定序号) 10 -->10,4两个都死了
- 猎人:晚上无任何行动。当晚上他被狼人猎杀、放逐的时候,白天宣布死亡的那刻,他可以发动技能开枪带走一名玩家。
- 白痴:晚上无任何行动。当白天公投阶段被放逐出时,可以发动技能免除放逐。
- 平民阵营:无任何行动。
白天阶段:(第二阶段)
-
宣布死讯:公布死亡的玩家序号(不公布其身份),死亡的玩家发表遗言
-
随机指定剩下存活的人的序号,开始发言(3号发言之后,5号发言,6号...)
-
当所有人都发言完毕时候,所有玩家公投一名玩家进行放逐(死亡),如果他的身份是猎人或白痴的话,会发动技能(猎人是带走一名玩家,白痴免疫此次放逐)
黑夜-->白天-->交替进行 直到每个阶段阶段结束后,进行胜负判定
胜负判定:
当其中一方阵营全部死亡,即另一方阵营获胜。
好人获胜: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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?