FoxHunt на P_EMUL2021

Все о разработке ПО для ПК-01,02 "Львов" на современных платформах
als
Posts: 426
Joined: 18 May 2016, 19:55

Re: FoxHunt на P_EMUL2021

Post by als »

04.7z
(16.16 KiB) Downloaded 1323 times
PROCEDURE Menu;
Ну как-то приблизительно так

Code: Select all

PROCEDURE Menu;
  VAR key: byte;
BEGIN
  REPEAT
    m.CLS;//    m.PUTCHAR(m.ClrScr); (* Clear screen *)
    m.CURSOR(7, 9); m.PUTSTR('F O X H U N T !'+#0);
    m.CURSOR(5, 11); m.PUTSTR('1. ИГРАТЬ'+#0);
    m.CURSOR(5, 12); m.PUTSTR('2. ПОМОЩЬ'+#0);
    m.CURSOR(5, 13); m.PUTSTR('3. НАСТРОЙКИ'+#0);

    m.CURSOR(0, 19); m.PUTSTR('АВТОР ИДЕИ: А. НЕСЧЕТНЫЙ, 1985'+#0);
    m.CURSOR(0, 20); m.PUTSTR('ZX - РЕАЛИЗАЦИЯ BY YPRIT , 2020'+#0);
    m.CURSOR(0, 21); m.PUTSTR('РК86 - ПОРТ BY OLEG N.CHER, 2021'+#0);
    m.CURSOR(0, 22); m.PUTSTR('ПК-01"Львов" - ПОРТ BY ALS, 2021'+#0);
    REPEAT
//      m.RANDOMIZE(seed); INC(seed);
      key := m.GETKEY;
    UNTIL (key >=$31 {'1'}) and (key <=$33 {'3'});
    Beep;
//    m.CURSOR(22, SHORT(ORD(key) - 38));
//    m.PUTSTR(7FX+7FX+7FX+7FX+7FX+7FX+7FX+7FX+7FX+7FX+7FX
//      +7FX+7FX+7FX+7FX+7FX+7FX+7FX+7FX+7FX+7FX+7FX+7FX);
//    m.WAIT(1000); (* Delay *)
    CASE key OF
      {'2'}$32:Help;
      {'3'}$33:Settings;
    ELSE
    END;
  UNTIL key = $31;
END;/// Menu;

als
Posts: 426
Joined: 18 May 2016, 19:55

Re: FoxHunt на P_EMUL2021

Post by als »

НЕ!
Ты знаешь. надо все таки выводить графикой, - поле и текстом - кол-во лис!
соответственно мне её по своему надо переписывать "поглядывая" на твои исходники!

да и если поле 11х11 (странно почему не 10х10 или то ты максимально возможное )
то колво лис должно быть не более 9! чтобы одним числом указывать!
Ну пока пока пауза и сосредоточусь по другому это всё делать!
Буду делать пробы графики... с текстом... кубики... и т.д.
Zorko
Posts: 100
Joined: 20 Apr 2021, 05:09

Re: FoxHunt на P_EMUL2021

Post by Zorko »

als wrote: 15 Jun 2021, 11:23procedure CURSOR(x,y:Byte);
вместо Byte то надо INT8 ?
или INT8 тоже вроде "минусовый"...
слушай, что-то я запутался...
ты конечно объяснял это где-то, но то уже найти где это, очень сложно!
Объясни пожалуйста еще раз да я пропишу (и буду прописывать) в модуль(модули) раз и навсегда!
SYSTEM.BYTE - тип нестандартный для Оберона-3, беззнаковый и системный, вмещает {0..255}

Соответственно, для его использования надо импортировать модуль SYSTEM. Так сделано, чтобы его не юзали где попало и почём зря. Ну да это долгий разговор.

INT8 тип несистемный, вмещает {-128..127}. Прямое использование и смешивание этих типов в выражениях неявно вычисляется в пределах типа INT16 (со знаком). Это стандартный подход Си, чтобы не терять разрядов при вычислениях (например: (255+1)*3 не приведёт к 0*3, т.к. переполнение не случится. Так сделано по многим причинам. Но это же и проблема для слабых процов.

Я к тому, что смешивать в выражении типы SYSTEM.BYTE и INT8 ты конечно можешь, но результат надо вмещать в тип INT16, а если его надо присвоить типу SYSTEM.BYTE, то возможны потери разрядов (логично). То же самое с INT8, поэтому в Обероне традиционно применяется встроенная операция усечения SHORT, пример: int8 := SHORT(int16 + int16 + byte);

Здесь SHORT даёт понять, что вероятна потеря разрядов. Кстати, в Ofront'е+ есть возможность внедрить в код проверки на выход за пределы разрядности. Притом этот код не обязательно отладочный, он может остаться и в рабочей программе. Для надёжности. Но это конечно не про восьмибитки.

Ты юзай SYSTEM.BYTE там, где допускаются беззнаковые байты, особенно для системных нужд. Я его активно юзаю в качестве параметров для системных функций. Здесь явный SHORT не нужен, поэтому код не смотрится загромождённым. А тип INT8 нужен там, где нужно хранить числа со знаком.

Но все вычисления всё равно происходят в рамках INT16, даже сдвиги. Если бы я даже захотел сделать на Обероне иначе, то нижний уровень (Си) мне бы этого просто не позволил.
als wrote: 15 Jun 2021, 12:00is_only1 := ~is_only1;
понимать как
is_only1 := not is_only1;
Ну да.
als wrote: 15 Jun 2021, 13:30Не--е-е-е-е
текст тут надо сплошным выводить! Без всяких понтов типа рамочек!
Да пожалуйста.

Разобрался с кодировками русских букв в XDev? (директива (*$866*) )
als wrote: 15 Jun 2021, 16:46надо все таки выводить графикой, - поле и текстом - кол-во лис!
Можно выводить графикой кол-во лис. Нарисовать десятку.

Видишь, я игру не создавал, а портировал. Могу перенаправить твой вопрос автору оригинала - Савелию Иванкову, зачем он так сделал.
Zorko
Posts: 100
Joined: 20 Apr 2021, 05:09

Re: FoxHunt на P_EMUL2021

Post by Zorko »

als wrote: 15 Jun 2021, 11:19Типы
char ? Byte ? string255 ?
в процедурах
procedure PUTCHAR(ch:char);
procedure CURSOR(x,y:Byte);
procedure PUTSTR(s:string255);

С таким проблем в Обероне не будет ? Можна такие типы в входящими в процедуры применять ? и т.д.
Типа strings255 в Обероне нет. Можно определить:

Code: Select all

IMPORT SYSTEM;

TYPE
  string255ptr = POINTER TO ARRAY 256 OF CHAR; (* это указатель! *)
  string255 = ARRAY 256 OF CHAR; (* это строка! *)
Вах, сейчас опять скажешь, что я пытаюсь тебя запутать. Ты, в общем, учитывай, что если в PUTSTR будет параметр-чисто строка, то будет и операция копирования строки, т.е. переброса её из одного куска памяти в другой. А если указатель - то такой операции не будет. Так что юзай тут указатель. У нас есть такой системный тип, я тебе показал как он описывается выше. Он совместим по передаче параметров с любой строкой.

CHAR и BYTE - да, такие же, как в Дельфи.

Code: Select all

  Type
     INT8=Byte; (* Неа. INT8 = -128..127; или Shortint, раз он -128..127 signed 8-bit *)
     INT16=Word; (* Неа. INT16 = -32768..32767; или Smallint, раз он -32768..32767 signed 16-bit *)
als wrote: 15 Jun 2021, 11:19А тогда к какому типу у обероне приравнивать дельфийский Word ?
В Обероне такого типа нет.
als wrote: 15 Jun 2021, 11:19...что можна прописать аналогами и как из того что может очень пригодится ?
Ну есть ещё INT32 и INT64, но зачем они. Смысла нет.
als wrote: 15 Jun 2021, 11:19"repeat .... until" - в Обероне без проблем ? В таком виде как написано в FoxHunt.dpr
в процедуре PrintField; ?
Да.
als wrote: 15 Jun 2021, 11:19 А что это за....
Flag = 1CX; (* 9X, 0BX, 1EX *)
Fox = 1DX; (* 9X, 0EX, 1EX *)
Это равносильно
Flag = $1C;
Fox = $1D;
Да.
als wrote: 15 Jun 2021, 11:19 вот еще дельфя не понимает
field, number: ARRAY Xm, Ym OF INT8;
opened, marked: ARRAY Xm, Ym OF BOOLEAN;

т.е. в дельфе надо указывать как-то так:
field, number: ARRAY[1..Xm,1..Ym]OF INT8;
opened, marked: ARRAY[1..Xm,1..Ym] OF BOOLEAN;
Это верно ?
Нет. Индексы в Обероне всегда от 0. Надо так:

Code: Select all

  field, number: ARRAY[0..Xm-1,0..Ym-1]OF INT8;
  opened, marked: ARRAY[0..Xm-1,0..Ym-1] OF BOOLEAN;
als wrote: 15 Jun 2021, 11:19 Понятное дело всё равно будут разные "приколы" типа
в IF .... THEN .... ELSE ... END;
что если в дельфи несколько команд после "THEN" и/или "ELSE" то надо в "BEGIN... END;",
а Обероне это вроде как по другому.... с одним "END;" без всяких "THEN BEGIN" и "ELSE BEGIN"...
Но согласись что для портации, переброски из Дельфи в оберон, это всё такие мелочи....
что и разговаривать не стоит за них!
Ну наверное.

Возможно, стоит потом написать препроцессор, переводящий одно в другое.
als
Posts: 426
Joined: 18 May 2016, 19:55

Re: FoxHunt на P_EMUL2021

Post by als »

Попытки FoxHunt писать с расчётом "переброски" (компиляции в ЛВТ) на XDev прекращены!
Далее, коль уже начал FoxHunt, буду писать её с расчётом "переброски" (компиляции в ЛВТ) на МАДЛ01!
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest