-5

我想創建一個名爲Quoridor的遊戲,其中一個Pawn必須到達另一側的董事會的Java類的方法。 Pawn類(一個座標)穿過9x9二維陣列,而Wall類(2個座標)放置在10x10二維陣列上。牆壁基本上放置在典當廣場之間。典當不能穿過牆壁或其他典當,我不知道如何用兩個二維陣列實現BFS。我是編程新手,想知道是否有人可以一步一步地告訴我如何創建這樣的方法。目前有一個Pawn和Wall類有必要的get和set方法。 enter code here多維二維數組廣度優先搜索Java

package Players.HaydenLindquist; 

import java.util.*; 

import Engine.Logger; 
import Interface.Coordinate; 
import Interface.PlayerModule; 
import Interface.PlayerMove; 

public class HaydenLindquist implements PlayerModule { 

    Coordinate newCoords; 
    Wall theWall; 
    private Logger logOut; 
    Pawn player; 
    Pawn opponent; 
    List<Wall> wallList; 
    List<Pawn> pawnList; 

    public int getID() 
    { 
     return player.getId(); 
    } 

    public Set<Coordinate> getNeighbors(Coordinate c) { 

     // Creates HashSet we will use to store neighbor tiles 
     Set<Coordinate> neighbor = new HashSet<Coordinate>(); 

     int x = c.getRow(); 
     int y = c.getCol(); 

     // Coordinates for the 4 adjacent spaces 
     Coordinate top = new Coordinate(x,y-1); 
     Coordinate bottom = new Coordinate(x,y+1); 
     Coordinate left = new Coordinate(x-1,y); 
     Coordinate right = new Coordinate(x+1,y); 

     if(x == 0) { 
      if(y == 0) { 
       if(! wallCheck(right)) 
        neighbor.add(right); 
       if(! wallCheck(bottom)) 
        neighbor.add(bottom); 
      } 
      else if(y == 8) { 
       if(! wallCheck(top)) 
        neighbor.add(top); 
       if(! wallCheck(right)) 
        neighbor.add(right); 
      } 
      else { 
       if(! wallCheck(top)) 
        neighbor.add(top); 
       if(! wallCheck(right)) 
        neighbor.add(right); 
       if(! wallCheck(bottom)) 
        neighbor.add(bottom); 
      } 
     } 

     else if(x == 8) { 
      if(y == 0) { 
       if(! wallCheck(left)) 
        neighbor.add(left); 
       if(! wallCheck(bottom)) 
        neighbor.add(bottom); 
      } 
      else if(y == 8) { 
       if(! wallCheck(top)) 
        neighbor.add(top); 
       if(! wallCheck(left)) 
        neighbor.add(left); 
      } 
      else { 
       if(! wallCheck(top)) 
        neighbor.add(top); 
       if(! wallCheck(left)) 
        neighbor.add(left); 
       if(! wallCheck(bottom)) 
        neighbor.add(bottom); 
      } 
     } 

     else if(y == 0) { 
      if(! wallCheck(right)) 
       neighbor.add(right); 
      if(! wallCheck(left)) 
       neighbor.add(left); 
      if(! wallCheck(bottom)) 
       neighbor.add(bottom); 
     } 

     else if(y == 8) { 
      if(! wallCheck(right)) 
       neighbor.add(right); 
      if(! wallCheck(left)) 
       neighbor.add(left); 
      if(! wallCheck(top)) 
       neighbor.add(top); 
     } 

     else { 
      if(! wallCheck(right)) 
       neighbor.add(right); 
      if(! wallCheck(left)) 
       neighbor.add(left); 
      if(! wallCheck(top)) 
       neighbor.add(top); 
      if(! wallCheck(bottom)) 
       neighbor.add(bottom); 
     }  
     return neighbor;   
    } 

    /** 
    * 
    */ 
    public Coordinate getPlayerLocation(int playerID) 
    {   
     if(playerID == player.getId()) 
     { 
      return(player.getLocation()); 
     } 
     else return(opponent.getLocation());   
    } 

