Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
strange_man
9 / 9 / 0
Регистрация: 17.05.2012
Сообщений: 117
#1

Нарисовать шахматную доску - C++

15.07.2013, 00:27. Просмотров 2149. Ответов 3
Метки нет (Все метки)

Задание из книги Страуструпа "Принципы и практика использования С++":
"Нарисуйте доску для шахмат 8x8, чередуя белые и красные квадраты".

Вот отрывок кода (здесь магические константы, но это подождет, пока я не разберусь с проблемой)
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
int main()
try
{ 
    Point tl(100,100);  
 
    Simple_window win(tl,600,400,"Canvas");
 
    int x = 100, y = 30;
 
    for (int i = 0; i < 64; i++)
    {
        Graph_lib::Rectangle r(Point(x,y),30,30);
        if (i % 2 == 0) r.set_fill_color(Color::white);
        else r.set_fill_color(Color::red);
        win.attach(r);
        //win.wait_for_button();
        x += 30;
        if (x >= 340)
        {
            x = 100;
            y += 3;
        }
    }
 
    win.wait_for_button();
}
Как видно, с каждым витком цикла создается новый объект типа Rectangle с заданной координатой верхней левой вершины, а также длиной и шириной фигуры. По окончании работы цикла результат разочаровывает, поскольку окно win пусто. Получается, что эти квадраты создаются и уничтожаются после каждого прохода.
Я решил заглянуть в .cpp файл, относящийся к классу Rectangle. Оказалось, что когда происходит выполнение функции-члена attach(), то она в качестве аргумента принимает ссылку на объект Rectangle и прикрепляет к окну объект по ссылке. А так как после каждого прохода переменная уничтожается, следовательно, уничтожается и прикрепленный к окну квадрат.
Я пробовал создавать вектор из объектов Rectangle, но компилятор ругался, что нет доступа к приватному члену. Модифицировать код я не хочу, да и не предполагаю пока как. Ведь автор писал задание в книге, исходя из того кода что он создал для работы над главой.
Но я не предполагаю каких-либо иных способов решения. Мне, вроде бы, и не стоило бы беспокоиться, но ведь впереди еще несколько глав, где я буду работать с библиотекой FLTK и исходным кодом, предоставленным автором.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2013, 00:27     Нарисовать шахматную доску
Посмотрите здесь:

создать шахматную доску C++
C++ Подсчитать количество способов замостить шахматную доску доминошками
Нарисовать ромбик C++
C++ Нарисовать треугольник
C++ Обойти шахматную доску ходом коня
C++ Как можно сформировать массив кнопок, моделирующий шахматную доску?
C++ Нарисовать эллипс
C++ Реализовать программу на рекурсию про шахматную доску
Написать программу, которая выводит на экран шахматную доску C++
Нарисовать Букву C++
Нарисовать треугольник C++
C++ Нарисовать шахматную доску

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1888 / 1743 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
15.07.2013, 00:42     Нарисовать шахматную доску #2
Похоже, в этой библиотеке можно нарисовать ровно столько прямоугольников, сколько экземпляров объектов класса rectangle.
Сначала, хотел предложить вынести за цикл Graph_lib::Rectangle r, а в цикле присваивать ему разные координаты...
Но нет. спасёт только массив
C++
1
Graph_lib::Rectangle r[64];
strange_man
9 / 9 / 0
Регистрация: 17.05.2012
Сообщений: 117
15.07.2013, 09:40  [ТС]     Нарисовать шахматную доску #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Похоже, в этой библиотеке можно нарисовать ровно столько прямоугольников, сколько экземпляров объектов класса rectangle.
Сначала, хотел предложить вынести за цикл Graph_lib::Rectangle r, а в цикле присваивать ему разные координаты...
Но нет. спасёт только массив
C++
1
Graph_lib::Rectangle r[64];
"error: для класса "Graph_lib::Rectangle" не существует конструктор по умолчанию"

Добавлено через 7 минут
Поправка: В коде ошибка, там
C++
1
y+=30
strange_man
9 / 9 / 0
Регистрация: 17.05.2012
Сообщений: 117
15.07.2013, 14:34  [ТС]     Нарисовать шахматную доску #4
У меня получилось, но для этого пришлось заглянуть аж в следующую главу, где было рассказано о том, как делать вектора из фигур.
Страуструп что, пытался меня заставить создавать 64 разных квадратика ? -_- я ж не китаец

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
int main()
try
{ 
    Point tl(100,100);  
 
    Simple_window win(tl,600,400,"Canvas");
 
    int x = 100, y = 30;
    Vector_ref<Graph_lib::Rectangle> r;
 
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            r.push_back(new Graph_lib::Rectangle(Point(x,y),30,30));
            if ((i+j) % 2 == 0) r[r.size()-1].set_fill_color(Color::white);
            else r[r.size()-1].set_fill_color(Color::red);
            win.attach(r[r.size()-1]);
            x += 30;
        }
        x = 100;
        y += 30;
    }
 
    win.wait_for_button();
}
И результат работы:
Миниатюры
Нарисовать шахматную доску  
Yandex
Объявления
15.07.2013, 14:34     Нарисовать шахматную доску
Ответ Создать тему
Опции темы

Текущее время: 15:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru