Как Вы пошли бы о реализации игры reversi? (Отелло)

Иногда бывает удобно замаскировать функцию макросом с тем же именем.

blockquote>

Макроподобные функции-обертки, такие как

static inline int actual_function(int i)
{
    /* extra stuff */
    return function(i);
}

, являются лучшим вариантом во время компиляции из-за принципа наименьшего сюрприза. (Например, вы удивляете разработчиков, они делают глупости. Поэтому, чем меньше сюрпризов, тем меньше глупых ошибок они могут совершить.)

К сожалению, это не помогает с изменением имени. Лично мне все равно, потому что переименование в любом случае быстро find . -name '*.[ch]' -exec sed -e 's|\bOLDNAME\b|NEWNAME|g' -i '{}' ';'.


Для динамически связанных символов мы можем обернуть или вставлять их собственные во время выполнения. Это сильно зависит от ОС и инструментария.

В Linux есть две опции: использование средств динамического компоновщика ( dlsym() ) или опция компоновщика --wrap. Он работает только с динамически связанными символами, но обычно, по крайней мере, стандартная библиотека связана динамически.

Проще говоря, если вы хотите заменить, скажем, динамически связанную malloc() на вашу собственную функцию, вы можете использовать

#define  _GNU_SOURCE
#include 
#include 

static void *(*real_malloc)(size_t) = NULL;

void *malloc(size_t size)
{
    if (!real_malloc)
        real_malloc = dlsym(RTLD_NEXT, "malloc");
    /* extra stuff */
    return real_malloc(size);
}

Если вы хотите сделать вышеописанное в поточно-ориентированном виде, это становится немного сложнее. (Я использую __atomic_load_n() и т. Д., Так что это всего лишь несколько строк кода.)

Проще всего сказать, что GCC должен сделать магию символов для нас, предоставив ему опцию -Wl,-wrap,malloc при компиляции и связывание двоичного файла. Затем

#include 

void *__real_malloc(size_t);

void *__wrap_malloc(size_t size)
{
    /* extra stuff */
    return __real_malloc(size);
}

На этот раз вставка / перенос выполняется на уровне таблицы символов.

6
задан Sophie Alpert 16 April 2009 в 22:53
поделиться

8 ответов

В в целом, проблемы, на которые Вы закончите тем, что работали, будут зависеть от Вас и Ваших подходов. Друг склонен говорить, что комплекс прост от другой точки зрения.

Выбор графической библиотеки зависит о том, какую игру Вы движение должно записать? OpenGL является общим выбором в этом виде проектов, но Вы могли также использовать некоторую библиотеку GUI или непосредственно просто пользоваться собственными библиотеками окон или Xorg. Если Вы собираетесь сделать воображение, просто используйте OpenGL.

Вопросы необходимо спросить:

Является C++ разумным выбором для этого проекта? Рассмотрите C и/или Python также. Мой ответ на это был бы то, что, если Вы просто хотите записать reversi, пойдите Python. Но если Вы хотите выучить низкоуровневый язык, сделайте C сначала. C++ является расширением C, поэтому существует больше для изучения там, чем существует в C. И моему судье, больше необходимо учиться на C++, не стоит усилия.

Как Вы пользуетесь графической библиотекой? Если Вы собираетесь сделать необычные эффекты, перейдите к графику сцены. Вместо этого можно просто представить reversi сетку с кнопками на нем.

Как необходимо реализовать UI, необходимо ли использовать общие понятия UI? Обычные понятия UI (работа с окнами, кадры, кнопки, строки меню, диалоговые окна) не так хороши, как люди думают, что они, существует партия работы в реализации их правильно. Примените график сцены для интерпретации входа и попробуйте различные умные пути на управление игрой. Избегайте вводных меню (они - немая и бесполезная работа), используйте параметры командной строки для большей части конфигурации.

Я все же даю Вам некоторое представление для запущения Вас:

Плата Отелло 8x8, 64 ячейки в в целом. Можно присвоить байт на каждую ячейку, которая делает его 64 байтами на каждое состояние платы. Это - 8 длинных целых, не очень вообще! Можно сохранить целый прогресс игры, и игрок не может даже заметить его. Поэтому рекомендуется реализовать плату Отелло как неизменную структуру, которую Вы всегда копируете при изменении состояния. Это также поможет Вам позже с Вашим AI и реализацией 'отмены' - функция.

