2016-02-25 84 views
0

該程序的目的是生成由句點(。)組成的二維網格數組。用戶指定以'A'標記的「步行者」的起始點,然後步行者將生成0-3的數字以表示四個基本方向。它會隨着這些隨機的方向移動,同時每增加一個字母,它就會離開它,直到它跑到牆上並被「逮住」或達到「使它回家」的「Z」。如果它跑到一個已經去過的地方,它必須沿相同的方向向前跳,直到它到達一個空的空間或撞到牆上。2D網格移動檢查

我現在的問題是,我已經在櫃檯上確認它沒有運行過'Z',並且如果它達到那個點就會「回家」。但即使它已經在避免覆蓋已經存在的移動在櫃檯上註冊(它們不應該是),所以即使它還沒有擊中Z,其返回也是如此,並且它也仍然呼叫我隨機數發生器,因此它在嘗試自我修正時不會保持相同的方向。它似乎偶爾甚至跳過空的空間。

的問題是在處理()

package walktester; 

import java.lang.Math; 
import java.util.Random; 
import java.util.Scanner; 

class DrunkWalker { 
    private char[][] walkgrid = new char[10][10]; 
    private static int randNSEW; 
    private int randomnum; 
    private int startrow; 
    private int startcol; 
    private char alpha = 'A'; 
    private int nextrow; 
    private int nextcol; 

    public DrunkWalker(int r, int c) { 
     startrow = r; 
     startcol = c; 
     nextrow = startrow; 
     nextcol = startcol; 

     for (int i = 0; i < 10; i ++) { 
      for (int j = 0; j < 10; j++) 
       walkgrid[i][j] = '.'; 
     } 
     walkgrid[r][c] = alpha++; 
    } 

    public static void getRand(){ 
     int x100 = 0; 
     double randomNum = 0.0; 
     randomNum = Math.random(); 
     x100 = (int) (randomNum * 100); 
     randNSEW = x100 % 4; 
    } 

    public int getNextRow(){ 
     return nextrow; 
    } 

    public int getNextCol(){ 
     return nextcol; 
    } 

    public boolean processing(){ 
    for(int i = 1; i < 26; i ++){ 
     getRand(); 
     if(randNSEW == 0){ 
      nextcol--; 
     } 
     if(randNSEW == 1){ 
      nextrow++; 
     } 
     if(randNSEW == 2){ 
      nextcol++; 
     } 
     if(randNSEW == 3){ 
      nextrow--; 
     } 

     if(nextrow < 0 || nextrow >= 10 || nextcol < 0 || nextcol >= 10) { 
      return false; 
     } 
     if(randNSEW == 0 && walkgrid[nextrow][nextcol] != '.'){ 
      nextcol--; 
      continue; 
     } 
     if(randNSEW == 1 && walkgrid[nextrow][nextcol] != '.'){ 
      nextrow++; 
      continue; 
     } 
     if(randNSEW == 2 && walkgrid[nextrow][nextcol] != '.'){ 
      nextcol++; 
      continue; 
     } 
     if(randNSEW == 3 && walkgrid[nextrow][nextcol] != '.'){ 
      nextrow--; 
      continue; 
     } 

     walkgrid[nextrow][nextcol] = alpha++; 
    } 
    return true; 
} 




    public char[][] DisplayGrid() { 
    for(int y = 0; y < 10; y++) { 
     for(int x = 0; x < 10; x++) { 
      System.out.print(walkgrid[x][y] + " "); 
     } 
     System.out.println(); 
    } 
    return walkgrid; 
} 
} 

public class WalkTester { 

