//衝突判定 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; }
/// <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; }
//配置可能判定 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; }