项目描述
共计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();
}
}