Поскольку один байт может хранить больше информации, чем всего три состояния (ПУСТОЙ, ЧЕРНЫЙ, БЕЛЫЙ), я совет, Вы также обеспечите два дополнительных состояния (BLACK_ALLOWED, WHITE_ALLOWED, BOTH_ALLOWED). Можно вычислить эти значения при копировании нового состояния.

Алгоритм для проверки, куда можно поместить блок, мог пойти плата через один за другим, затем проследить от пустых ячеек до каждого направления для regex-шаблонов: B+W => W^, W+B => B^ Таким образом, можно инкапсулировать игровые правила в простом интерфейсе, который заботится обо всем этом.

2
ответ дан 8 December 2019 в 17:29
поделиться

Проблемы...

Ну, просто убедитесь при записи части стратегии игры, чтобы не просто сделать перемещение, которое дает Вам большинство частей. Необходимо также дать вес позиции платы. Например, учитывая возможность поместить часть в угол платы должен взять приоритет над любым другим перемещением (помимо выигрывания игры), поскольку та часть никогда не может возвращаться. И, размещение части, смежной с угловым местом, является примерно худшим перемещением, которое можно когда-либо делать (если угловое пространство открыто).

Надеюсь, это поможет!

3
ответ дан 8 December 2019 в 17:29
поделиться

Поскольку парни предлагали мою идею сказать Вам для размышления сначала для алгоритмов и игровой логики. следующий ответ для меня был графической библиотекой, он зависит от Вашей целевой платформы, языка программирования, платформа и т.д. Но поскольку я предлагаю, использует C# с Каиром 2D графическая библиотека, которая можно достигнуть этой использующей Моно платформы (который затем можно быть нацелены на все три главных операционных системы для игры для работы)-> www.mono-project.org. Между тем я нашел это, я думаю, что и этот вид ресурса поможет Вам: http://home.datacomm.ch/t_wolf/tw/misc/reversi/html/index.html. Но если Вы заканчиваете это, можно попытаться реализовать Судоку.

2
ответ дан 8 December 2019 в 17:29
поделиться

Как упомянуто другими, я начал бы путем получения глубокого понимания геймплея и стратегий и включенных алгоритмов. Эта ссылка может быть полезна для Вас, она описывает основную стратегию Отелло и алгоритмы:

http://www.site-constructor.com/othello/Present/Basic_Strategy.html

2
ответ дан 8 December 2019 в 17:29
поделиться

Вы захотите изучить минимакс с сокращением альфы - беты, если Вы запишете AI для проигрывания против. Ваша любимая поисковая система будет иметь много для высказывания относительно темы.

2
ответ дан 8 December 2019 в 17:29
поделиться

После взятия сильного удара в игровой логике сами пойдите глава 18 чтения выдающейся книги Peter Norvig Парадигмы Программирования AI. (Исходный код здесь.) Это имеет довольно короткую и чрезвычайно читаемую программу, которая может ударить примерно зад любого человека; необходимо изучить много путем сравнения решения его.

2
ответ дан 8 December 2019 в 17:29
поделиться

Reversi должен быть очень простой игрой для реализации. Это прекрасно для изучения некоторых основных алгоритмов теории игр (конкретно минимакс) во время реализации AI.

Одна вещь отметить на AI состоит в том, что совершенно возможно сделать идеальный AI для Reversi (тот, который всегда выигрывает, неважно, перемещения его противника). Таким образом на стороне стратегии, если Ваш AI проигрывает, Вы все еще должны проделать работу :)

0
ответ дан 8 December 2019 в 17:29
поделиться

Я записал reversi игру много лет назад, когда я был все еще в школе. Его стратегия была очень проста, она просто пошла для максимального количества частей, но взвесила так, она предпочла края и особенно углы и не любила квадраты, которые рискнули выдавать углы.

Это работало довольно хорошо против людей, которые еще не разработали то, что это делало, но после того как у Вас был он, было очень просто в использовании его стратегия против него. Я не горд сказать, однако, что это избило меня первые несколько раз даже при том, что я записал это!

Надлежащий AI с несколькими перемещениями предвидения намного более сложен. Должна быть интересная проблема, но в то время, когда я больше интересовался пользовательским интерфейсом.

0
ответ дан 8 December 2019 в 17:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: