Java - 复杂程序中的二维数组索引操作

Tra*_*ton 6 java arrays indexing

在提出我的问题之前,我想先澄清一些事情.首先,我是Java和编程的新手.第二,这是我的第二篇文章,如果我做错了什么,请放轻松.最后,我想解释为什么我所做的是错误的,而不仅仅是在对这篇文章的任何回复中的粘贴解决方案.为了更好地理解这个问题,我将编写赋值信息,然后是给出的Driver类,然后是Driver类访问的类代码.

我的问题:

如何让我的'建筑'的左下角在我的2D阵列上为[0] [0]? 是一个for循环的例子,它可以将2D数组的左下角改为[0] [0],但我尝试将它实现到我的searchRoom方法中(其中玩家角色设置为myHidingPlaces索引)我可以' t my myPidingPlaces [0] [0]是我2D阵列的左下角.我相信我需要以某种方式使用for循环编辑toString方法,但我无法弄清楚我应该怎么做.

以下是作业:

您将设计一个类"LostPuppy.java",它代表在多层建筑物中丢失的小狗,每层楼的房间数量相同.在实例化(或创建)该类对象的过程中,每层楼的每个房间都将被初始化为空(为此目的,您将实际使用空间''字符),并且将选择一个随机房间,其中小狗丢失.为此,字符"P"将被放置在该随机位置.有关构造函数的更多详细信息如下所示.

这个类的一个对象被用作两个玩家的游戏,轮流搜索小狗,一次一个房间,直到发现不幸的小犬.该对象的实例化和搜索将由一个"驱动程序"程序执行,该程序已经提供给您,允许您只需要集中精力开发该类(驱动程序在文件"PuppyPlay.java"中)

字段(当然,所有字段都是私有的):

  • 一个名为myHidingPlaces的字符(char)数组.这代表建筑物,其中行是地板,列是每层楼的房间(这个建筑物有一个不寻常的编号系统;地板和房间都从零开始).

  • 两个整数将占据小狗丢失的地板和房间,名为myFloorLocation和myRoomLocation.

  • 一个名为myWinner的char,当玩家找到小狗时,它将被分配玩家的角色(驾驶员程序使用数字'1'和'2'来更清楚地区分玩家和小狗).

  • 名为myFound的布尔值,在找到小狗时设置为true.

构造函数:

  • 接收两个整数参数作为用户的输入,用于丢失小狗的建筑物的楼层数和房间数.

  • 构造函数将2D数组"myHidingPlaces"实例化为字符数组,其中第一个参数用于行(theFloors),第二个参数用作列(theRooms).

  • 初始化myHidingPlaces的单元格,每个单元格包含一个空格''(用单引号完成)

  • 使用第一个参数随机设置myFloorLocation(floor puppy is)
  • 使用第二个参数随机设置myRoomLocation(房间小狗在)
  • 将myHidingPlaces [myFloorLocation] [myRoomLocation]设置为char'P'
  • 将myWinner设置为单个空格
  • 将myFound设置为false

方法:

  • roomSearched已经收到要搜索的楼层和房间,如果房间已被搜索则返回true,否则返回false.

  • puppyLocation接收要搜索的楼层和房间,如果楼层和房间是小狗丢失的地方,则返回true,否则返回false.此方法不应更改任何字段.

  • indicesOK接收要搜索的楼层和房间,如果楼层和房间值在数组索引范围内,则返回true,否则返回false(用于检查这些索引在应用于数组时不会导致错误).

  • numberOfFloors返回建筑物中的楼层数(第一层从零开始).

  • numberOfRooms返回建筑物每层楼的房间数量(第一个房间从零开始,所有楼层都有相同数量的房间).

  • searchRoom接收要搜索的楼层和房间以及当前玩家(作为char类型),如果找到小狗则返回true,否则返回false.如果未找到小狗,searchRoom还会将收到的楼层和房间位置的myHidingPlaces数组设置为收到的玩家值('1'或'2')或者,当找到时,将myWinner字段设置为当前玩家并设置myFound为true.

  • toString显示当前的hidePlaces数组及其内容除了小狗的位置之外,小狗的位置一直隐藏,直到找到他/她将被调用的字符串(由驱动程序调用)并且发现小狗的玩家和'P'将会显示在同一个单元格中....

  • 现在,也许是toString输出的尴尬部分.通常,当显示2D数组时,[0] [0]单元格与矩阵一样显示在左上角.然而,因为小狗决定迷失在一个建筑而不是一个矩阵中,所以在第一层(第0行)显示在它上面的第二层,第二层,最后是顶层,这样会更具视觉感觉......在上面!要保存单词,请仔细查看下一页提供的示例运行.您的输出应该与示例运行的下一页中显示的内容相同.

