Создать игру "Перебрось Мостик" - 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);
}
}