2012-02-08 121 views
4

我正在使用10x10 2D陣列創建遊戲。玩家從左上角開始標記爲「P」,目標是讓玩家避開障礙物到達位於右下角的「T」的寶藏。讓玩家在2D陣列遊戲網格上移動

我會如何使用命令Up/Down/Left/Right讓玩家在網格中移動?

我會使用for循環來計算數組中的元素來指定移動嗎?

這是我到目前爲止有:

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

public class Adventure { 

public static void main(String[] args) { 
    char grid[][]= new char[10][10]; 
    Scanner move = new Scanner(System.in); 
    System.out.println("Here is the current game board:"); 
    System.out.println("-------------------------------"); 

    for(int i=0; i<grid.length; i++) {   
     for(int j=0; j<grid.length; j++) { 
      double random = Math.random(); 
      if(random <=.05) { 
       grid[i][j]='*'; 
      } 
      else if(random > .06 && random <= .15) { 
       grid[i][j]='X'; 
      } 
      else { 
       grid[i][j]='.'; 
      } 
      grid[0][0]='P'; 
      grid[9][9]='T'; 
      System.out.print(grid[i][j]); 
     } 
     System.out.println("");   
    }   
     System.out.print("Enter your move (U/D/L/R)>"); 
} 
} 

回答

2

你應該保持玩家的當前位置的軌跡,只是更新這些變量。如你所說,初始值應該是(0,0)。

int px = 0; 
int py = 0; 

時的舉動作出,更新相應的變量:

grid[px][py] = <empty cell>; 
switch (move) { 
    case 'u': py += 1; break; 
    case 'r': px += 1; break; 
    ... 
} 
grid[px][py] = 'P'; 
當然,你不應該只是更新的值的

「盲目」,你應該插入一些驗證邏輯遵循規則遊戲:

if (grid[px][py] != <obstacle>) 
    // update player coordinates... 
+0

是的我的壞,我沒有意識到他用董事會來存儲他們的立場,雖然我寧願將它們存儲在董事會。 – 2012-02-08 16:59:21

2

看起來你正在使用行排序,從你的電路板打印出來的方式來判斷。基於此,您需要執行以下操作:

  1. 首先,您需要將玩家的位置存儲在某處。現在它被硬編碼爲0,0。
  2. 其次,您需要閱讀玩家的舉動。這將不得不在一個循環中進行,在那裏你可以移動,檢查是否允許移動,執行移動並顯示結果。
  3. 第三,您需要能夠根據移動計算新位置。 Up意味着row -= 1。正確的意思是column += 1。等
  4. 鑑於新的座標,你需要確保移動是有效的。至少,你必須阻止他們走出董事會,但你也可以阻止他們進入有障礙物的廣場等。
  5. 一旦你知道這個舉動是有效的,你必須更新變量您正在存儲當前座標。
  6. 在循環結束時,您需要重新繪製板。

這就是它的基本要旨。現在你正在做的一切都在main(),這沒關係,但如果是我,我會開始將事情分成單獨的方法,如InitializeBoard(),GetNextMove(),CheckIfMoveIsValid(int r, int c)等等。這樣,main()就成爲您遊戲循環的高級視圖,並且不同操作的內容被劃分並更容易處理。這需要將諸如遊戲板之類的東西存儲到類變量中而不是局部變量中,這實際上使障礙物檢測等事情比現在更容易。

0

以上所有答案都很棒。這裏有一些建議,我會做:

取而代之的是焦炭二維數組的,我會做一個自定義的對象,如空間,並定義空間的二維陣列(例如,空間[] [])。這有幾個原因:

  1. 您可以通過各種方式(而不是一個字符)來定義空間。例如,Space [i] [j] .hasTreasure()可以返回一個布爾值,讓你知道你是否找到寶藏。
  2. 如果您想稍後添加功能,就像向Space類添加屬性一樣簡單。再一次,你並不侷限於這裏的一個角色。

對於你的動作問題,我還會推薦幾件事情。與redneckjedi對CheckIfMoveIsValid()方法的建議類似,我將傳遞網格並將方向作爲參數傳遞並返回一個布爾值。爲確保您不會遇到ArrayIndexOutOfBounds問題,我還建議在每邊添加一行/一列牆。我會將網格擴大到12x12,並在外面放置一條障礙塊。這將確保您無法跳出網格,因爲在有效的移動中打牆會始終返回「假」。