    /** 
    * 
    */ 
    public Map<Integer, Coordinate> getPlayerLocations() { 

     // Creates HashMap of Integer, Coordinate type 
     HashMap<Integer, Coordinate> locations = new HashMap<Integer, Coordinate>(); 

     // Adds the ID and locations of the 2 players to the HashMap 
     locations.put(player.getId(), player.getLocation()); 
     locations.put(opponent.getId(), opponent.getLocation());  

     return locations; 
    } 


    /** 
    * 
    */ 
    public List<Coordinate> getShortestPath(Coordinate start, Coordinate end) 
    { 
     List<Coordinate> path = new ArrayList<Coordinate>(); 


     return null; 
    } 


    /** 
    * 
    */ 
    public int getWallsRemaining(int playerID) 
    {   
     if(playerID == player.getId()) 
     { 
      return(player.getWalls()); 
     } 
     else return(opponent.getWalls()); 
    } 


    /** 
    * 
    */ 
    public void init(Logger logger, int playerID, int numWalls, Map<Integer, Coordinate> playerHomes) 
    {   
     logOut = logger;   
     // Creates ArrayList used to store wall objects 
     wallList = new ArrayList<Wall>();   
     // Creates our two players and initializes them with data from engine 
     for (Integer i : (Set<Integer>) playerHomes.keySet()) 
     { 
      if (i == playerID) 
       player = new Pawn(playerID,numWalls,playerHomes.get(i)); 
      else 
      { 
       opponent = new Pawn(2,numWalls,playerHomes.get(i)); 
      } 
     } 
    } 

    public void lastMove(PlayerMove m) 
    {   
     // Check if m is a player move or wall placement 
     if(m.isMove()) 
     {    
      // Switch to differentiate between player 1 and 2. 
      // then updates the appropriate players location 
      switch(m.getPlayerId()) 
      {    
      case 1: 
       player.setLocation(m.getEnd()); 
       break; 

      case 2: 
       opponent.setLocation(m.getEnd()); 
       break; 
      } 
     }   
     else 
     {    
      switch(m.getPlayerId()) 
      {    
      case 1: 
       addWall(m.getStart(), m.getEnd()); 
       player.setWalls(player.getWalls() - 1); 
       break; 

      case 2: 
       addWall(m.getStart(), m.getEnd()); 
       opponent.setWalls(player.getWalls() - 1); 
       break; 
      }  
     } 
    } 


    /** 
    * 
    */ 
    public Set<PlayerMove> allPossibleMoves() 
    { 
     return null; 
    } 


    /** 
    * 
    */ 
    public PlayerMove move() 
    { 
     return null; 
    } 

    /** 
    * 
    * @param player 
    * @return 
    */ 


    /** 
    * 
    * 
    */ 
    public void playerInvalidated(int playerID) 
    { 

    } 

    /** 
    * Method that creates a new wall object and adds it to the wallList ArrayList 
    * 
    * @param start 
    * @param end 
    */ 
    public void addWall(Coordinate start, Coordinate end) 
    { 
     Wall w = new Wall(start,end); 
     wallList.add(w);     
    } 

    /** 
    * A check method to see if entered coordinate contains a section of a wall 
    * 
    * @param c 
    * @return 
    */ 
    public boolean wallCheck(Coordinate c) 
    { 
     // Iterates through wall objects in wallList 
     for(int i = 0; i < wallList.size(); i++) 
     {    
      // Check if any adjacent squares contain a section of a wall 
      if(wallList.get(i).isWall(c)) 
      { 
       return true; 
      } 
     }   
     return false;   
    } 
} 
+1

到目前爲止,您是否有任何代碼? – Joris

+0

我剛剛添加了我們的主類,在那裏我們有我們正在使用的shortestPath()方法。不知道如何解決它 –

回答

0

既然你已經從一個BFS,和的想法您決定表示與多維數組,你的董事會爲什麼不通過思考BFS如何映射到表示啓動你的董事會?

例如,你能寫出代碼來列出給定單元格的所有相鄰單元嗎?如果你能做到這一點,應該更容易看到如何實現BFS的其餘部分。

+0

我更新了我的帖子,並添加了我們的「主類」任何幫助將是驚人的 –