【问题标题】:Multidimensional Array Game - Java多维数组游戏 - Java
【发布时间】:2015-07-01 11:40:18
【问题描述】:

您好,我正在尝试用 Java 构建一个小游戏,但是我遇到了一些困难,我正在使用多维数组并用从 0 开始的数字填充它。 用户选择他们想去的号码,然后该号码/单元格应用 00 ,然后这里显示多维数组是我的代码(我是菜鸟);

import java.util.*;
public class showMap{

    private int rows;
    private int columns;
    private int counter = 0;
    private int counter1 = 0;
    private int sp1;
    private int sp2;
    private int passedval = 0;

    public showMap(){
        System.out.println("Enter Height");
        Scanner input = new Scanner(System.in);
        int i = input.nextInt();

        System.out.println("Enter Width");
        int x = input.nextInt();

        showMap(createaMap(i,x));

        System.out.println("You Start At 0");
        System.out.println("Pick the number you want to go to");

        passedval = input.nextInt();

        //spliting(passedval);

        showMap(createaMap(i,x));


    }
    public int[][] createaMap(int x,int y){
        rows = x;
        columns = y;

        int[][] map = new int[rows][columns];

        return map;
    }


    public int[][] showMap(int[][] maps)
    {
    if(passedval == 0)
        {
            for(int x=0;x<rows;x++)
            {
                for(int y=0;y<columns;y++)
                {
                    maps[x][y] = counter;
                    counter++;
                }
            }
        }else
            {
                for(int q=0;q<rows;q++)
                {
                    for(int x=0;x<columns;x++)
                    { //PROBLEM HERE!

                        if(maps[q][x] == passedval)
                        {
                            maps[q][x]= 00;
                            sp1 = q;
                            sp2 = x;
                        }
                    }
                }
            }

            for(int q=0;q<rows;q++)
            {
                for(int x=0;x<columns;x++)
                {
                    System.out.printf("%-2d",maps[q][x]);
                    System.out.print("|");
                }
                System.out.println("");
            }

            return maps;
    }

}

想要它看起来像吗?

O|1|2|3|4|
5|6|7|8|9|

选择一个数字? - 1

O|00|2|3|4|
5|6|7|8|9|

【问题讨论】:

  • 很好。你有什么问题?
  • 你的问题不在你说的地方。首先。类名以大写字母开头。第二不要在构造函数中执行完整的逻辑。第三:把你的方法分成小块。您的 showMap 方法完成所有工作。制作一个 showMap 方法(只显示地图),一个 set0ToSelectedValue 方法(只做这个),等等。然后你可以循环你的方法(直到一个cancelCondition)。显示-设置0-显示-设置0-显示-设置0 ...取消

标签: java arrays multidimensional-array arraylist


【解决方案1】:

我首先将你的程序分解成小块:

首先创建地图:

private static MapData createMap( Scanner scanner )
{
    System.out.println( "Enter Height" );
    int rows = scanner.nextInt();

    System.out.println( "Enter Width" );
    int columns = scanner.nextInt();

    int[][] map = new int[rows][columns];
    MapData data = new MapData( rows, columns, map );
    return data;
}

MapData 是一个简单的存储对象:

public class MapData
{
    private int     mapRows;
    private int     mapColumns;
    private int[][] map;

    public MapData( int mapRows, int mapColumns, int[][] map )
    {
         this.mapRows = mapRows;
         this.mapColumns = mapColumns;
         this.map = map;
    }

    public int getMapRows()
    {
         return mapRows;
    }

    public int getMapColumns()
    {
        return mapColumns;
    }

    public int[][] getMap()
    {
        return map;
    }
}

然后你初始化它:

private static void initializeMap( MapData mapData )
{
    int rows = mapData.getMapRows();
    int columns = mapData.getMapColumns();
    int[][] map = mapData.getMap();

    int counter = 0;
    for ( int x = 0; x < rows; x++ )
    {
        for ( int y = 0; y < columns; y++ )
        {
             map[x][y] = counter;
             counter++;
        }
    }
}

如果您想采取措施,请更新您的地图:

private static void takeAStep( Scanner scanner, MapData mapData )
{
    System.out.println( "Pick the number you want to go to" );
    int steppedTile = scanner.nextInt();
    updateMap( mapData, steppedTile );
}

private static void updateMap( MapData mapData, int steppedTile )
{
    int rows = mapData.getMapRows();
    int columns = mapData.getMapColumns();
    int[][] map = mapData.getMap();

    for ( int q = 0; q < rows; q++ )
    {
        for ( int x = 0; x < columns; x++ )
        {
            if ( map[q][x] == steppedTile )
            {
                map[q][x] = 0;
            }
        }
   }
}

而你要绘制地图:

private static void drawMap( MapData mapData )
{
    int rows = mapData.getMapRows();
    int columns = mapData.getMapColumns();
    int[][] map = mapData.getMap();

    for ( int q = 0; q < rows; q++ )
    {
        for ( int x = 0; x < columns; x++ )
        {
            System.out.printf( "%-2d", map[q][x] );
            System.out.print( "|" );
        }
            System.out.println( "" );
    }
}

现在你可以按照你喜欢的顺序调用方法了:

public static void main( String[] args )
{
    Scanner scanner = new Scanner( System.in );
    MapData mapData = createMap( scanner );

    initializeMap( mapData );
    drawMap( mapData );
    System.out.println();
    System.out.println( "You Start At 0" );

    takeAStep( scanner, mapData );
    drawMap( mapData );
    System.out.println();

    takeAStep( scanner, mapData );
    drawMap( mapData );
}

由于程序是我得到以下输出:

Enter Height
2
Enter Width
4
0 |1 |2 |3 |
4 |5 |6 |7 |

You Start At 0
Pick the number you want to go to
2
0 |1 |0 |3 |
4 |5 |6 |7 |

Pick the number you want to go to
5
0 |1 |0 |3 |
4 |0 |6 |7 |

在我看来,你的逻辑很好。将代码分解为小模块有助于跟踪正在发生的事情。

如果您想打印“00”而不是 0 - 您可能需要考虑使用字符串数组而不是 int。

【讨论】:

  • 谢谢,我喜欢你的表达方式,我真的很感激。我已经学习 java 2 个月了,想要一些挑战我的东西。谢谢
  • 保持你的方法小很重要,它们应该只做一个单一的任务。我不确定您为什么像以前那样使用构造函数,但恕我直言,您不应该在构造函数中执行业务逻辑。如果你想在构造时初始化你的对象,你可以考虑使用工厂方法。 《有效的java》这本书可能会给你这部分很好的提示。 codeReview 上的人可能会帮助您重构代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多