Создать игру "Перебрось Мостик" - C#
Формулировка задачи:
⦁ Мостики
В ходе игры каждый из игроков старается построить мост с одного своего берега на другой (здесь берегами являются противоположные стороны квадратного поля). У Красного — красные берега и крестики в качестве камней, у Синего — синие берега и нолики. Игру можно начинать в любой точке поля. За один ход игрок может соединить два своих соседних камня вертикальным или горизонтальным мостиком. Красные и синие мосты пересекаться не должны. Выигрывает тот, кто построит непрерывный мост с одного своего берега на другой. Реализовать режим для двоих игроков на горячем стуле.
Решение задачи: «Создать игру "Перебрось Мостик"»
textual
Листинг программы
class GamePanel : UserControl { private Game game; public GamePanel() { SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true); } public void Build(Game game) { this.game = game; Invalidate(); } protected override void OnPaint(PaintEventArgs e) { if (game == null) return; e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; for(int x = 0; x < Game.BOARD_SIZE;x++) for(int y = 0; y < Game.BOARD_SIZE;y++) if (game[x, y] == Cell.Blue || game[x, y] == Cell.Red) { DrawPoint(e, x, y, game[x, y] == Cell.Blue ? Color.Blue : Color.Red, (game[x, y] == Cell.Blue) ^ (y % 2 == 0)); } if (hovered != null) { var x = hovered.Value.X; var y = hovered.Value.Y; DrawPoint(e, x, y, game.CurrentPlayer == Cell.Blue ? Color.LightBlue : Color.Coral, (game.CurrentPlayer == Cell.Blue) ^ (y%2 == 0)); } } private void DrawPoint(PaintEventArgs e, int x, int y, Color color, bool vertical) { using (var brush = new SolidBrush(color)) using (var pen = new Pen(color, 2)) { var pp = ToScreen(new Point(x, y)); if ((x + y)%2 == 1) e.Graphics.FillEllipse(brush, pp.X - 3, pp.Y - 3, 6, 6); else { if (vertical) e.Graphics.DrawLine(pen, pp.X, pp.Y - step, pp.X, pp.Y + step); else e.Graphics.DrawLine(pen, pp.X - step, pp.Y, pp.X + step, pp.Y); } } } private Point? hovered; protected override void OnMouseMove(MouseEventArgs e) { if (game.Winner != Cell.Empty) return; var p = ToClient(e.Location); if (game[p.X, p.Y] == Cell.Empty) hovered = p; else hovered = null; Invalidate(); } protected override void OnMouseDown(MouseEventArgs e) { if (hovered != null) { game.Move(hovered.Value.X, hovered.Value.Y); hovered = null; } Invalidate(); } private int padding = 5; private int step { get { return Math.Min((ClientSize.Width - padding*2)/(Game.BOARD_SIZE - 1), (ClientSize.Height - padding * 2) / (Game.BOARD_SIZE - 1)); } } Point ToClient(Point p) { return new Point((int)Math.Round(1f * (p.X - padding) / step), (int)Math.Round(1f * (p.Y - padding) / step)); } Point ToScreen(Point p) { return new Point(p.X * step + padding, p.Y * step + padding); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д