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