2015-06-30 4 views
0

Изображение 1.C# как проверить, заказаны ли куски?

properly ordered 2 pieces there can be 3 also

Изображение 2.

if empty space is between pieces its wrong order

Я сделал метод для проверки, если все части находятся в основании или цели, если да, то возвращает истину, теперь я нужен другой метод ,

Если это похоже на рисунке 1. Мне нужно изменить количество бросков на 3, если его заказать, как на картинке 2, я могу разрешить только 1 бросок.

У меня есть 4 цели и 4 штуки, и нужно проверить, правильно ли они упорядочены на них из 54-51 позиций пути (путь - массив из 55 полей 0-54), если да, верните true, если не вернете false.

Я новичок в C# никогда не имел возможности работать с проверкой заказа до сих пор.

Я пытался сделать это с помощью 3-х целых позиций цели (заполненных позициями 51,52,53,54 пути), штукОпозиции (заполнены позициями фигур с методом getPosition()) и piecesOnGoal (зарезервированы для подсчета фрагментов на цели). но не повезло с этим.

Я добавлю код. Часть класса игрока с тем, что списки и метод для проверки частей в цель или базу

class Player { 
    protected PieceSet[] pieces; 
    Color color; 
    int numberOfThrows; 
    Dice dice; 
    public List<int> goalPositions; 
    public List<int> piecePositions; 
    public List<int> piecesOnGoal; 


    public enum Color 
    { 
     Yellow, Green, Blue, Red 
    } 


    public Player(Color color) 
    { 
     int[] path = new int[55]; 
     this.color = color; 
     dice = new Dice(); 
     numberOfThrows = 3; 
     switch (color) 
     { 
      case Color.Yellow: 
       path = BoardHelper.getYellowPath(); 
       break; 
      case Color.Green: 
       path = BoardHelper.getGreenPath(); 
       break; 
      case Color.Blue: 
       path = BoardHelper.getBluePath(); 
       break; 
      case Color.Red: 
       path = BoardHelper.getRedPath(); 
       break; 
     } 
     pieces = new PieceSet[4]; 
     pieces[0] = new PieceSet(path, 0); 
     pieces[1] = new PieceSet(path, 1); 
     pieces[2] = new PieceSet(path, 2); 
     pieces[3] = new PieceSet(path, 3); 


     piecePositions = new List<int>(4); 
     piecePositions.Add(pieces[0].getPosition()); 
     piecePositions.Add(pieces[1].getPosition()); 
     piecePositions.Add(pieces[2].getPosition()); 
     piecePositions.Add(pieces[3].getPosition()); 


     goalPositions = new List<int>(4); 
     goalPositions.Add(51); 
     goalPositions.Add(52); 
     goalPositions.Add(53); 
     goalPositions.Add(54); 


     piecesOnGoal =new List<int>(); 
    } 

    public bool isAllPiecesInBaseOrGoal() 
    { 
     if ((pieces[0].getPosition() < 4 || pieces[0].getPosition() > 50) && 
      (pieces[1].getPosition() < 4 || pieces[1].getPosition() > 50) && 
      (pieces[2].getPosition() < 4 || pieces[2].getPosition() > 50) && 
      (pieces[3].getPosition() < 4 || pieces[3].getPosition() > 50)) 
      return true; 
     else 
      return false; 
    } 

И это, как я думал, чтобы решить мою проблему: Проверьте, если goalPositions содержит piecePositions. Если да, добавьте эту позицию в piecesOnGoal. Теперь мне нужно как-то проверить, заказаны ли эти piecesOnGoal. Если да, верните true. Если нет, то ложь.

Я открыт для любого предложения.

public bool isAllPiecesAreOrderedInGoal() 
{    
    for (int i = 0; i < 4; i++) 
    { 
     if (goalPositions.Contains(piecePositions[i])) 
     { 
      piecesOnGoal.Add(piecePositions[i]); 
     }        
    } 
} 

Любая помощь приветствуется.

+0

Почему бы не сделать класс плитки или объект, который будет обрабатывать подобные вещи? У вас может быть подкласс «Тип цели». Ваша плитка будет содержать объект, который был бы нулевым или Piece. –

+0

извините, я не знаю, как это сделать, я новичок в C# –

ответ

0

Я предлагаю метод, который проверяет, возможно ли какое-либо перемещение. Движение возможно, если есть части вне дома или целей, или если есть кусочки в воротах, которые имеют пустое место перед ними:

bool IsMovePossible() 
{ 
    // check every piece 
    for(int iPiece = 0; iPiece < 4; ++iPiece) 
    { 
     // if it is outside of home or goal, there is a possible move 
     if(piecePositions[iPiece] > 3 && piecePositions[iPiece] < goalPositions.First()) 
      return true; 
     // if it is in the goal, check the next position 
     if(piecePositions[iPiece] >= goalPositions.First() 
       && piecePositions[iPiece] < goalPositions.Last() 
       && !piecePositions.Any(p => p == piecePositions[iPiece] + 1)) 
      return true; 
    } 
    // we have found no piece with a possible move 
    return false; 
} 

Затем решите, как часто пользователь может бросить кости на основе этого возвращаемое значение метода. Обратите внимание, что последняя проверка (piecePositions.Any) может быть выполнена более эффективно, если вы поддерживаете инвертированную карту (т. Е. Для каждой позиции, храните какую часть в этой позиции). Но проверять четыре штуки должно быть хорошо.

+0

Я вижу, что первый, последний и любой метод в первый раз в моей жизни я получаю то, что 1. последнее. Можете ли вы объяснить мне, что делает эта часть кода .....! PiecePositions.Any (p => p == piecesPositions [iPiece] + 1) Мне нужно знать, как использовать его в моей игре ... если его не к большому количеству –

+0

, и если я могу сделать это с вашим кодом, его мой последний экзамен должен объяснить каждую часть кода: D –

+0

это ссылка на картинку с возможными комбинациями штукPositions [ссылка] (http: //s12.postimg .org/dahv0elil/Untitled.png) –

Смежные вопросы