2015-07-01 121 views
0

您好我正在嘗試在Java中構建一個小遊戲,但是我遇到了一些困難,我使用了一個多維數組並使用從0開始的數字填充它。 用戶選擇他們想要去的號碼,然後該號碼/單元格被應用到它,然後多維數組顯示在這裏是我的代碼(我是一個新手);多維數組遊戲 - Java

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| 
+3

好。你有什麼問題? – planetmaker

+2

你的問題不是,你說的地方。首先。班級名稱以upercase字母開頭。第二,不要在構造函數中完成你的完整邏輯。第三:將你的方法分成小塊。你的showMap方法完成所有工作。做一個showMap方法(只顯示地圖),一個set0ToSelectedValue方法(這樣做),依此類推。然後你可以遍歷你的方法(直到cancelCondition)。顯示 - set0 - 顯示 - set0 - 顯示 - set0 ...取消 – griFlo

回答

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。

+0

謝謝我愛你的方式,我真的很欣賞這一點。我一直在學習2個月的Java,想要挑戰我。謝謝 – dijam

+1

保持你的方法很小很重要,他們只應該完成一項任務。我不知道你爲什麼使用構造函數,但恕我直言,你不應該在構造函數中使用buisness邏輯。如果你想在構造時初始化你的對象,你可以考慮使用工廠方法。這本書「有效的java」可能會給你一些好的提示。 [codeReview](http://codereview.stackexchange.com/)上的人可以幫助你重構你的代碼。 – Rhayene