    public static void main(String[] args) { 
     Scanner inpr = new Scanner(System.in); 
     Scanner inpc = new Scanner(System.in); 
     Scanner inpchoice = new Scanner(System.in); 

     int r = 0; 
     int c = 0; 
     char choice = 'y'; 

     while(choice == 'y' || choice == 'Y') { 
      System.out.println("Please enter x coordinate between 1 and 10."); 
      r = inpr.nextInt(); 
      r = r - 1; 

      System.out.println("Please enter y coordinate between 1 and 10"); 
      c = inpr.nextInt(); 
      c = c - 1; 

      if(r < 0 || r > 9 || c < 0 || c > 9){ 
       System.out.println("Invalid Entry. Restart? y/n"); 
       choice = inpchoice.next().charAt(0); 
       if(choice == 'y' || choice == 'Y'){ 
        continue; 
       } 
       else if(choice == 'n' || choice == 'N'){ 
        return; 
       } 
       else{ 
        System.out.println("Invalid Entry. Restart? y/n"); 
        choice = inpchoice.next().charAt(0); 
       } 
      } 
      DrunkWalker drunkwalker = new DrunkWalker(r, c); 
      boolean walkerSucceeded = drunkwalker.processing(); 
      drunkwalker.DisplayGrid(); 
      if(walkerSucceeded) { 
      System.out.println("You made it home"); 
      } else { 
      System.out.println("You were arrested"); 
      } 

      System.out.println("Restart? y/n"); 
      choice = inpchoice.next().charAt(0); 
      if(choice == 'y' || choice == 'Y'){ 
       continue; 
      } 
      else if(choice == 'n' || choice == 'N'){ 
       return; 
      } 
      else{ 
       System.out.println("Invalid Entry. Restart? y/n"); 
       choice = inpchoice.next().charAt(0); 
      } 
     } 
    } 
} 

回答

0

下面的代碼解決您的問題。你基本上沒有「國家」區分有效的舉措,而是在過去的訪問點上「跳躍」。我儘量保持代碼儘可能接近您現有的代碼。

class DrunkWalker { 
    private char[][] walkgrid = new char[10][10]; 
    private static int randNSEW; 
    private int randomnum; 
    private int startrow; 
    private int startcol; 
    private char alpha = 'A'; 
    private int nextrow; 
    private int nextcol; 

    public DrunkWalker(int r, int c) { 
     startrow = r; 
     startcol = c; 
     nextrow = startrow; 
     nextcol = startcol; 

     for (int i = 0; i < 10; i ++) { 
      for (int j = 0; j < 10; j++) 
       walkgrid[i][j] = '.'; 
     } 
     walkgrid[r][c] = alpha++; 
    } 

    public static void getRand(){ 
     int x100 = 0; 
     double randomNum = 0.0; 
     randomNum = Math.random(); 
     x100 = (int) (randomNum * 100); 
     randNSEW = x100 % 4; 
    } 

    public int getNextRow(){ 
     return nextrow; 
    } 

    public int getNextCol(){ 
     return nextcol; 
    } 

    enum Mode {WALKING, CORRECTING}; 
    Mode mode = Mode.WALKING; 

    public boolean processing(){ 
    for(int i = 1; i < 26; i ++){ 

     if (mode == Mode.WALKING) { 
      getRand(); 
      if(randNSEW == 0){ 
       nextcol--; 
      } 
      if(randNSEW == 1){ 
       nextrow++; 
      } 
      if(randNSEW == 2){ 
       nextcol++; 
      } 
      if(randNSEW == 3){ 
       nextrow--; 
      } 
     } 

     if(nextrow < 0 || nextrow >= 10 || nextcol < 0 || nextcol >= 10) { 
      return false; 
     } 
     if(randNSEW == 0 && walkgrid[nextrow][nextcol] != '.'){ 
      i--; 
      nextcol--; 
      mode = Mode.CORRECTING; 
      continue; 
     } 
     if(randNSEW == 1 && walkgrid[nextrow][nextcol] != '.'){ 
      i--; 
      nextrow++; 
      mode = Mode.CORRECTING; 
      continue; 
     } 
     if(randNSEW == 2 && walkgrid[nextrow][nextcol] != '.'){ 
      i--; 
      nextcol++; 
      mode = Mode.CORRECTING; 
      continue; 
     } 
     if(randNSEW == 3 && walkgrid[nextrow][nextcol] != '.'){ 
      i--; 
      nextrow--; 
      mode = Mode.CORRECTING; 
      continue; 
     } 

     mode = Mode.WALKING; 
     walkgrid[nextrow][nextcol] = alpha++; 
    } 
    return true; 
} 
+0

繼續看看這篇文章對你有用;你能否認爲有用,或者如果你需要進一步的幫助,請告訴我。謝謝。 –