init_tables

Тема в разделе "Машинное отделение", создана пользователем Orlov, 13 май 2007.

  1. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Не вижу(не понимаю) разницу :

    static void init_tables(void) {
    int i;
    for(i=0; i<128; i++) PawnRank[WHITE] = PawnRank[BLACK][i^0x70] = rank(i);
    }

    и

    static void init_tables(void) {
    int i;
    for(i=0; i<128; i++) PawnRank[WHITE] = PawnRank[BLACK] = rank(i);
    }

    результат(вывод на экран значений с помощью printf) одинаков.

    Заранее благодарен за ответ!
  2. Mustitz Заслуженный

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    30.09.2006
    Сообщения:
    3.546
    Симпатии:
    1.265
    Репутация:
    36
    Адрес:
    Киев
    Оффлайн
    Ну... в первом случае
    PawnRank[WHITE][0] = PawnRank[BLACK][0x70] = rank(0);
    PawnRank[WHITE][0x70] = PawnRank[BLACK][0] = rank(0x70);
    во втором
    PawnRank[WHITE][0] = PawnRank[BLACK][0] = rank(0);
    PawnRank[WHITE][0x70] = PawnRank[BLACK][0x70] = rank(0x70);

    Отличия:
    в первом случае PawnRank[BLACK][0] = rank(0x70)
    во втором сдучае PawnRank[BLACK][0] = rank(0)

    А вообще, ты просто получишь, что ранги для черных пешек будут такими же, как и для белых. И в самом начале у тебя у черных должен быть коллосальный перевес (все пешки на предпоследней горизонтали).
  3. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    а вот это "i^0x70" вообще что значит? Разница в шесть горизонталей?
  4. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Xor 0111 000 Это не разница в 7 горизонталей, а переворот доски...

    Было 0 стало 7
    Боло 1 стало 6
    Было 2 стало 5
    Было 3 стало 4

    Первый байт - номер горизонтали (0..7) и Xor-ом горизонталь для черных инвентируется.
  5. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    спасибо большое, въехал :)
  6. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    а можно это в каком-то более понятном виде записать?
  7. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    вот так что-ли ?

    for(i=0; i<128; i++) PawnRank[WHITE] = PawnRank[BLACK][127-i] = rank(i);
  8. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Нет, не правильно. Понятней чем Xor-ом через одно измерение не записать.
    Если бы было два изменрения, то можно было-бы записать вот так [7-i][j] но вообще и XOR должен быть понятен...
  9. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    В таких случаях лучше всего просто оставить рядом комментарий поясняющий, что происходит.
  10. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    может быть так?

    for(i=0; i<128; i++) PawnRank[WHITE] = PawnRank[BLACK][(128/16)-i] = rank(i);
  11. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Я канешн звиняюсь, но почему не писать в две строчки, по людски

    for(i=0; i<128; i++) {
    PawnRank[BLACK] = rank(i);
    PawnRank[WHITE] = PawnRank[BLACK][(128/16)-i];
    }
  12. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн

    Не столь важно как написать. Важно понимать что пишешь. Мне не нравиться все что не очень понятно.
    (Биты, ксоры, сдвиги) Вот и стремлюсь к десятичной форме :)
  13. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Но почему тогда 128/16? Оно же всегда будет 8.
  14. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Почему? из-за вот этого? #define rank(x) ((x)>>4)
  15. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    PawnRank[WHITE] = PawnRank[BLACK][(128/16)-i];

    и

    PawnRank[WHITE] = PawnRank[BLACK][8-i];

    Разве не одно и тоже?


    При чём здесь вообще rank(x) ?
  16. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн

    как причем?

    for(i=0; i<128; i++) PawnRank[WHITE] = PawnRank[BLACK][i^0x70] = rank(i);
    вопрос: можно ли обойтись без этого i^0x70 ?
  17. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Такое впечатление что говорят слепой с глухим :) Кто нить третий обьясните, плииз.
  18. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    да, не помешало бы :)
  19. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Обясняю. Если не понимаешь битовые опрации - сделай представление доски в виде двумерного массива.
  20. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    а разве невозможно использовать одномерный массив (к примеру [0..77]) и оперировать при этом десятичными числами?
  21. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    К сожелению числа в памяти компьютера не представляются в виде десятичных чисел.
    И используя двумерный массив ты не очень потеряешь в скорости, но хоть будешь понимать что ты делаешь.
    Например в генераторе ходов коня запись Board[i+1][j+2] будет намного понятней, и выход за пределы доски при помощи And (0x88) Тоже менее понятен чем условие по координатам. А если хочешь чтоб было быстро придется использовать битовое представление адреса, а оно в любом случае двоичное.
  22. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Лучше доску сделать в виде массива из 120 элементов. Там все просто и понятно.
  23. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    да, но ход коня прекрасно можно описать и в массиве 0..77 при помощи десятичных чисел Board[i+12](к примеру), если массив имеет вид:

    0 1 2 3 4 5 6 7

    10 11 12 13 14 15 16 17

    .....
  24. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Если не понимаешь битовые операции, имеет смысл на время отложить шахматное программирование, и инвестировать часть времени в их понимание. Потому что эта вещь для программиста - из разряда необходимого минимума знаний, который пригодится не только для шахмат.
  25. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    WinPooh, а если человек просто для развлечения хочет написать шахматную программу? Зачем ему необходимый минимум знаний?
    И без него можно сделать программу, которая играет на 1700.

    массиве 0..77 - это безобразие. Используй 0..120!
  26. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    А какова структура 0..120 ?
  27. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    10x12
    Чтоб ход коня за пределы массива не выходил.
  28. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Ну тогда уж нужно 12х12
  29. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Наивный :)
  30. Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
    Обалдеть! История со Стрелкой вызвала огромный интерес к написанию движков: Orlov, ProstoTak, krey. Я тоже решился доделать свой :D .
  31. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    [​IMG]
    Ну и каким образом 2-й случай не выходит за доску?
  32. TopicStarter Overlay

    Orlov Учаcтник

    • Участник
    Рег.:
    27.02.2007
    Сообщения:
    177
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    почему безобразие? и чем лучше 0..120? Идеология наверное одна и таже?
  33. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.709
    Симпатии:
    50
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    тьфу на вас! читаю:
    думаю, что же это за доска из 78 клеток?!:rolleyes:
    читаю дальше...
    задумываюсь сильнее :/
    и доходит!!! :lol:
    оказывается, 0..77 - это [8][8]!!! :cool: если понятней десятичные операции, зачем писать в восьмеричной системе?
  34. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.709
    Симпатии:
    50
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    да ладно вам :) я шахматный движок начал писать в 2004г. как начали фигуры с доски пропадать - забросил это дело ;)
  35. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Надеюсь у соперников твоей хитрой проги :cool:

Поделиться этой страницей