c#如何检查是否订购了件?

时间:2015-06-30 22:19:46

标签: c# xna

图片1。

properly ordered 2 pieces there can be 3 also

图片2。

if empty space is between pieces its wrong order

我制作了检查所有碎片是否在基础或目标中的方法,如果是,则返回true,现在我需要另一种方法。

如果它在图片1中相似。我需要将投掷数量更改为3,如果按照图片2的顺序进行排序,我只能允许1投掷。

我有4个goalPositions和4个PiecePositions,需要检查54-51路径位置是否正确排序(路径是55个字段0-54的数组),如果是,则返回true,如果不返回false。 / p>

我是C#的新手,从来没有机会使用订单检查。

我试图用3个int列表goalPositions(填充51,52,53,54个路径位置),piecePositions(用getPosition()方法填充片段位置)和piecesOnGoal(保留用于计算目标上的碎片)位置)。但没有运气。

我会添加一些代码。 Player类的一部分,用于检查目标或基础中的片段的列表和方法

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]);
        }                               
    }
}

感谢任何帮助。

1 个答案:

答案 0 :(得分: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)。但检查四件应该没问题。