Уже несколько дней сижу над этим заданием и ничего не получется
В понедельник уже сдавать , а я никак не продвинулсь вперед
Может подскажете что-нибудь, пожалуйстта?
Помогите, пожалуста, разобраться
Нужно написать библиотеку классов
Уже создан класс конь и король
Нужно переделать Generate_Pos(генерация списка позиций которые получены при выполнении допустимых ходов в данной позиции) и Draw_position-отображение на экране данной позиции
для королей все прописано, а вот как написать ходы и позиции коня не знаю
ho_go нулевое значение, если ходит игрок, не нулевое - противник
list_pos предоставляет ссылки на список позиций , которые вытекают из данной
В другой программе будет построено дерево ходов
Код:
using Game;
using System;
using System.Collections;
using System.Drawing;
namespace Game
{
/// <summary>
/// Класс задания позиции в игре.
/// </summary>
public class Position
{
// константы, характерные для шахмат
private const int king = 1;
private const int horse = 2;
private const int white_color = 0;
private const int black_color = 1;
private const int board = 7;
public string namegame; //название игры –
//обязателен для всех
public int width, height; //ширина, высота
// огранич.макс. изображение позиции
public int cvet; //цвет того, кто
// делает ход в данной позиции
//--------------------------------------------------
ArrayList sp_figur; // список фигур – не
// обязателен для др.игр
// инструменты для вывода позиции на экран
private System.Drawing.Pen pen;
private System.Drawing.Brush brush;
private System.Drawing.Font font;
//-----------------------------------------------------------------
public Position() //обязательный метод
{
namegame = "Этюд: белые: король+слон; черные: король";
sp_figur = new ArrayList();
width = 80;
height = 50;
cvet = white_color;
pen = new System.Drawing.Pen(System.Drawing.Color.Black);
brush = System.Drawing.Brushes.Black;
font = new System.Drawing.Font("Arial", 8.0f,System.Drawing.FontStyle.Regular);
}
//-----------------------------------------------------------------
public void init() //обязательный метод
{
King king1 = new King();
King king2 = new King();
Horse horse_w = new Horse();
king1.init(3, 4, white_color,king);
king2.init(3, 7, black_color, king);
horse_w.init(3, 1, white_color, horse);
sp_figur.Add(king1);
sp_figur.Add(king2);
sp_figur.Add(horse_w);
//King wk, bk; //белый i черный король
// wk = new King();
// bk = new King();
// инициализация экземпляров классов
// wk.init(3, 0, white_color, king);
//// bk.init(3, 7, black_color, king);
//занесение в список фигур---------------
//sp_figur.Add(wk);
// sp_figur.Add(bk);
}
//---Генерация списка позиций следующего уровня-----------
public void Generate_Pos(int ho_go, ref ArrayList list_pos)
//обязательный метод
//переделаааать
{
list_pos.Clear();
ArrayList pos = this.sp_figur, posn;
ArrayList sp_pt = new ArrayList();
Position new_pos;
this.cvet = ho_go;
//главный цикл по фигурам----------------------
figura rf, rf1, rf2;
Point pt;
for (int i = 0; i < pos.Count; i++)
{
rf = (figura)pos[i];
if (rf.cvet != ho_go) continue;
sp_pt = rf.may_by_step(ho_go);
if (sp_pt == null) continue;
if (sp_pt.Count < 1) continue;
sp_pt = na_doske(sp_pt);
if (sp_pt.Count < 1) continue;
sp_pt = ne_zanato(sp_pt, pos);
if (sp_pt.Count < 1) continue;
for (int jj = 0; jj < pos.Count; jj++)
{
rf1 = (figura)pos[jj];
if (rf1.cvet == ho_go) continue;
if (i == jj) continue;
sp_pt = ne_pod_boem(sp_pt, rf1);
if (sp_pt.Count < 1) break;
}
for (int n = 0; n < pos.Count; n++)
{ rf2 = (figura)pos[n];
if (rf2.cvet == ho_go) continue;
}
//формирование позиций-------------------------------
for (int j = 0; j < sp_pt.Count; j++)
{
pt = (Point)sp_pt[j];
rf1 = new figura();
rf1.kod = rf.kod;
rf1.cvet = rf.cvet;
rf1.x = pt.X; rf1.y = pt.Y;
posn = new ArrayList();
for (int kk = 0; kk < pos.Count; kk++)
{
if (kk == i) posn.Add(rf1);
else posn.Add(pos[kk]);
}
new_pos = new Position();
new_pos.sp_figur = posn;
new_pos.width = this.width;
new_pos.height = this.height;
new_pos.cvet = 1 - ho_go;
list_pos.Add(new_pos);
}
}
}
//-----Отображение позиции на экране ----------------------------
public void Draw_position(int X, int Y,
System.Drawing.Graphics polotno)
// обязательный метод
//переделать
{
polotno.DrawRectangle(pen, X, Y, width, height);
figura fg;
string s;
int yy = Y;
for (int i = 0; i < sp_figur.Count; i++)
{
fg = (figura)sp_figur[i];
s = fg.x.ToString() + "; " + fg.y.ToString();
switch (fg.kod)
{
case king:
if (fg.cvet == white_color) s = "Б.король " + s;
else s = "Ч.король " + s;
break;
case horse:
s = "Конь " + s;
break;
}
polotno.DrawString(s, font, brush, (float)X, (float)yy);
yy += 16;
}
}
//----------Исключение из списка клеток с недоп. координатами -------
ArrayList na_doske(ArrayList sp_pt)
{
Point pt;
ArrayList new_sp = new ArrayList();
for (int j = 0; j < sp_pt.Count; j++)
{
pt = (Point)sp_pt[j];
if ((pt.X < 0) || (pt.X > board) || (pt.Y < 0) ||
(pt.Y > board)) continue;
new_sp.Add(pt);
}
return new_sp;
}
//--- Исключение из списка клеток, занятых фигурами--------
ArrayList ne_zanato(ArrayList sp_pt, ArrayList pos)
{
Point pt;
ArrayList new_sp = new ArrayList();
figura fg;
bool zan;
for (int j = 0; j < sp_pt.Count; j++)
{
pt = (Point)sp_pt[j];
zan = false;
for (int k = 0; k < pos.Count; k++)
{
fg = (figura)pos[k];
if ((pt.X == fg.x) && (pt.Y == fg.y))
{ zan = true; break; }
}
if (!zan) new_sp.Add(pt);
}
return new_sp;
}
//----- Исключение из списка клеток, находящихся под боем
ArrayList ne_pod_boem(ArrayList sp_pt, figura fig)
{
Point pt;
ArrayList new_sp = new ArrayList();
for (int j = 0; j < sp_pt.Count; j++)
{
pt = (Point)sp_pt[j];
if (fig.ne_pod_boem(pt.X, pt.Y)) new_sp.Add(pt);
}
return new_sp;
}
}
//-------------------------------------------------------------------
/// <summary>
/// Базовый класс шахматной фигуры.
/// </summary>
class figura
{
public int x, y, cvet, kod;
public void init(int nx, int ny, int ncvet, int nkod)
{
x = nx; y = ny; cvet = ncvet; kod = nkod;
}
public virtual ArrayList may_by_step(int cv)
{
return null;
}
public virtual bool ne_pod_boem(int xx, int yy)
{
return true;
}
}
//------------------------------------------------------------
/// <summary>
/// Summary description for King.
/// </summary>
class Horse : figura
{
int[] dx = {-2,-2,-1,-1,1,1,2,2 };
int[] dy = {-1,1,-2,2,-2,2,-1,1};
public Horse()
{
}
public override ArrayList may_by_step(int cv)
{
ArrayList sp_pos = new ArrayList();
if (this.cvet != cv) return sp_pos;
for (int i= 0; i < dx.Length; i++)
{
Point point = new Point(x + dx[i], y + dy[i]);
sp_pos.Add((object)point);
}
return sp_pos;
}
public override bool ne_pod_boem(int xx, int yy)
{
for (int i = 0; i < dx.Length; i++)
{
if (xx == x + dx[i] && yy == y + dy[i])
return false;
}
return true;
}
}
}
class King : figura
{
int[] dx = { -1, 0, 1, -1, 1, -1, 0, 1 };
int[] dy = { -1, -1, -1, 0, 0, 1, 1, 1 };
public King()
{
}
//-----генерация списка всех возможных ходов короля-------------
public override ArrayList may_by_step(int cv)
{
ArrayList sp_pos = new ArrayList();
if (this.cvet != cv) return sp_pos;
Point pt;
for (int i = 0; i < dx.Length; i++)
{
pt = new Point(x + dx[i], y + dy[i]);
sp_pos.Add(pt);
}
return sp_pos;
}
//---проверка что клетка(xx, yy) не находится под боем короля----- public override bool ne_pod_boem(int xx, int yy)
public override bool ne_pod_boem(int xx, int yy)
{
if ((System.Math.Abs(xx - x) <= 1) &&(System.Math.Abs(yy - y) <= 1)) return false;
return true;
}
}