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

C# c如何检查是否订购了零件?,c#,xna,C#,Xna,图1 图2 我做了一个方法来检查是否所有的棋子都在基础或目标中。如果是,它返回真的,现在我需要另一个方法 如果像图1所示。我需要将投掷次数改为3次,如果其顺序如图2所示,我只能允许1次投掷 我得到了4个目标位置和4个工件位置,需要检查工件是否从54-51路径位置正确排序。路径位置是由55个字段组成的数组0-54,如果是,则返回true,如果不是,则返回false 我是C的新手,到目前为止,我还没有机会进行订单检查 我试着用3个整数列表来完成这项工作,目标位置填充了51,52,53,54个路径位置

图1

图2

我做了一个方法来检查是否所有的棋子都在基础或目标中。如果是,它返回真的,现在我需要另一个方法

如果像图1所示。我需要将投掷次数改为3次,如果其顺序如图2所示,我只能允许1次投掷

我得到了4个目标位置和4个工件位置,需要检查工件是否从54-51路径位置正确排序。路径位置是由55个字段组成的数组0-54,如果是,则返回true,如果不是,则返回false

我是C的新手,到目前为止,我还没有机会进行订单检查

我试着用3个整数列表来完成这项工作,目标位置填充了51,52,53,54个路径位置,工件位置填充了工件位置,使用getPosition方法,工件位置保留用于计算目标位置上的工件。但那可不走运

我将添加一些代码。玩家类的一部分,具有检查球门或垒中棋子的列表和方法

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

非常感谢您的帮助。

我建议使用一种方法来检查是否可以移动。如果主场或球门外有棋子,或者球门内有棋子前面有空位,则可以移动:

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

然后,根据此方法的返回值决定用户掷骰子的频率。请注意,最后一次检查工件位置。如果您维护一个倒置的地图,则可以更有效地执行任何检查,即,对于每个位置,存储哪个工件在该位置。但是检查四个部分应该可以。

为什么不创建一个Tile类或一个对象来处理这类事情呢?您可以有一个Tile类型的子类目标。您的互动程序将包含一个对象,该对象将为null或一个片段。抱歉,我不知道如何执行该操作,我是第一次看到“第一个”、“最后一个”和“任何方法”的cI。在我的生活中,我第一次看到“第一个”、“最后一个”和“任何方法”我得到的是1。最后一个。你能解释一下这部分代码的作用吗!piecePositions.Anyp=>p==piecePositions[ipiee]+1我需要知道如何在我的游戏中使用它…如果不是很简单,如果我想用你的代码块做这件事,我的最后一次考试将需要解释代码的每一部分:数据这是到图像的链接,带有可能的分段位置组合。Any方法确定在你的情况下,分段位置数组中的任何元素是否满足给定谓词。谓词是p=>p==piecePositions[iPiece]+1部分,它实际上是一个函数。它接受它的参数并用符号p表示它,这是p=>部分。函数的结果是p==piecePositions[iPiece]+1。因此,如果工件p位于被检查工件I之前的位置,则函数返回true。如果有的话,现在的作品就不能移动了。希望我没弄错,因为英语不是我的母语。。。例如,如果piecePositions[0]当前位于路径上的51位置,则该函数不带!符号检查piecesPositions集合中的任何其他元素是否位于52位置,如果有,则返回true
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;
}