Цель - написать графические шахматы (без ИИ). С чего начать? - C#
Формулировка задачи:
Собственно, дано задание:
Игра Шахматы. Реализовать класс «Игровое поле», иерархию «Фигура»-«Конкретная фигура». Реализовать метод вывода фигуры на экран. Класс «Фигура» должен содержать виртуальную функцию проверки допустимости указанного хода, а классы для конкретных фигур – ее реализации с учетом правил выполнения ходов для каждого вида фигуры. Для класса «Игровое поле» определить методы запроса хода (поочередно для противников), выполнения хода, «съедания» фигуры противника, вывода сообщения о нахождении фигуры под боем, шахе и мате. Предусмотреть возможность сохранения и загрузки игры с помощью ввода/вывода в поток.
не знаю,элементарно, c чего начать... подскажите пожалуйста!
Решение задачи: «Цель - написать графические шахматы (без ИИ). С чего начать?»
textual
Листинг программы
using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication236 { public partial class Form1 : Form { public Form1() { InitializeComponent(); var field = new Field(); var pn = new FieldPanel {Field = field, Parent = this, Dock = DockStyle.Fill}; } } class Field { public Dictionary<Point, Figure> Figures = new Dictionary<Point, Figure>(); public List<Figure> DeadFigures = new List<Figure>(); public bool IsInside(Point pos) { if (pos.X < 0 || pos.X > 7 || pos.Y < 0 || pos.Y > 7) return false; return true; } public Field() { for (int i = 0; i < 8; i++) new Pawn(this, Player.White, new Point(i, 1)); for (int i = 0; i < 8; i++) new Pawn(this, Player.Black, new Point(i, 6)); } public Figure this[Point pos] { get { Figure res = null; Figures.TryGetValue(pos, out res); return res; } } } abstract class Figure { public Player Player { get; private set; } public Point Position { get; private set; } public bool IsAlive { get; set; } public abstract IEnumerable<Point> GetMovePositions(); public abstract IEnumerable<Point> GetAttackPositions(); public Field Field { get; private set; } public bool CanAttackPosition(Point pos) { foreach (var p in GetAttackPositions()) if (p == pos) return true; return false; } public Figure(Field field, Player player, Point pos) { IsAlive = true; Player = player; Position = pos; Field = field; field.Figures.Add(pos, this); } } class Pawn : Figure { public Pawn(Field field, Player player, Point pos): base(field, player, pos) { } public override IEnumerable<Point> GetMovePositions() { var dir = Player == Player.White ? 1 : -1; var step1 = new Point(Position.X, Position.Y + dir); if (Field.IsInside(step1) && Field[step1] == null) yield return step1; if((Position.X == 1 && Player == Player.White) || (Position.X == 6 && Player == Player.Black)) { var step2 = new Point(Position.X, Position.Y + 2 * dir); if (Field.IsInside(step2) && Field[step2] == null) yield return step2; } } public override IEnumerable<Point> GetAttackPositions() { var dir = Player == Player.White ? 1 : -1; var step1 = new Point(Position.X + 1, Position.Y + dir); if (Field.IsInside(step1)) yield return step1; var step2 = new Point(Position.X - 1, Position.Y + dir); if (Field.IsInside(step2)) yield return step2; } } class FieldPanel : UserControl { public Field Field { get; set; } public FieldPanel() { SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true); } protected override void OnPaint(PaintEventArgs e) { Render(e.Graphics); } public void Render(Graphics g) { var rect = ClientRectangle; rect.Inflate(-10, -10); var dX = rect.Width / 8f; var dY = rect.Height / 8f; //render field g.FillRectangle(Brushes.White, rect); g.DrawRectangle(Pens.Black, rect); for (int i = 0; i < 8*9; i++) { if (i % 2 == 0 || (i % 9) > 7) continue; var x = (i % 9) * dX; var y = (i / 9) * dY; g.FillRectangle(Brushes.Black, rect.Left + x, rect.Top + y, dX, dY); } //render figures foreach(var f in Field.Figures.Values) { var y = rect.Bottom - (f.Position.Y + 1)*dY; var x = rect.Left + f.Position.X*dX; g.DrawString(f.GetType().Name[0].ToString(), Font, f.Player == Player.White ? Brushes.Red : Brushes.Blue, new RectangleF(x, y, dX, dY), new StringFormat{Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center}); } } } enum Player { White, Black } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д