Цель - написать графические шахматы (без ИИ). С чего начать? - 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
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5
Похожие ответы