Сначала в коде:
void printBoard() {
int d;
char far *target = Screen_base+d; // <-- right there
for(d=0;d<resolution;d++) {
вы используете переменную d
до ее инициализации.
Я предполагаю, что если вы запускаете ее в окне DOSвместо загрузки и запуска DOS kbhit
приходится выполнять больше работы (косвенно - в предоставленной среде DOS-бокса), если в очереди еще нет нажатия клавиш.
Этоне должно сильно влиять на время выполнения, но я предлагаю, чтобы в случае отсутствия нажатия клавиши вы явно установили input
на некоторую константу.Кроме того, input
действительно должен быть int
, а не символом.
Другие предложения:
vertexFrom
на самом деле ничего не делает.
A = vertexFrom(B);
можно заменить на:
A = B;
Ваши макроконстанты, в которых есть операторы, должны иметь круглые скобки вокруг них.
#define Foo x/2
быть:
#define Foo (x/2)
, чтобы вам никогда не приходилось беспокоиться о приоритетах операторов независимо от того, какой код окружает использование Foo
.
Под 16-битными ПК с архитектурой x86 на самом деле есть 4 области отображенияэто может быть переключено между.Если вы можете поменять местами 2 из них для вашей анимации, и ваша анимация должна появиться мгновенно.Это называется двойной буферизацией.У вас есть один буфер, который действует как текущий буфер отображения, и тот, который является рабочим буфером.Затем, когда вы удовлетворены рабочим буфером (и настало время, если вы пытаетесь обновить экран с определенной скоростью), вы меняете их местами.Я не помню, как это сделать, но подробности не должно быть слишком сложно найти.Я бы посоветовал вам оставить исходный буфер в покое и восстановить его после выхода, чтобы программа покидала экран практически в том состоянии, в котором она была запущена. Кроме того, вы можете использовать другой буфер для хранения отладочного вывода изатем, если вы удерживаете клавишу пробела или что-то такое, что может отображаться в этом буфере.
Если вы не хотите идти по этому пути, и «X» - единственное, что меняется, тогда вы можете отказаться от очистки экрана ипросто очистите последнюю позицию 'X'.
Разве экранный буфер не является массивом из 2 байтовых единиц - один для отображаемого символа, а другой для атрибутов?Я так думаю, поэтому я бы представлял его в виде массива:
struct screen_unit {
char ch;
unsigned char attr;
}; /* or reverse those if I've got them backwards */
Это уменьшило бы вероятность того, что вы допустите ошибки, основанные на смещениях.
Я также, вероятно, прочитал быи записать их в буфер как 16-битное значение, а не как байт, хотя это не должно иметь большого значения.