Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно написать библиотеку классов БЕЛЫЙ КОРОЛЬ И К 
:(
    Опции темы
juliya18
Дата 8.12.2019, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 8.12.2019

Репутация: нет
Всего: нет



Уже несколько дней сижу над этим заданием и ничего не получется
В понедельник уже сдавать , а я никак не продвинулсь вперед
Может подскажете что-нибудь, пожалуйстта?
Помогите, пожалуста, разобраться
Нужно написать библиотеку классов

Уже создан класс конь и король

Нужно переделать 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;
        }
    }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1289 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.