这是驱动程序:

import java.util.Random;
import java.util.Scanner;

/**
 * This program is used as a driver program to play the game from the
 * class LostPuppy.  Not to be used for grading!
 *
 * A puppy is lost in a multi-floor building represented in the class 
 * LostPuppy.class.  Two players will take turns searching the building
 * by selecting a floor and a room where the puppy might be.
 *
 * @author David Schuessler
 * @version Spring 2015
 */

public class PuppyPlay
{
  /**
   * Driver program to play LostPuppy.
   *
   * @param theArgs may contain file names in an array of type String
   */
  public static void main(String[] theArgs)
  {
    Scanner s = new Scanner(System.in);
    LostPuppy game; 
    int totalFloors;
    int totalRooms;
    int floor;
    int room;
    char[] players = {'1', '2'};
    int playerIndex;
    boolean found = false;
    Random rand = new Random();

    do 
    {
      System.out.print("To find the puppy, we need to know:\n"
                       + "\tHow many floors are in the building\n"
                       + "\tHow many rooms are on the floors\n\n"
                       + "             Please enter the number of floors: ");
      totalFloors = s.nextInt();
      System.out.print("Please enter the number of rooms on the floors: ");
      totalRooms = s.nextInt();
      s.nextLine();    // Consume previous newline character    

      // Start the game: Create a LostPuppy object:
      game = new LostPuppy(totalFloors, totalRooms);

      // Pick starting player
      playerIndex = rand.nextInt(2);

      System.out.println("\nFloor and room numbers start at zero '0'");

      do 
      {

        do 
        {
          System.out.println("\nPlayer " + players[playerIndex]
                             + ", enter floor and room to search separated by a space: ");
          floor = s.nextInt();
          room = s.nextInt();

          //for testing, use random generation of floor and room
          //floor = rand.nextInt(totalFloors);
          //room = rand.nextInt(totalRooms);
        } while (!game.indicesOK(floor, room) 
                 || game.roomSearchedAlready(floor, room));


        found = game.searchRoom(floor, room, players[playerIndex]);
        playerIndex = (playerIndex + 1) % 2;
        System.out.println("\n[" + floor + "], [" + room + "]");
        System.out.println(game.toString());
        s.nextLine();
      } while (!found);

      playerIndex = (playerIndex + 1) % 2;
      System.out.println("Great job player " + players[playerIndex] +"!");
      System.out.println("Would you like to find another puppy [Y/N]? ");
    } 
    while (s.nextLine().equalsIgnoreCase("Y"));
  }
}
Run Code Online (Sandbox Code Playgroud)

最后,这是我的测试代码:

import java.util.Random;
import java.util.Scanner;

public class LostPuppy
{
   int value;
   char[][] myHidingPlaces;
   int myFloorLocation;
   int myRoomLocation;
   char myWinner;
   boolean myFound;
   Random random = new Random();

