Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
1

Как узнать, является ли заданная шахматная фигура Королем?

15.04.2014, 01:34. Просмотров 667. Ответов 10
Метки нет (Все метки)

Есть класс Chessman (шахматная фигура). От нее наследуются классы фигур Pawn, King, Queen и тд. Есть доска - двумерный массив из Chessman-ов.
Вопрос: Как узнать, является ли данная фигура допустим Королем?
Пусть:
Brd - доска
Brd[x,y] - Нужный мне Chessman
kng - переменная типа King

Надо определить является ли фигура с координатами x,y королем.

Спасибо за внимание.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2014, 01:34
Ответы с готовыми решениями:

Проверить, является ли заданная фигура прямоугольником
У меня есть подобная задача но только для прямоугольника...Помогите написать программу именно для...

Выяснить, является ли заданная тремя точками фигура треугольником
вот еня заинтересовала така вот задачка, помогите ее решитть пользователь должен ввести координаты...

Шахматная фигура конь
Шахматная фигура конь ходит на 1 клетку по горизонтали и на 2 клетки по вертикали или наоборот на 2...

Определить сможет ли шахматная фигура съесть пешку по ее координатам
Помогите пожалуйста. Задачу не принимает. Пишет, что неправильный ответ на каком-то тесте. ...

10
2138 / 1275 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
15.04.2014, 01:48 2
лучше сделать перечисление с именами фигур . и каждому классу призначить свое перечисление. или дополнительное поле имени фигуры. ( с перечислениями просто удобнее)
а так чтобы узнать какой тип объекта юзаем - GetType()

Добавлено через 1 минуту
Цитата Сообщение от fenix117 Посмотреть сообщение
Надо определить является ли фигура с координатами x,y королем.
и кстати зачем ? у объекта только нужно поле которое задает внешнйи вид фигуре (ссылка на картинку например ) а все остальное разруливается с полиморфизмом
1
152 / 144 / 73
Регистрация: 03.03.2014
Сообщений: 368
15.04.2014, 03:40 3
fenix117, Я бы сделал так:
Классы Фигуры, Короля, Пешки и тд.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public enum Color
    {
        White, Black
    }
 
    public abstract class ChessFigure
    {
        public Color Color { get; set; }
        public bool isDead { get; set; }
        private int x;
        private int y;
        public int PositionX 
        { 
            get { return x; }
            set { if (value > 0 && value <= 8) x = value; }
        }
        public int PositionY 
        {
            get { return y; }
            set { if (value > 0 && value <= 8) y = value; }
        }
 
        protected ChessFigure(int x, int y, Color c)
        {
            PositionX = x;
            PositionY = y;
            isDead = false;
        }
 
    }
 
    public class Pawn:ChessFigure
    {
        public Pawn(int x, int y, Color c) : base(x,y,c){}
    }
 
    public class King:ChessFigure
    {
        public King(int x, int y, Color c) : base(x,y,c){}
    }
 
    public class Queen : ChessFigure
    {
        public Queen(int x, int y, Color c) : base(x,y,c){}
    }
 
    public class Bishop : ChessFigure
    {
        public Bishop(int x, int y, Color c) : base(x,y,c){}
    }
 
    public class Knight : ChessFigure
    {
        public Knight(int x, int y, Color c) : base(x, y, c){} 
    }
 
    public class Rook : ChessFigure
    {
        public Rook(int x, int y, Color c) : base(x,y,c){}
    }

Класс шахматной доски с требуемым методом
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class ChessBoard
    {
        public List<ChessFigure> Bundle { get; set; }
 
        public ChessBoard()
        {
            Bundle = new List<ChessFigure>();
 
            for (int i = 1; i < 9; i++)
            {
                Bundle.Add(new Pawn(i, 2, Color.White));
                Bundle.Add(new Pawn(i, 7, Color.Black));
            }
            
            Bundle.Add(new Rook(1, 1, Color.White));
            Bundle.Add(new Rook(8, 1, Color.White));
            Bundle.Add(new Rook(1, 8, Color.Black));
            Bundle.Add(new Rook(8, 8, Color.Black));
 
            Bundle.Add(new Knight(2, 1, Color.White));
            Bundle.Add(new Knight(7, 1, Color.White));
            Bundle.Add(new Knight(2, 8, Color.Black));
            Bundle.Add(new Knight(7, 8, Color.Black));
 
            Bundle.Add(new Bishop(3, 1, Color.White));
            Bundle.Add(new Bishop(6, 1, Color.White));
            Bundle.Add(new Bishop(3, 8, Color.Black));
            Bundle.Add(new Bishop(6, 8, Color.Black));
 
            Bundle.Add(new Queen(4, 1, Color.White));
            Bundle.Add(new Queen(4, 8, Color.Black));
 
            Bundle.Add(new King(5, 1, Color.White));
            Bundle.Add(new King(5, 8, Color.Black));
        }
 
        public bool isKing(int x, int y)
        {
            ChessFigure fig = (this.Bundle.Where(f => f.PositionX == x && f.PositionY == y)).FirstOrDefault();
            if (fig == null) return false;
            if (fig is King) return true;
            return false;
        }
 
    }

