Example #1
0
 //衝突判定
 static bool collision(Field[,] field, Point putAt, Size cardSize)
 {
     Size fieldSize = new Size(field.GetLength(0), field.GetLength(1));
     if (putAt.X > fieldSize.Width - cardSize.Width || putAt.Y > fieldSize.Height - cardSize.Height) return true;
     
     for (int x = 0; x < cardSize.Width; x++)
     {
         for (int y = 0; y < cardSize.Height; y++)
         {
             if (field[putAt.X + x, putAt.Y + y].group != -1)
             {
                 return true;
             }
         }
     }
     return false;
 }
Example #2
0
        /// <summary>
        /// コネクターに連結可能か判定
        /// card.TestCard==trueの場合はコネクターの属性を無視
        /// </summary>
        /// <param name="field"></param>
        /// <param name="putAt"></param>
        /// <param name="card"></param>
        /// <param name="mycardSize">回転に合わせたカードサイズ</param>
        /// <returns></returns>
        static bool canConnect(Field[,] field, Point putAt, Card card, Size mycardSize)
        {
            Size fieldSize = new Size(field.GetLength(0), field.GetLength(1));

            List<int> elems = card.elems;
            int turn = card.turn;
            for (int i = 0; i < 4; i++)
            {
                if (elems[i] == -1 && card.testCard == -1) continue;
                int sx, sy;
                switch ((i + turn) % 4)
                {
                    case 0:
                        sx = putAt.X + mycardSize.Width / 2 - 1;
                        sy = putAt.Y - 1;
                        if (sy < 0) continue;
                        connector_group = field[sx, sy].group;
                        if (card.testCard == -1 &&
                            field[sx, sy].connector == elems[i] &&
                            field[sx + 1, sy].connector == elems[i] ||
                            card.testCard != -1 &&
                            field[sx, sy].group == card.testCard &&//テストカード
                            field[sx + 1, sy].group == card.testCard &&
                            field[sx, sy].connector != -1 &&
                            field[sx + 1, sy].connector != -1)
                            return true;
                        break;
                    case 1:
                        sx = putAt.X + mycardSize.Width;
                        sy = putAt.Y + mycardSize.Height / 2;
                        if (sx >= fieldSize.Width) continue;
                        connector_group = field[sx, sy].group;
                        if (card.testCard == -1 &&
                            field[sx, sy].connector == elems[i] &&
                            field[sx, sy - 1].connector == elems[i] ||
                            card.testCard != -1 &&
                            field[sx, sy].group == card.testCard &&//テストカード
                            field[sx, sy - 1].group == card.testCard &&
                            field[sx, sy].connector != -1 &&
                            field[sx, sy - 1].connector != -1)
                            return true;
                        break;
                    case 2:
                        sx = putAt.X + mycardSize.Width / 2 - 1;
                        sy = putAt.Y + mycardSize.Height;
                        if (sy >= fieldSize.Height) continue;
                        connector_group = field[sx, sy].group;
                        if (card.testCard == -1 &&
                            field[sx, sy].connector == elems[i] &&
                            field[sx + 1, sy].connector == elems[i] ||
                            card.testCard != -1 &&
                            field[sx, sy].group == card.testCard &&//テストカード
                            field[sx + 1, sy].group == card.testCard &&
                            field[sx, sy].connector != -1 &&
                            field[sx + 1, sy].connector != -1)
                            return true;
                        break;
                    case 3:
                        sx = putAt.X - 1;
                        sy = putAt.Y + mycardSize.Height / 2 - 1;
                        if (sx < 0) continue;
                        connector_group = field[sx, sy].group;
                        if (card.testCard == -1 &&
                            field[sx, sy].connector == elems[i] &&
                            field[sx, sy + 1].connector == elems[i] ||
                            card.testCard != -1 &&
                            field[sx, sy].group == card.testCard &&//テストカード
                            field[sx, sy + 1].group == card.testCard &&
                            field[sx, sy].connector != -1 &&
                            field[sx, sy + 1].connector != -1)
                            return true;
                        break;
                }
            }
            return false;
        }
Example #3
0
        //配置可能判定
        public static bool canPut(Field[,] field, Point putAt, Card card, Size mycardSize, int now_Player, bool[] initiation, bool isJudge = false)
        {
            Size fieldSize = new Size(field.GetLength(0), field.GetLength(1));

            //衝突判定
            if (collision(field, putAt, mycardSize)) return false;

            //イニシエーション可能
            if (initiation[now_Player] && (now_Player % 2 == 0 && putAt.Y == fieldSize.Height - mycardSize.Height || now_Player % 2 == 1 && putAt.Y == 0))
            {
                if (!isJudge) initiation[now_Player] = false;
                connector_group = now_Player;
                return true;
            }

            //属性連結可能
            if (canConnect(field, putAt, card, mycardSize)) return true;

            return false;
        }