   public LostPuppy(int theFloors, int theRooms)
   {
      myHidingPlaces = new char[theFloors][theRooms];

      for (int i = theFloors - 1; i >= 0; i--)
      {
         for (int j = 0; j <= theRooms - 1; j++)
         {
            myHidingPlaces[i][j] = ' ';
         }
      }

      myFloorLocation = random.nextInt(theFloors);
      myRoomLocation = random.nextInt(theRooms);
      myHidingPlaces[myFloorLocation][myRoomLocation] = 'P';
      myWinner = ' ';
      myFound = false;  
   }
   public boolean roomSearchedAlready(int floor, int room)
   {
      return (myHidingPlaces[floor][room] == '1' || 
              myHidingPlaces[floor][room] == '2');
   }

   public boolean puppyLocation(int floor, int room)
   {
      return (myHidingPlaces[floor][room] == 'P');
   }

   public boolean indicesOK(int floor, int room)
   {
      return (floor <= myHidingPlaces.length && room <= myHidingPlaces[0].length);
   }

   public int numberOfFloors()
   {
      return myHidingPlaces.length - 1;
   }
   public int numberOfRooms()
   {
      return myHidingPlaces[0].length - 1;
   }

   public boolean searchRoom(int floor, int room, char player)
   {
      if (puppyLocation(floor, room))
      {
         myFound = true;
         myWinner = player;
         return true;
      }
      else
      {
         myHidingPlaces[floor][room] = player;
         return false;
      }
   }

   public String toString()
   {
      int rooms = myHidingPlaces[0].length;
      int floors = myHidingPlaces.length;

      System.out.print(" ");
      for (int x = 0; x < rooms; x++)
      {
         System.out.print("___");
      }

      for (int y = 0; y < rooms - 1; y++)
      {
         System.out.print("_");
      }
      System.out.print("\n");

      for (int r = 0; r < floors; r++)
      {
         System.out.print("| ");
         for (int c = 0; c < rooms; c++)
         {

            if (myHidingPlaces[r][c] == 'P' && myFound)
            {
               System.out.print("" + myWinner + "" + myHidingPlaces[r][c] + "| ");
            }
            else if (myHidingPlaces[r][c] == 'P' && !myFound)
            {
               System.out.print("  | ");
            }
            else
            {
               System.out.print(myHidingPlaces[r][c] + " | ");
            }

            //System.out.print(myHidingPlaces[r][c] + " | ");

         }
         System.out.print("\n");
         for (int i = 0; i < rooms; i++)
         {
            System.out.print("|___");
         }
         System.out.print("|\n");
      }
      return "";

   }

}
Run Code Online (Sandbox Code Playgroud)

Nik*_*yev 2

在 Java 中你无法创建一个反向数组,但你也不需要它。您需要像处理矩阵一样思考建筑物并对其进行操作。但是您需要将其颠倒打印。此外,您提供的链接不会更改数组中的位置,它只是从最后一个索引到第一个索引的数组遍历。

所以你需要颠倒打印数组,这非常简单。您需要更改toString方法中的一行,更改

for (int r = 0; r < floors; r++)
Run Code Online (Sandbox Code Playgroud)

for (int r = floors - 1; r >= 0; r--)
Run Code Online (Sandbox Code Playgroud)

你会得到正确的结果!

此外,在这种情况下,您不需要像您一样从最后一个到第一个填充数组(至少因为您用相同的值填充它)

for (int i = theFloors - 1; i >= 0; i--) {
    for (int j = 0; j <= theRooms - 1; j++) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做会更好(更好地阅读你的代码)

for (int i = 0; i < theFloors; i++) {
    for (int j = 0; j < theRooms; j++) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

正如@Dante所说,您还需要更正indicesOK方法,因为数组的最后一个索引是其length - 1,因此当您访问myHidingPlaces.length或元素时,将引发myHidingPlaces[i].length异常。ArrayIndexOutOfBoundsException

public boolean indicesOK(int floor, int room) {
    return (floor < myHidingPlaces.length && room < myHidingPlaces[0].length);
}
Run Code Online (Sandbox Code Playgroud)