Проверка
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    class Program
    {
        static void Main(string[] args)
        {
            ChessBoard myBrd = new ChessBoard();
            
            Console.WriteLine(myBrd.isKing(4,5));
            Console.WriteLine(myBrd.isKing(1,1));
            Console.WriteLine(myBrd.isKing(5,1));
            Console.ReadLine();
 
        }
    }


Если лень разбираться в моем г-коде
C#
1
2
3
4
5
6
7
        public bool isKing(int x, int y)
        {
            ChessFigure fig = (this.Bundle.Where(f => f.PositionX == x && f.PositionY == y)).FirstOrDefault();
            if (fig == null) return false;
            if (fig is King) return true;
            return false;
        }
2
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
15.04.2014, 14:38  [ТС] 4
Цитата Сообщение от Metall_Version Посмотреть сообщение
а так чтобы узнать какой тип объекта юзаем - GetType()
С GetType у меня так ничего не получилось. Пытался делать так :
C#
1
Brd.GetChessman(XPos + 1, YPos - 1).GetType().Equals(new King(false))
Но он сравнивает базовый класс, то есть возвращает истину какая бы фигура не стояла на данном поле.
Думал что решил проблему сравнением картинки фигуры:
C#
1
Brd.GetChessman(XPos - 1, YPos - 1).GetImage() != Properties.Resources.King_B
Тоже не вышло
Сделал так:
В базовый класс фигуры добавил:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string Name;
 
        public Chessman(bool whcol)
        {
            WhiteColor = whcol;
        }
 
        public void SetName(string nm)
        {
            Name = nm;
        }
 
        public string GetName()
        {
            return Name;
        }
А в классы фигур в конструкторах определял Name:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public King(bool whcol)
            : base(whcol)
        {
            SetName("Король");
            if (whcol)
            {
                SetImage(Chess.Properties.Resources.King_W);
            }
            else
            {
                SetImage(Chess.Properties.Resources.King_B);
            }
        }
Добавлено через 5 минут
Цитата Сообщение от Not_Jon_Skeet Посмотреть сообщение
Если лень разбираться в моем г-коде
Это у меня г-код))
Эх, Мне бы почитать пару книг по ООП и шарпу, и я бы не создавал подобных тем...Какой же я ленивый
0
2138 / 1275 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
15.04.2014, 14:48 5
fenix117, сделайте дружественное имя ( в каждом классе ) файла который отвечает за отображение фигуры(имя картинки) .

это ж вы раньше тему создавали . я писал как лучше по оопешному сделать
1
459 / 420 / 117
Регистрация: 05.01.2010
Сообщений: 1,785
15.04.2014, 14:58 6
применительно к 1 сообщению... я может чего то путаю, но нельзя было разве сделать как-то так?
C#
1
if (item is King)
?
1
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
15.04.2014, 15:11  [ТС] 7
Цитата Сообщение от valera_21 Посмотреть сообщение
применительно к 1 сообщению... я может чего то путаю, но нельзя было разве сделать как-то так?
Блин, вот как то так я и хотел с самого начала написать, но я оставлю так как сделал
0
1053 / 860 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
15.04.2014, 15:16 8
fenix117, а зачем нам узнавать тип фигуры. у Chessman делаем виртуальные(абстрактные) методы, реальные фигуры загоняем в список(массив) Chessman и радуемся плюшкам ООП в виде полиморфизма(вызываем виртуальный(абстрактный) метод базового класса, а вместо него вызывается определенный перегруженный метод класса-наследника)
1
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
15.04.2014, 16:21  [ТС] 9
Цитата Сообщение от Learx Посмотреть сообщение
fenix117, а зачем нам узнавать тип фигуры. у Chessman делаем виртуальные(абстрактные) методы, реальные фигуры загоняем в список(массив) Chessman и радуемся плюшкам ООП в виде полиморфизма(вызываем виртуальный(абстрактный) метод базового класса, а вместо него вызывается определенный перегруженный метод класса-наследника)
По сути я так и делаю, просто для большинства фигур мне надо знать, можно ее бить или нельзя (а нельзя бить только короля).
0
459 / 420 / 117
Регистрация: 05.01.2010
Сообщений: 1,785
15.04.2014, 17:04 10
а вообще, что вы хотите сделать?
0
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
15.04.2014, 17:12  [ТС] 11
Цитата Сообщение от valera_21 Посмотреть сообщение
а вообще, что вы хотите сделать?
...шахматы)
если серьезно, не понял вопроса, проблему, описанную выше уже решил, всем огромное спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2014, 17:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Определить класс «Шахматная фигура» и производные классы «Ферзь»
Дело в том, что начал изучать ООП не так давно и тут попалась задачка, которая заинтересовала....

Определить, бьет ли одна шахматная фигура другую сейчас или на следующем ходу
Поле шахматной доски определяется парой натуральных чисел, каждое из которых не превосходит 8:...

Определить класс «Шахматная фигура» и унаследовать от него классы, соответствующие шахматным фигурам
Здравствуйте. Помогите реализовать алгоритм решения задачи. Определить класс «Шахматная фигура»...

Программа для нахождения количества шагов которых может сделать шахматная фигура конь
Задание: Разработать программу для нахождения количества шагов которых может сделать шахматная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.