Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Определение цвета клетки на шахматной доске |
Автор: Enya 15.1.2006, 23:27 | ||||||
Вот. Всего на шахматной доске получается 64 клетки. Программа запрашивает число и говорит какого цвета ячейка под этим номером. Я что-то выбилась из сил. ![]()
Вот одна мысль по поводу этой задачи:
Вот что получается если ввести например номер 3:
Может у кого-нибудь родяться мысли? ![]() Добавлено @ 23:28 Первая ячейка ЧЁРНАЯ. |
Автор: DeadSoul 15.1.2006, 23:35 |
Enya, а не пробовал нумеровать шахматные клетки по-другому? Задавать координаты клетки двумя числами(координаты по x и y). При переходе на соседнюю клетку(по горизонтали или вертикали) цвет клетки меняется. Таким образом, цвет клетки получается равен: ( x%2 + y%2 )%2 = (x+y)%2, где (x,y) - координата клетки |
Автор: Enya 15.1.2006, 23:37 |
DeadSoul, вашу бы мысль да кодом выразить?! |
Автор: DeadSoul 15.1.2006, 23:57 | ||
А чего тут выражать? |
Автор: Enya 16.1.2006, 00:10 |
DeadSoul хотя бы кусок кода черкани...![]() |
Автор: Fin 16.1.2006, 00:14 | ||
Вот в эту формулу вводиш номер ячейки (num) в пределах от 1 до 64
color приобретает значение 0 если ячейка черная и 1 если ячейка белая. Все остальное уже дело техники. |
Автор: Partizan 16.1.2006, 00:18 | ||
хех...а решение-то элементарное ![]() советую завести двумерный массив типа, например bool, и не париться ![]() то бишь 1- белый... 0 - чёрный ![]()
|
Автор: DeadSoul 16.1.2006, 00:34 | ||
И зачем? |
Автор: Partizan 16.1.2006, 00:40 |
CMarray[ Num/8 ][ Num%8-1 ] ? cout << "Black" : cout << "White"; за этим.... |
Автор: Fin 16.1.2006, 00:46 | ||
Partizan У тебя в выражении маленькая логическая ошибка. счисление начинается с 1. Надо скорее всего так:
|
Автор: Enya 16.1.2006, 00:52 | ||
Fin, Partizan ребята спасибо. ![]() Но вот только на языке Си есть булевые переменные? И вот ещё вопрос массивчик CMarray
|
Автор: Partizan 16.1.2006, 01:34 |
Собственно зря вы так ![]() Человек попросил код решения, я его написал вот и всё..... чей код использовать это уже его(её) личый выбор... |
Автор: Helicopterr 16.1.2006, 02:51 |
int number; cin >> number; if ( (number % 2) > NULL ) cout<<"Black"; else cout<<"White"; ![]() Partizan создавать массив 8х8 ради этой задачи? Я плакал. ![]() |
Автор: Partizan 16.1.2006, 03:11 |
Helicopterr я бы советовал вам подумать, прежде чем писать оскорбления... заметьте 1-я клетка имеет Чёрный цвет.... 9-я - белый.... а в вашем коде и 1 и 9 имеют чёрный цвет.... то бишь получется что столбцы с нечетными номерами чёрные, а с чётными - белые... вот так... -1..... |
Автор: darkart 16.1.2006, 03:23 | ||
Наверное так...
|
Автор: Helicopterr 16.1.2006, 03:41 |
Partizan Смотря с какой стороны смотреть на доску и в каком порядке отсчитывать поля. А насчет "оскорблений" я что-то не понял. |
Автор: Enya 16.1.2006, 09:26 |
darkart, ваша мысль наиболее чёткая. Всем спасибо. Ночью будет время, расскажу что было на занятиях по програмированию. ![]() |
Автор: Partizan 16.1.2006, 11:10 | ||
вы плакали? ![]() хорошо... покажите мне,пожалуйста такой пример отсчета, чтобы ваша формула была верна.... смотреть на доску можете хоть с какой стороны... ну и конечно последовательность клеток должна сохраняться...то есть нумерация должна быть строго последовательна...а не нумеровать по диагоналям... |
Автор: Helicopterr 16.1.2006, 15:52 | ||
Partizan Зачем по диагоналям? змейкой или по кругу вполне можно. Но предлагаю всё же уточнить начальные условия. Итак условия, как я понял: счёт полей по вертикалям слево направо т.е. будто текст читаем, ввод пользователя от 1 до 64. Ещё напомню, что в шахматах первое поле - а1 (1) черное, как и последнее - h8 (64). Тогда получим:
Думаю, вполне лаконично. ![]() Насчёт варианта darkart незнаю, сейчас посмотрю... |
Автор: Partizan 16.1.2006, 17:06 |
а теперь, пожалуйста, сравните то, что у вас было раньше, и то, что у вас есть сейчас... ибо результаты работы программ Разные(!). |
Автор: DeadSoul 16.1.2006, 22:46 | ||||
Это констатация факта. Я, например, не получил внятного ответа на вопрос за каким лешим там нужен массив Добавлено @ 22:47
На каких компиляторах проверял и с какими настройками? |
Автор: Fin 16.1.2006, 23:01 |
Ребята ![]() |
Автор: Enya 17.1.2006, 00:28 |
darkart, ваше решение наиболее оптимальное! |
Автор: DeadSoul 17.1.2006, 01:04 |
Неа, для int-ов вместо a%2 выгоднее писать a&1 |
Автор: azesmcar 17.1.2006, 09:47 |
Меня кое что другое очень заинтересовало..почему все решают задачу находя координаты шахматного поля одним int num? Почему не двумя координатами? Для решения шахматных задач насколько я знаю используются два... |
Автор: Partizan 17.1.2006, 11:33 | ||||||
проверял в своей голове....чтобы понять что эти 2 кода различны совсем не обязательно пытаться их скомпилировать....если не верите можете скомпилировать их... 1-й его код(неверный)(это из мессаги, в которой он плакал ![]() ![]() ![]()
2-й его код (верный):
|
Автор: threef 17.1.2006, 11:49 |
Потому, что при обращении к двумерному массиву x[a][b] оно преобразуется компилятором в выражение вида *(*(x+a)+b). Поэтому нет противопоказаний, чтобы это же сделать самому : x[64], *(x+a*8+b)==*(x+a<<3+b). |
Автор: azesmcar 17.1.2006, 12:21 | ||
Ну это то ясно...меня интересует почему функции с одним параметром??? Ну так давайте сразу забудем о двумерных массивах будем использовать одномерные и каждый раз вычислять из заданых координатов...какой смысл??? если работаем как с двумерным массивом то и индексы обращения должны быть как у двумерного... Я же не говорю что это противопоказано...просто думаю что неудобно, ведь работать с этой доской придеться потом как с двумерным массивом, вместо одного индекса будут два...не преобразовывать же его каждый раз? |
Автор: Guest 17.1.2006, 12:39 |
bool Value; - 1 байт в откомпилированном exe, соответственно в памяти тоже. 8*8=64 байта? И вы предлагаете массив для решения тривиальной задачи. ![]() |
Автор: _hunter 17.1.2006, 13:02 |
охренительно огромный объем оперативки. где б еще ком найти, чтобы там эта жутко огромная программа запустилась? |
Автор: Fin 17.1.2006, 17:02 | ||||
azesmcar
Чтобы понять, почему именно такие решения даются, прочти условия задачи.
|
Автор: azesmcar 17.1.2006, 17:06 | ||
Этот вопрос и автора касается... ![]() |
Автор: Exekutor 21.1.2006, 14:33 | ||
Забавно, что вокруг такой тривиальной задачки разгорелась такая дискуссия. Каждый начинающий программист решал такую или похожую задачку. Согласен с Helicopterr это решение самое эффективное. З. Ы.
![]() ![]() |
Автор: Helicopterr 24.1.2006, 00:40 |
Exekutor Спасибо! Хоть кто-то понял... ![]() |
Автор: DeadSoul 24.1.2006, 22:11 | ||||
Exekutor, это нормально. Просто начинающий не видит некоторые вещи, которые увидит более опытный Добавлено @ 22:19 Вот пример вопроса:
Классы A и B реализованы где-то выше. С данным классом все в порядке? |
Автор: Partizan 25.1.2006, 02:00 | ||||
Я не утверждал что предложенное мной решение единственно...тем не менее оно имеет право на существование.... но вы, согласитесь, в первом варианте решения не то совсем написали, что нужно...
Конструктор в обявлении класса и реализация разные ![]() DoublePtr( int* pInt, double* pDouble ) не есть конструктор класса DoublePtr ![]() |
Автор: DeadSoul 26.1.2006, 22:23 | ||||
Описался, блин. "Правильный" код выглядит так:
Так с этим кодом все в порядке? |