Вывести шахматную доску с заданными размерами по принципу
Правильно ли решена задача создания шахматной доски в консоли?
Прохожу курс. Там в домашнем задании была задача создания шахматной доски в консоли.
Попробовал решить. Она вроде как отрабатывает правильно, но вот решение все таки кажется не совсем правильным. Как правильно переписать следующее решение? На что стоит обратить внимание? Все таки хочется решать задачи правильно.
Вводим например 8, 8 и получаем доску размером 8x8. и выглядит она так:
Немного переписал решение. Но хз, лучше ли оно первого или нет. В целом похожи решения, но все же, как правильней и эффективней решить данную задачу?
Немного другое решение:
Второе решение теперь кажется не лучше первого. Так как каждая строчка заново пересоздает строку и кажется это не правильно и неэффективно будет. Хз в общем. Помогите решить правильно
PSS.
Попробовал еще порешать используя просто циклы. Получился более менее вариант, который меня более чем устраивает.
Вывод на экран шахматной доски
Помощь в написании контрольных, курсовых и дипломных работ здесь.
94731 / 64177 / 26122 Ответы с готовыми решениями:Программа, которая выводит на экран изображение шахматной доски
и снова привет! мне опять нужна ваша помощь. вот код, который жутко глючит((( < // Напишите.
Написать программу, которая выводит на экран изображение шахматной доски
Написать программу, которая выводит на экран изображение шахматной доски.
Разрезание шахматной доски
Написать программу нахождения всех способов разрезания шахматной доски с числом клеток nxn.
Король шахматной доски
Король шахматной доски размером 8х8 находится на коне в одной из клеток своего королевства. Он.
Доброго времени суток.
Даны 2 задачи на вариацию шахматной доски.
1. Высота и ширина доски задаётся пользователем.
Нарисовать шахматную доску в консоли. Размер ячейки доски фиксирован - одно знакоместо.
Чёрные клетки - символ 'x', белый - символ '-'.
Тут сложностей нет.
2. условия те же, только размер ячейки не фиксирован, а задаётся пользователем.
Т.е., например, высота доски - 3, ширина - 4, размер ячейки - 3 знакоместа.
На выводе должно быть так:
И вот тут у меня проблемы.
Помогите пожалуйста подсказкой как это реализовать, готовый код не надо - хочется самому разобраться.
Из обязательных условий: использование только циклов - никаких массивов, консольный вывод (cout).
Шахматная доска
Вывести шахматную доску 8x8 (1 - белый квадратик, 0 - черный).
Я быстренько накатал:
Но может можно как-то поумнее сделать? Походу будет проверяться насколько рационально подошли к такой простой задаче. 94731 / 64177 / 26122 Ответы с готовыми решениями:Шахматная доска
Даны координаты двух различных полей шахматной доски x1,x2,y1,y2(Целые числа лежащие в диапазоне от.
шахматная доска
Поле шахматной доски определяется парой натуральных чисел, каждое из которых не более 8:1-е число.
Шахматная доска
Шахматная доска содержит 8x8 клеток. Горизонтали и вертикали обозначаются цифрами 1-8. Написать.
шахматная доска
Здравствуйте! Есть задача: дана шахматная доска размером NxN, нужно расставить N ферзей таким.
87844 / 49110 / 22898
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Шахматная доска
Заполнить двумерный массив единицами и нулями таким образом, чтобы единицы размещались так, как на.
Шахматная доска
Есть шахматная доска (8*8). Нужно с помощью фигуры "конь" обойти все 64 клетки шахматной доски.
С++ Шахматная доска
Помогите пожалуйста с заданием. Нужно сделать шахматную доску 16*16 и пользователь должен ввести.
Шахматная доска
Ребята, помогите! Есть код на С++, выводящий на экран шахматную доску, нужно его дополнить.
Вывод на экран консоли шахматную доску
Помощь в написании контрольных, курсовых и дипломных работ здесь.
94731 / 64177 / 26122 Ответы с готовыми решениями:Написать программу, которая выводит на экран шахматную доску
Добрый день, Помогите пожалуйста решить задание на с++, "Написать программу, которая выводит на.
Нарисовать шахматную доску
Ввести число N и нарисовать шахматную доску размера NxN, где верхнее левое - белое. Белые поля.
создать шахматную доску
прошу помощи 1 Поле шахматної дошки визначаться парою натуральних чисел,кожне з яких не перевищує.
Нарисовать шахматную доску
Задание из книги Страуструпа "Принципы и практика использования С++": "Нарисуйте доску для шахмат.
Доска у нас получается потому что цикл вложенный то есть мы вызываем 10 раз внешний цикл,а в нем в каждом цикле вызываем 10 раз внутренний цикл(то есть внутренний цикл работает 100 раз).
Добавлено через 49 секунд
А это фрагмент кода вызывается со второй строки поэтому она начинается с пробела и все четные строки тоже. 59 / 54 / 34
Доска у нас получается потому что цикл вложенный то есть мы вызываем 10 раз внешний цикл,а в нем в каждом цикле вызываем 10 раз внутренний цикл(то есть внутренний цикл работает 100 раз).
Добавлено через 49 секунд
А это фрагмент кода вызывается со второй строки поэтому она начинается с пробела и все четные строки тоже. Спасибо, с циклами в принципе понятно. Но я так и не могу понять, что с этим кодом
Вы говорите, что четные строки должны начинаться с пробела, но ведь на второй строке i = 2. (i / 2 = 1, остаток равен нулю, а значит условие i % 2 != 0 не работает). А в первой строке i = 1, как задано в цикле for , а значит условие работает (i / 2 = 0.5, остаток не равен нулю), и по сути должен быть пробел на первой и на НЕ четных строках.
Заранее спасибо.
Добавлено через 8 минут
Mathist, Большое спасибо. Все наконец-то понятно.
Написать программу, которая выводит на экран шахматную доску с заданным размером клеточки. Например, если размер С++
клетки равен 2 символа, то шахматная доска будет выглядеть как**--**--**--**-- **--**--**--**-- --**--**--**--** --**--**--**--** **--**--**--**-- **--**--**--**-- --**--**--**--** --**--**--**--** **--**--**--**-- **--**--**--**-- --**--**--**--** --**--**--**--** **--**--**--**-- **--**--**--**-- --**--**--**--** --**--**--**--**
Дополнен 7 лет назад
Лучший ответ
int main() <
using namespace std;
cout << "size? ";
int sz; cin >> sz;
for (int r = 0; r < 8; ++r) <
for (int k = 0; k < sz; ++k) <
for (int c = 0; c < 8; ++c) cout << setfill((r + c) % 2 ? ' ' : '*') << setw(sz) << "";
cout << endl;
>
>
>
Задача "Шахматная доска"
Помогите решить задачу. Напишите программу, которая на вход получает координаты двух клеток шахматной доски и выводит соощение о том, являются ли эти клетки одного цвета. Формат ввода: c2 e4. Формат вывода: клетки одинакового цвета. Основное решение есть: если сумма этих координат делится без остатка, то клетки одного цвета. Но как в коде преобразовать буквенную координату в числовую, не могу понять.
Голосование за лучший ответ
"Но как в коде преобразовать буквенную координату в числовую, не могу понять"
l = 'a' : 1,
'b' : 2,
'c' : 3,
'd' : 4
>
print(l['a'])
print(l['c'])
ord('твоя буква')-96
Ольга СвистунковаЗнаток (294) 6 месяцев назад
Павел, спасибо! Как же я сразу не догадалась!
Если сумма всех 4 координат чётная - клетки имеют один цвет, если нечётная - разный.
При этом в качестве координат можно взять просто коды символов - ответ не изменится.
print('NO' if sum([ord(ch) for ch in input() if ch != ' ']) % 2 else 'YES')
Вывести шахматную доску с заданными размерами по принципу
Создать функцию, генерирующую шахматную доску. Можно использовать любые html-теги. Доска должна быть верно разлинована на черные и белые ячейки. Строки должны нумероваться числами от 1 до 8, столбцы — латинскими буквами A, B, C, D, E, F, G, H.
About
Создать функцию, генерирующую шахматную доску. Можно использовать любые html-теги. Доска должна быть верно разлинована на черные и белые ячейки. Строки должны нумероваться числами от 1 до 8, столбцы — латинскими буквами A, B, C, D, E, F, G, H.
Как я могу сделать шахматную доску с переменным размером из текста? Я могу сделать шахматную доску, состоящую из отдельных символов, используя этот код:
Но это дает мне вывод только отдельных символов, как бы я добавил переменные размеры блоков в уравнение?
Например, Учитывая символ (C), длину (L), ширину (W) и размер (N), напишите программу на C ++, чтобы нарисовать доску размером (2N x 2N), состоящую из ячеек, заполненных символом C, длина L и ширина W. Ячейки доски должны быть нарисованы как шахматная доска
Предположим, C = ‘&’, L = 4, W = 6 и N = 3
Выход будет такой (без границ)
Решение
Честно говоря, я пытался просмотреть ваш код и найти ошибки, но в итоге я переписал проблему с нуля. Это все о вложенных циклах, и вам нужно довольно много из них для детального контроля.
Код, который помог мне (надеюсь, комментарии полезны):
Компилирование с g++ -o main main.cpp а затем выполнить с некоторыми параметрами, например, echo "X 3 5 2" | ./main дает мне хороший результат:
Другие решения
Способ решения проблемы такого рода состоит в том, чтобы разбить ее на более мелкие проблемы и продолжать разбивать проблему до тех пор, пока вы не получите очень маленькие задачи, которые можно легко перевести в код.
Например, после просмотра вашего плана того, что вы пытаетесь сделать, одна вещь становится совершенно ясной:
Допустим, мы используем метку «логическая строка» для ссылки на одну или несколько физических строк текстов или строк, которые содержат изображение одной строки в вашей шахматной доске. В приведенном выше примере каждая логическая строка состоит из четырех физических строк. Затем первое, что становится совершенно очевидно, что при любом значении N вы создадите N пар логических строк. В каждой паре первая логическая строка будет иметь шахматные доски в нечетных столбцах, затем вторая логическая строка будет иметь символы шахматной доски в четных столбцах.
Таким образом, мы можем с уверенностью сказать, что код для выполнения того, что вы хотите, будет выглядеть примерно так:
Итак, с N = 3 вы получите шахматную доску, состоящую из шести рядов, как в примере с желаемым результатом. С N = 4 вы получите восемь и так далее.
Теперь проблема сводится, в основном, к рисованию одной логической строки шахматной доски. Как бы то ни было, получающийся код будет втиснут в цикл for. Итак, мы можем отложить это.
Второй легко разложимый шаг состоит в том, что каждая строка шахматной доски состоит из L строк физических строк.
Таким образом, код для создания одной логической строки шахматной доски будет выглядеть примерно так:
Это делается для каждого нечетного и четного ряда шахматной доски. Далее, чтобы избежать дублирования кода, вы, возможно, могли бы уточнить конечный результат, но сейчас достаточно дважды продублировать его для цикла for, внутри первого цикла for, один раз для нечетной строки, один раз для четной строки.
На этом этапе исходная проблема теперь разбита на: нарисовать одну физическую строку. Это должно быть достаточно просто, чтобы вы заимствовали код, который вы уже написали в своем вопросе, для реализации окончательного ответа.
Разработка шахматной программы
Было ли вам когда-либо интересно написать свою шахматную программу? Настраивать и развивать её, проверять её на знакомых любителях шахмат и радоваться её победам. Но как написать такую программу? Об этом я и расскажу в этой статье.
Сначала я хотел дать полное описание своей реализации шахматного движка (я назвал его Centurion). Но тут я вдруг понял, что на эту тему пишут книжки, а не статьи. В формате статьи просто невозможно описать детально все компоненты шахматной программы с подробностями реализаций. Поэтому я решил ограничиться общим описанием моего шахматного движка и дать ссылку на его исходный код и саму программу. Выглядит программа для Windows так:
Программа для Windows.
Ходить можно как вводом хода в поле (E2-E4), так и мышкой — левая кнопка откуда, правая — куда.
Итак, начнём.
Для начала, стоит поискать специальную литературу о том, как же писать шахматные программы. Я из таковых использовал книжку Корнилова “Программирование шахмат и других логических задач” 2005 года. Одной этой книжки оказалось мало – автор не акцентировал внимание на кое-чём важном, а кое-что просто не рассказал. А это кое-что, между прочим, сильно сокращает дерево перебора. Сразу же предупреждаю, что в моём движке не используется генератор ходов на базе битовых массивов. Этот уровень мне пока недоступен. Впрочем, я особо и не пытался разобраться с ними, предпочитая написать как можно более прозрачный (для меня) механизм работы с ходами фигур, пусть даже в ущерб быстродействию (движок получился не очень быстрый, но вполне работоспособный).
Первое, о чём нам нужно подумать, так это о том, как мы будем представлять игровое поле. Оказывается, очень удобно каждую клетку представлять целым числом, отдельные биты которого отвечают за параметры этой клетки. Я для клеток задал макрос
А сама клетка у меня представлена битами как AHIIIIEWB0MFFF, где:
W-фигура белая
B-фигура чёрная
F-тип фигуры (0-фигуры нет)
M-ходила ли фигура
E-край доски
I-индекс фигуры в массиве для поиска фигур (0-15)
H-была короткая рокировка (флаг ставится только у короля и ладьи)
A-была длинная рокировка (флаг ставится только у короля и ладьи)
Чем удобно представление с помощью битов? Наложение маски позволяет быстро определять, что это за клетка. Специально для этого у меня были заданы маски:
Дальше следует решить, какого размера будет доска. 8x8 неудобно для анализа выхода за пределы доски. Гораздо удобнее задать массив 16x16 с доской посередине, задав для всех тех клеток, которые не являются доской, флаг границы. В этом случае изменение координаты по X происходит изменением координаты X на нужный шаг, а по Y на шаг*16. Доска задаётся как
Некоторые параметры в дальнейшем будет удобно задавать для поля 8x8, для этой цели стоит завести массив перекодировки координат из поля 16x16 в поле 8x8.
Кстати, чтобы не пришлось сканировать всю доску, стоит помнить, где на доске находятся фигуры. Например, так:
Теперь определимся с тем, как мы будем задавать ходы. Очень удобно сделать так:
Здесь в массивах заданы изменения координат в пространстве нашей доски 16x16 для одного шага фигуры. Ходы пешки удобно рассматривать отдельно, так как у неё ходы простые, но есть специфическое взятие на проходе.
Как таким массивом пользоваться? Ну вот, например, составление всех ходов ферзя:
Как видите, всё просто. Для хранения ходов я создал структуру
Хоть массив ходов и задаётся как
, где MAX_PLY – максимальная глубина анализа (а 200 – максимальное число ходов любой фигуры (с запасом)), но указатель на следующий элемент sMove_NextPtr позволяет удобно сортировать ходы (а сортировать их придётся). std::list (или ещё что из stl) я тут не стал использовать – у нас крайне критично быстродействие (да и я не скажу, что мастер в stl и современном Си++, скорее наоборот). Впрочем, вы можете сделать и с помощью stl и сравнить скорость работы программы – я же этого не проверял.
Ну, в целом, с ходами закончили, перейдём к алгоритмам.
Во-первых, нам нужна функция оценки позиции. Тут возможностей просто море. У меня в движке в engine_score.cpp вполне читаемо описано всё то, что я использую для оценки позиции. Там представлены массивы очков за нахождение фигуры в данной клетке поля (для поля 8x8 – так просто удобно задавать).
Во-вторых, нам нужен альфа-бета с амортизацией отказов. Думаю, рассматривать сам альфа-бета алгоритм бессмысленно — на эту тему написано множество статей и книг. Да и в общем, он (или его модификации) в основе множества шахматных программ. Самое интересное в шахматных программах, как сократить число ходов для этого алгоритма.
В-третьих, нам нужна хэш-таблица. Дело в том, что в шахматах позиция при переборе часто повторяется – зачем нам заново анализировать то, что уже мы смотрели? Выявить такую позицию и позволяет хэш-таблица. В ней хранятся “уникальные” значения, отличающие одну позицию от другой. Стоятся эти “уникальные” значения просто выполняя операцию xor для ключей элементов, описывающих позицию. Поэтому нам нужны будут массивы уникальных 64 битных чисел (вы можете и любую другую размерность взять, весь вопрос только в том, как часто будут одинаковым значениям позиции соответствовать разные позиции – ошибки хэша). У меня таблица описана так:
Ещё понадобятся ключи смены хода (так как позиции могут быть и одинаковыми, а вот цвет фигур, которые должны ходить разный). И специальный ключ так называемого нулевого хода (о самом нулевом ходе я расскажу ниже). Насколько я помню, вот об этих последних двух ключах Корнилов в своей книжке умолчал.
Все эти ключи я задал жёстко в программе, чтобы не генерировать каждый раз с проверкой уникальности.
Теперь смотрите какая штука выходит: если мы изначально позицию получим, выполнив xor всех ключей фигур на доске
, то при выполнении хода, как можно заметить, нам достаточно делать с текущим значением хэша позиции xor ключа фигуры на старом месте, а потом xor ключа фигуры на новом месте. Так же и со взятиями. Это позволяет очень быстро в процессе перебора позиций вычислять значение хэша.
В-четвертых, нам нужна такая штука, как статистика истории. Что это такое? Во время игры можно заметить, что какие-то ходы улучшают оценку позиции. Стоит этот факт отмечать, запоминать и в дальнейшем использовать при сортировке ходов. Как это сделать? Просто завести массив [64][64] ([начальная позиция фигуры на поле 8x8][конечная позиция фигуры на поле 8x8]), обнулить в начале оценки выбора лучшего хода и в дальнейшем просто увеличивать счётчик на 1 в случае хода, улучшающего для нас оценку позиции.
В-пятых, нам нужна сортировка ходов. Самыми первыми должны быть ходы с максимальной выгодой по оценке позиции. Понятно, что ходы взятия приоритетнее обычных “тихих” ходов. Ходы взятия сортируются по принципу MVV/LVA (наиболее ценная жертва – наименее ценный нападающий). При этом стоит продвигать все необычные ходы со взятием (любой ход, который не имеет тип MOVE_TYPE_SIMPLY). Так же вперёд стоит продвинуть и взятие последней ходившей фигуры противника (если взятие будет). Обычные ходы сортируются по возрастанию оценки позиции с учётом эвристики истории. Вся эта сортировка очень важна! Она и сама по себе позволяет сократить обход дерева игры, но более того, на нижних уровнях дерева можно в принципе выбрасывать почти все “тихие” ходы (и если король не под шахом) из рассмотрения без ущерба для качества игры программы! Я увидел такое в коде шахматной программы Ифрит (Ifrit) и, конечно же, применил. Это называется Late Move Reduction, насколько я понимаю.
Для этого используется следующий массив:
Здесь числа означают то, сколько “тихих” ходов анализируется в зависимости от уровня дерева (массив задан в обратном порядке). То есть, на последних для анализа 9 уровнях дерева в рассмотрении будет сначала 259 ходов, потом 131, потом 67 и так далее до 19. Это сильно ускоряет работу программы (а также об этом Корнилов вроде как тоже не рассказал в своей книжке). Разумеется, без сортировки ходов такое отсечение не заработает.
В-шестых, нам нужно обязательно продлевать анализ взятий и шахов. Это позволит увеличить точность оценки позиции.
В-седьмых, нам нужна будет эвристика убийцы. Заключается она в том, чтобы при анализе веток дерева пробовать первым ход, вызвавший отсечение на предыдущей ветке. Такой приём также позволяет сократить перебор. Следует помнить, что такой ход может быть только “тихий”: взятия и необычные ходы использовать для таких проверок нельзя.
В-восьмых, есть такая штука, как нулевой ход. Смысл в том, что можно сделать пропуск хода и посмотреть, насколько всё станет плохо. При этом можно сократить глубину анализа дерева (сделать редукцию) – всё равно оценка предварительная. Главное, не забывать пометить хэш позиции ключом этого самого нулевого хода
В-девятых, есть ещё Futility Prunning. Что это такое? На последних двух полуходах дерева оценка позиции не точна и в ряде случаев (если мы не в нулевом ходе, если ход не является шахом, взятием и ход не продление анализа ветки), а также если разность оценки позиции была больше некоторой небольшой величины, то можно просто вернуть эту оценку и не анализировать глубже. Этот приём также ускоряет работу программы.
В-десятых, для сокращения вариантов придуман ещё и Razoring. Это почти то же самое, что и Futility Prunning, но относится к последним четырём полуходам и граница оценки задаётся в некоторую стоимость допустимых потерь фигур.
В-одиннадцатых, некоторые ходы стоит продлевать в анализе. К ним относятся ходы взятия, шахов, приближения фигур противника к королю. Продлевать лучше отдельной функцией анализа, в которой только для шахов стоит запускать полный перебор. Для остальных ходов достаточно анализировать только ходы взятия. Это называется статический поиск.
В-двенадцатых, есть ещё такая штука, как Principal Variation (главное изменение). Это та линия игры, которую программа считает лучшей в данный момент. Эта линия постоянно корректируется во время перебора позиций. Ход из главной линии при сортировке стоит продвигать вперёд.
Ну вот вроде бы и всё из того набора, который использует мой шахматный движок. Надеюсь, я ничего нигде не напутал, так как движку уже два года и я столько же его не касался и вполне мог что-либо забыть.
В архиве лежит сам движок (он поддерживает UCI, так что можете подключить его к Arena), программа под Windows для игры с ним (на скорую руку), шахматы для QNX 6.3. Уровень игры я точно оценить не могу (я не шахматист, как ни странно), но вроде как играет достаточно неплохо.
Читайте также: