Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2022, 00:28   #1
Darklight
Пользователь
 
Регистрация: 08.07.2022
Сообщений: 29
По умолчанию Класс "Шахматы" C++

Тип «Позиция на шахматной доске» определить как класс, содержащий:
- закрытые поля с координатами точки, значения которых будут соответствовать нумерации
шахматного поля;
- все функции реализовать в соответствии с общими требованиями.
Тип «Фигура» определить как класс, содержащий:
- закрытые поля с позицией на шахматной доске соответствующего типа и реализовано в виде
символьной строки произвольной длины поле с названием цвета;
- предусмотреть функцию "ход" на одну позицию в одном из четырех направлений;
- остальные функции реализовать соответственно общим требованиям.
В тестовом примере создать объекты типа «Фигура» соответственно общим
требованиям и вывести информацию о них в полном и сокращенном виде.
Darklight вне форума Ответить с цитированием
Старый 08.07.2022, 01:08   #2
Darklight
Пользователь
 
Регистрация: 08.07.2022
Сообщений: 29
По умолчанию

Проблема с классом Queen

Код:
#include <iostream>
using namespace std;
enum coord1 { a, b, c, d, e, f, g, h };
enum  color { black, white };
class Figure
{
protected:
    coord1 letter;  //a..h
    int number; //1..8
    color colour;   //цвет
public:
    Figure(coord1 x, int y, color z)
    {
        letter = x;
        number = y;
        colour = z;
    }

    virtual int Turn(coord1 new_letter,int new_number) = 0;
};

class Castle : public virtual Figure {
public:
    int Turn(coord1 new_letter,int new_number) {
        if (((new_letter == letter) &&
            (new_number != number)) ||
            ((new_letter != letter) &&
                (new_number == number))) {
            letter = new_letter;
            number = new_number;
            return 1;
        }
        else return 0;
    }
};

class Bishop : public virtual Figure {
public:
    int Turn(coord1 new_letter,int new_number) {
        if ((abs((new_letter - letter) ==
            abs(new_number - number)) &&
            (new_letter != letter))) {
            letter = new_letter;
            number = new_number; return 1;
        }
        else return 0;
    }
};
class Queen : public Bishop, public Castle {
    int Queen::Turn(coord1 new_letter,int new_number) {
        if (Castle::Turn(coord1 new_letter, int new_number) != 0)
            return 1;
        else if (Bishop::Turn(coord1 new_letter, int new_number) != 0)
            return 1;
        else return 0;
    }
};

int main() {
    Queen q(e, 5, white);
    q.Turn(h, 8);
    system("pause");
    return 0;
}

Последний раз редактировалось BDA; 08.07.2022 в 04:05.
Darklight вне форума Ответить с цитированием
Старый 08.07.2022, 01:30   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
int Queen::Turn(coord1 new_letter,int new_number) { if ((letter != new_letter || number != new_number) && (new_letter == letter || new_number == number || abs(new_letter - letter) == abs(new_number - number))) {
    letter = new_letter;
    number = new_number;
    return 1;
  } else return 0;
}
macomics вне форума Ответить с цитированием
Старый 08.07.2022, 03:44   #4
Darklight
Пользователь
 
Регистрация: 08.07.2022
Сообщений: 29
По умолчанию

macomics,
Queen::Turn (использование полного имени в объявлении члена не допускается)
И в main тоже есть проблемы
Darklight вне форума Ответить с цитированием
Старый 08.07.2022, 08:56   #5
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,016
По умолчанию

Цитата:
Сообщение от Darklight Посмотреть сообщение
class Castle : public virtual Figure {
Цитата:
Сообщение от Darklight Посмотреть сообщение
class Bishop : public virtual Figure {
Цитата:
Сообщение от Darklight Посмотреть сообщение
class Queen : public FigureBishop, public Castle {
не вижу смысла делать виртуальное наследование (то есть, сильно усложнять всю систему) всего лишь из-за того, что ферзь сочетает ходы ладьи и слона. Убираем всю эту мишуру и просто прописываем ферзю свою ходилку

---
Цитата:
Сообщение от Darklight Посмотреть сообщение
protected:
coord1 letter; //a..h
int number; //1..8
Цитата:
Сообщение от Darklight Посмотреть сообщение
coord1 new_letter,int new_number
эту пару надлежит объединить в класс и прописать операторы и методы. Будет меньше лапши

------
Цитата:
Сообщение от Darklight Посмотреть сообщение
enum class coord1 { a, b, c, d, e, f, g, h };
enum class color { black, white };
енум нужно облагородить

Последний раз редактировалось Алексей1153; 08.07.2022 в 09:01.
Алексей1153 вне форума Ответить с цитированием
Старый 08.07.2022, 09:48   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Darklight Посмотреть сообщение
macomics,
Queen::Turn (использование полного имени в объявлении члена не допускается)
И в main тоже есть проблемы
Смысл сообщения не в тупом копировании текста. Зачем пытаться вызывать две функции, когда можно написать одно условие.
Зачем вообще так усложнять. Вы тут пытаетесь изобрести пятиколесный вертолет без пропеллера.

Для шахмат достаточно хранить массив в 64 байта. 1 бит описывает цвет клетки (0 - белая, 16 - черная), 1 бит описывает цвет фигуры (0 - белая, 8 - черная) и 3 бита описывают тип фигуры (0 - нет, 1 - пешка, 2 - слон, 3 - кобыла, 4 - офицер, 5 - ферзь и 6 - король). Даже остается 3 бита на всякие дополнительные фишки вроде выделения фигуры, подсветки клеток для возможного хода выделенной фигуры или индикатор перетаскивания фигуры.

Городить забор из классов - пустая трата памяти и времени.
macomics вне форума Ответить с цитированием
Старый 08.07.2022, 17:18   #7
Darklight
Пользователь
 
Регистрация: 08.07.2022
Сообщений: 29
По умолчанию

А не могли б вы подправить мне код? Я попытался его изменить как вы сказали. У меня не выходит получить решение(
Darklight вне форума Ответить с цитированием
Старый 11.07.2022, 18:12   #8
Darklight
Пользователь
 
Регистрация: 08.07.2022
Сообщений: 29
По умолчанию

Проблема в main подчеркнута
#define _USE_MATH_DEFINES
#include <iostream>
#include <iomanip>
#include <cmath>
#
using namespace std;
enum class coord { a, b, c, d, e, f, g, h };
enum class color { black, white };
class Figure
{
protected:
coord letter; //a..h
int number; //1..8
color colour; //цвет
public:
Figure(coord x, int y, color z)
{
letter = x;
number = y;
colour = z;
}

};

class Castle : public Figure {
public:
int Turn(coord new_letter,int new_number,color) {
if (((new_letter == letter) &&
(new_number != number)) ||
((new_letter != letter) &&
(new_number == number))) {
letter = new_letter;
number = new_number;
return 1;
}
else return 0;
}
};

class Bishop : public Figure {
public:
int Turn(coord new_letter,int new_number,color) {
if ((abs((new_letter == letter) ==
abs(new_number != number)) &&
(new_letter != letter))) {
letter = new_letter;
number = new_number;
return 1;
}
else return 0;
}
};


class Queen: public Figure {
public:
int Turn(coord new_letter, int new_number,color) {
if ((letter != new_letter || number != new_number) &&
(new_letter == letter ||
new_number == number ||
abs(new_letter == letter) ==
abs(new_number - number))) {
letter = new_letter;
number = new_number;
return 1;
}
else return 0;
}
};


int main() {
Queen q(coord::e, 5,color::white);// в этой строчке проблема
q.Turn(coord::h, 8, color::white);
return 0;
};
Darklight вне форума Ответить с цитированием
Старый 11.07.2022, 19:44   #9
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,016
По умолчанию

Darklight, конструктор нужно прокинуть
Код:
#include <iostream>
#include <iomanip>
#include <cmath>

enum class coord { a, b, c, d, e, f, g, h };
enum class color { black, white };
class Figure
{
protected:
	coord letter; //a..h
	int number; //1..8
	color colour; //цвет
public:
	Figure(coord x, int y, color z)
	{
		letter = x;
		number = y;
		colour = z;
	}
};

class Castle : public Figure
{
public:
    using Figure::Figure;
    
	int Turn(coord new_letter,int new_number,color) {
		if (((new_letter == letter) &&
			(new_number != number)) ||
		    ((new_letter != letter) &&
			(new_number == number))) {
			letter = new_letter;
			number = new_number;
			return 1;
		}
		else return 0;
	}
};

class Bishop : public Figure
{
public:
    using Figure::Figure;
    
	int Turn(coord new_letter,int new_number,color) {
		if ((abs((new_letter == letter) ==
			    abs(new_number != number)) &&
			(new_letter != letter))) {
			letter = new_letter;
			number = new_number;
			return 1;
		}
		else return 0;
	}
};


class Queen: public Figure
{
public:
    using Figure::Figure;
    
	int Turn(coord new_letter, int new_number,color) {
		if ((letter != new_letter || number != new_number) &&
		    (new_letter == letter ||
			new_number == number ||
			abs(new_letter == letter) ==
			abs(new_number - number))) {
			letter = new_letter;
			number = new_number;
			return 1;
		}
		else return 0;
	}
};


int main()
{
	Queen q(coord::e, 5,color::white);
	q.Turn(coord::h, 8, color::white);
	return 0;
};
Алексей1153 вне форума Ответить с цитированием
Старый 11.07.2022, 20:27   #10
Алексей1153
фрилансер
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,016
По умолчанию

координату завернул в класс
Код:
#include <iostream>
#include <iomanip>
#include <cmath>

enum class coord { a, b, c, d, e, f, g, h };
enum class color { black, white };

struct s_coord
{
	coord x_letter{};
	int y_number{}; //1..8
	
	friend bool operator==(const s_coord& l,const s_coord& r)
	{
		return l.x_letter==r.x_letter && l.y_number==r.y_number;
	}
	
	friend bool operator!=(const s_coord& l,const s_coord& r)
	{
		return !(l==r);
	}
	
	bool ifSomePartsAreEqual(const s_coord& r) const 
	{
		return (x_letter == r.x_letter || y_number == r.y_number);
	}
	
	bool ifAbsDifferencesAreEqual(const s_coord& r) const 
	{
		return std::abs( ((int)x_letter)-((int)r.x_letter)) == std::abs(y_number-r.y_number);
	}
};

class Figure
{
protected:
	s_coord m_coord;
	color m_color; //цвет
public:
	Figure(const s_coord m_coord, color z)
		:m_coord(m_coord)
		,m_color(m_color)
	{
	}
};

class Castle : public Figure
{
public:
	using Figure::Figure;
	
	bool Turn(const s_coord new_coord)
	{
		if(m_coord!=new_coord)
		{
			if (m_coord.ifSomePartsAreEqual(new_coord))
			{
				m_coord=new_coord;
				return true;
			}
		}
		
		return false;
	}
};

class Bishop : public Figure
{
public:
	using Figure::Figure;
	
	bool Turn(const s_coord new_coord)
	{
		if(m_coord!=new_coord)
		{
			if(m_coord.ifAbsDifferencesAreEqual(new_coord))
			{
				m_coord=new_coord;
				return true;
			}
		}
		
		return false;
	}
};


class Queen: public Figure
{
public:
	using Figure::Figure;
	
	bool Turn(const s_coord new_coord)
	{
		if(m_coord!=new_coord)
		{
			if (m_coord.ifSomePartsAreEqual(new_coord))
			{
				m_coord=new_coord;
				return true;
			}
			
			if(m_coord.ifAbsDifferencesAreEqual(new_coord))
			{
				m_coord=new_coord;
				return true;
			}
		}
		
		return false;
	}
};

int main()
{
	Queen q({coord::e, 5},color::white);
	q.Turn({coord::h, 8});
	return 0;
};
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо написать "таймер", который будет запускаться при нажатии кнопки "Start", приостанавливаться на "Pause", и сбрасываться на "Reset" billiejean78 JavaScript, Ajax 1 03.09.2021 08:58
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" link90 Общие вопросы C/C++ 2 27.03.2016 12:34
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40