首页 > 解决方案 > 如何从布尔数组中“消除”每三个元素,直到只有 1 保留为“真”?

问题描述

我正在尝试为学校做一个挑战题(我是一个完整的初学者,所以请放轻松)。我需要重新创建游戏 Duck-Duck-Goose。我向用户询问玩家的数量,创建该特定数字的布尔数组,然后将它们全部设置为“真”。我正在尝试遍历一个布尔数组并逐渐将每三个元素变为“假”。一旦它到达数组的末尾,我希望它再次通过数组,重复相同的过程。我也很难将索引设置为下一个元素(因此,如果将第 3 个元素重置为“false”,则数组从第 4 个元素开始计数),然后再次循环遍历数组。目标是重复这个过程(将每个第 3 个元素变为“假”,直到只剩下一个元素为“真”

* 我仅限于使用布尔数组 *

这是我的代码:

    import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("Welcome to the game of Duck Duck Goose!!!");
System.out.println("Please enter the number of players:");
int players=scan.nextInt();
boolean [] game=new boolean[players];
for(int a=0;a<players;a++){ //set all players to 'true'
      game[a]=true;
  }
  if(players>=1){
    int turns=players-1;
      while(turns>=1){
        for(int i=0;i<players;i=i+3){
          if(game[i]=true){
          game[i]=false;
          turns--;
        }
      }
    }
  }
  else{ // if there is less than 1 player, end the program
    System.out.println("Try to get more players!");
    System.exit(0);
  }
System.out.println("YaaaaY");
for(int j=0;j<players;j++){
  if(game[j]==true){ // look through the array and declare the winner
    System.out.println("The "+j+" player won!");
    }
    }
    }
    }

当我运行它时,我得到以下输出:

*欢迎来到鸭鸭鹅游戏!!!

请输入玩家人数:

10(仅用于示例)

啊啊啊

1名玩家获胜!

2 人获胜!

4人赢了!

5人获胜!

7人赢了!

8 人获胜!*

我究竟做错了什么???如何使循环多次遍历数组并删除每个第三个元素?如何使循环不是每次都从开头开始,而是从“淘汰”玩家之后的索引开始?我不应该在 at 处使用循环吗?

我对此一无所知。任何帮助是极大的赞赏:)

标签: javaarraysloopsbooleaniteration

解决方案


在你的主要功能中帮助你有点困难。你学过单独的函数吗?静态变量呢?

假设您有一个函数 int nextActiveIndex(int currentIndex) { ... } 它将您的布尔数组视为一个圆圈,并会在数组中找到下一个 true,并在必要时循环。所以,如果数组有五个元素长,并且当前有

0: F
1: T
2: T
3: F
4: T

nextActiveIndex(1) 为 2,nextActiveIndex(2) 为 4,nextActiveIndex(4) 为 1。

因此,您的循环不是遍历您的数组,它只是循环您想要执行的步骤数(在您的示例中为 3 个步骤),然后您将该索引设置为 false。重复直到 nextActiveIndex 返回您传入的数字,因为这意味着它是唯一真正的左边。

您需要做的一件事是让您的 main 函数和 nextActiveIndex 函数都能够看到该数组。为此,您使数组成为类的静态成员,而不仅仅是在主函数中声明。

如果您还不知道静态成员变量,那么您必须将数组传递给 nextActiveIndex 以及当前索引。


推荐阅读