public void MapAdd(Point point, CaveCard cave) { if (caveCards[point.R, point.C].isEmpty() && IsValidPosition(point, cave)) { caveCards[point.R, point.C] = cave; } }
public bool IsValidPosition(Point point, CaveCard cave) { if (isValidated(point)) { return(IsRoadConnectedToStart(point, cave) && CanBeConntectedSurrounding(point, cave)); } else { return(false); } }
private void Attach(int X, int Y, CaveCard cave) { int row = Y / cardHeight; int col = X / cardWidth; field.MapAdd(new MapLibrary.Point(row, col), cave); DeleteImage(this.selectedPic); //this.selectedPic.Left = X; //this.selectedPic.Top = Y; }
public Game() { InitializeComponent(); InitializeIcons(); for (int i = 0; i < CONST.MAP_ROW; i++) { for (int j = 0; j < CONST.MAP_COL; j++) { prevMap[i, j] = new CaveCard(); } } }
public bool IsRoadConnectedToStart(Point curPoint, CaveCard card) //목적지 포인트 { CaveCard copy = new CaveCard(card.getDir(), card.getIsConnected()); caveCards[curPoint.R, curPoint.C] = copy; caveCards[curPoint.R, curPoint.C].setIsConnected(true); int[] ctr = { 0, -1, 0, 1, 0 }; // LEFT, UP, RIGHT, DOWN Dir[] dir = { Dir.LEFT, Dir.UP, Dir.RIGHT, Dir.DOWN }; Dir[] dirOp = { Dir.RIGHT, Dir.DOWN, Dir.LEFT, Dir.UP }; Stack <Point> stack = new Stack <Point>(); visited = new bool[CONST.MAP_ROW, CONST.MAP_COL]; stack.Push(curPoint); while (stack.Count != 0) { Point visitedPoint = stack.Pop(); if (isStart(visitedPoint)) { caveCards[curPoint.R, curPoint.C] = new CaveCard(); return(true); } if (!caveCards[visitedPoint.R, visitedPoint.C].getIsConnected() || visited[visitedPoint.R, visitedPoint.C]) { continue; } visited[visitedPoint.R, visitedPoint.C] = true; for (int i = 0; i < ctr.Length - 1; i++) { int r = visitedPoint.R + ctr[i], c = visitedPoint.C + ctr[i + 1]; // 주변 좌표 Point watch = new Point(r, c); if (checkBoundary(watch) && (caveCards[visitedPoint.R, visitedPoint.C].getDir() & dir[i]) == dir[i] && (caveCards[watch.R, watch.C].getDir() & dirOp[i]) == dirOp[i]) { stack.Push(watch); } } } caveCards[curPoint.R, curPoint.C] = new CaveCard(); return(false); }
public void MapInit() { bool[] dest = { false, false, false }; Random rm = new Random(); Goal = rm.Next(0, 2); dest[Goal] = true; for (int i = 0; i < CONST.MAP_ROW; i++) { for (int j = 0; j < CONST.MAP_COL; j++) { if (i == 3 && j == 4) { caveCards[i, j] = new StartCard(); } else if (j == 12) { if (i == 1) { caveCards[i, j] = new DestCard(CardFace.BACK, false, dest[0]); } else if (i == 3) { caveCards[i, j] = new DestCard(CardFace.BACK, false, dest[1]); } else if (i == 5) { caveCards[i, j] = new DestCard(CardFace.BACK, false, dest[2]); } else { caveCards[i, j] = new CaveCard(); } } else { caveCards[i, j] = new CaveCard(); } } } }
private void DrawCardOnField() { CaveCard curCard = null; Point location = new Point(); for (int i = 0; i < CONST.MAP_ROW; i++) { for (int j = 0; j < CONST.MAP_COL; j++) { curCard = field.GetCard(i, j); if (prevMap[i, j] == curCard) { continue; } location = ConvertCoordsToLocation(i, j); // Draw Start Card if (curCard is StartCard) { AddImage(location, imgCards.Images[START_CARD_INDEX]); } // Draw Dest Card else if (curCard is DestCard) { DestCard dest = (DestCard)curCard; Image image; if (dest.face == CardFace.FRONT) { if (dest.getIsGoldCave()) { image = imgCards.Images["goal_gold.png"]; MessageBox.Show("금을 찾았습니다!\r\n광부 승!!"); } else { image = imgCards.Images["goal_stone_down_left.png"]; MessageBox.Show("돌입니다!\r\n다른 목적지를 방문해보세요."); } } else { image = imgCards.Images["goal_back.png"]; } AddImage(location, image); } // Draw Cave Card else { if (!curCard.isEmpty() && prevMap[i, j].isEmpty()) { Image curImage = GetCardImage(curCard); if (curImage != null) { AddImage(location, curImage); } } else if (curCard.isEmpty() && !prevMap[i, j].isEmpty()) { DeleteImage(i, j); } } prevMap[i, j].setDir(curCard.getDir()); prevMap[i, j].setIsConnected(curCard.getIsConnected()); prevMap[i, j].setType(curCard.getType()); prevMap[i, j].face = curCard.face; } } }
private Image GetCardImage(Card card) { if (card == null) { return(null); } // Card 뒷면 if (card.face == CardFace.BACK) { return(imgCards.Images[22]); } // Card 앞면 if (card is CaveCard) { CaveCard c = (CaveCard)card; return(DirToImage(c.getDir(), c.getIsConnected())); } else if (card is ActionCard) { if (card.getType() == CType.MAP) { return(imgCards.Images[15]); } else if (card.getType() == CType.ROCK_DOWN) { return(imgCards.Images[14]); } else if (card.getType() == CType.EQ_DESTRUCTION) { switch (((EquipmentCard)card).tool) { case Tool.CART: return(imgCards.Images[11]); case Tool.LATTERN: return(imgCards.Images[12]); case Tool.PICKAXE: return(imgCards.Images[13]); } } else if (card.getType() == CType.EQ_REPAIR) { switch (((EquipmentCard)card).tool) { case Tool.CART: return(imgCards.Images[16]); case Tool.LATTERN: return(imgCards.Images[17]); case Tool.LATTERNCART: return(imgCards.Images[18]); case Tool.PICKAXE: return(imgCards.Images[19]); case Tool.PICKCART: return(imgCards.Images[20]); case Tool.PICKLATTERN: return(imgCards.Images[21]); } } } return(null); }
// Release on Grid private bool ProcessGrid(Point gridPoint) { // is CaveCard if (this.selectedCard is CaveCard) { MapLibrary.Point coords; Attach(gridPoint, (CaveCard)this.selectedCard); RemoveFromHands(); coords = IsArrived(gridPoint); // if arrived at destcard if (coords != null) { field.GetCard(coords).face = CardFace.FRONT; } } // is RockDownCard else if (this.selectedCard is RockDownCard) { MapLibrary.Point coords = ConvertLocationToCoords(gridPoint); if (field.isValidated(coords) || field.GetCard(coords) is StartCard || field.GetCard(coords) is DestCard) { MoveToStartPosition(this.selectedPic); return(false); } else if (field.GetCard(coords) is CaveCard) { if (((CaveCard)field.GetCard(coords)).getDir() != Dir.NONE) { field.RockDown(coords); this.selectedCard.face = CardFace.FRONT; this.usedCard.Push(this.selectedCard); DeleteImage(coords.R, coords.C); DeleteImage(this.selectedPic); RemoveFromHands(); } else { MoveToStartPosition(selectedPic); return(false); } } } // is MapCard else if (this.selectedCard is MapCard) { MapLibrary.Point coords = ConvertLocationToCoords(gridPoint); CaveCard card = field.GetCard(coords); if (card is DestCard) { //string message = ((DestCard)card).getIsGoldCave() ? "금 카드입니다!" : "금 카드가 아닙니다!"; var image = ((DestCard)card).getIsGoldCave() ? Properties.Resources.goal_gold : Properties.Resources.goal_stone_down_left; // MessageBox.Show(message); var map = new MapForm(image); map.ShowDialog(); this.selectedCard.face = CardFace.FRONT; this.usedCard.Push(this.selectedCard); DeleteImage(this.selectedPic); RemoveFromHands(); } else { MoveToStartPosition(this.selectedPic); return(false); } } return(true); }
// override Attach() private void Attach(Point point, CaveCard cave) { Attach(point.X, point.Y, cave); }
public bool CanBeConntectedSurrounding(Point point, CaveCard cave) { bool isConnected = cave.getIsConnected(); int r = point.R, c = point.C; CaveCard watch; cave.setIsConnected(true); bool result = true; bool isolated = true; if (r > 0 && !caveCards[r - 1, c].isEmpty() && caveCards[r - 1, c].face == CardFace.FRONT) { watch = caveCards[r - 1, c]; isolated = false; if ((watch.getDir() & Dir.DOWN) == Dir.NONE) // [r - 1, c] no DOWN { result &= (cave.getDir() & Dir.UP) == Dir.NONE; // [r, c] no UP } else // [r - 1, c] DOWN { result &= (cave.getDir() & Dir.UP) == Dir.UP; // [r, c] UP } } if (c > 0 && !caveCards[r, c - 1].isEmpty() && caveCards[r, c - 1].face == CardFace.FRONT) { watch = caveCards[r, c - 1]; isolated = false; if ((watch.getDir() & Dir.RIGHT) == Dir.NONE) // [r, c - 1] no RIGHT { result &= (cave.getDir() & Dir.LEFT) == Dir.NONE; // [r, c] no LEFT } else // [r, c - 1] RIGHT { result &= (cave.getDir() & Dir.LEFT) == Dir.LEFT; // [r, c] LEFT } } if (r < CONST.MAP_ROW - 1 && !caveCards[r + 1, c].isEmpty() && caveCards[r + 1, c].face == CardFace.FRONT) { watch = caveCards[r + 1, c]; isolated = false; if ((watch.getDir() & Dir.UP) == Dir.NONE) // [r + 1, c] no UP { result &= (cave.getDir() & Dir.DOWN) == Dir.NONE; // [r, c] no DOWN } else // [r + 1, c] UP { result &= (cave.getDir() & Dir.DOWN) == Dir.DOWN; // [r, c] DOWN } } if (c < CONST.MAP_COL - 1 && !caveCards[r, c + 1].isEmpty() && caveCards[r, c + 1].face == CardFace.FRONT) { watch = caveCards[r, c + 1]; isolated = false; if ((watch.getDir() & Dir.LEFT) == Dir.NONE) // [r, c + 1] no LEFT { result &= (cave.getDir() & Dir.RIGHT) == Dir.NONE; // [r, c] no RIGHT } else // [r, c + 1] LEFT { result &= (cave.getDir() & Dir.RIGHT) == Dir.RIGHT; // [r, c] RIGHT } } cave.setIsConnected(isConnected); if (isolated) { return(false); } return(result); }