Конкурс BASIC 10 Liner Contest

Програмування під ретрокомп'ютери, відеоігрові приставки тощо, усіма мовами — Assembler, BASIC, Forth, ...

Модератор: Nick

Аватар користувача
Nick
Адміністратор
Повідомлень: 66
З нами з: 03 квітня 2023, 11:38
Звідки: Бандерштадт
Дякував (ла): 41 раз
Подякували: 30 разів
Контактна інформація:

Re: Конкурс BASIC 10 Liner Contest

Повідомлення Nick »

Конкурс має ще одну категорію "SCHAU" для неігрових програм, правила якої аналогічні EXTREME-256. Я подумав, якщо у 1978-му Даніель Бріклін придумав VisiCalc, чом би у 2021-му не перетворити його в 10 рядків коду на ZX BASIC? ;)
ZXcel1.png
ZXcel2.png
ZXcel3.png
Коробкова версія у стилі Пітера Нортона: :D
Cover.png
Код програми (щиро дякую геніальному Стіву Вікерсу за VAL):
► Показати
Опис програми (англ.):
► Показати
І ця моя робота нарешті вразила поважне журі — I місце!
► Показати
Попереду був 2022-й і зовсім інші ігри... :(
У вас недостатньо прав для перегляду приєднаних до цього повідомлення файлів.
Співзасновник та директор Museum of Computer Technology // Музей Комп'ютерних Технологій.
"If you think you are too old to rock 'n roll, then you are".
Аватар користувача
monoxrom
Повідомлень: 173
З нами з: 05 квітня 2023, 17:45
Звідки: Ivano-Frankivsk
Дякував (ла): 53 рази
Подякували: 119 разів

Re: Конкурс BASIC 10 Liner Contest

Повідомлення monoxrom »

Мені дуже коробочка від софтини сподобалась!
Я б такий софт і прикупив))) Пора робити з ігрового спектрума, офісний пк!
Аватар користувача
Nick
Адміністратор
Повідомлень: 66
З нами з: 03 квітня 2023, 11:38
Звідки: Бандерштадт
Дякував (ла): 41 раз
Подякували: 30 разів
Контактна інформація:

Re: Конкурс BASIC 10 Liner Contest

Повідомлення Nick »

Конкурс традиційно проходив на початку весни (26.03.2002—9.04.2002). Але через навалу московитів було зовсім не до ігор на BASIC. Втім, кремлівська наволоч власне і добивалася руйнації звичного життя мільйонів українців, тож у певний момент я вирішив прийняти участь у конкурсі (категорія EXTREME-256 для платформи MSX). Гру NLAW, яка мала нести не лише розважальну функцію, писав під час повітряних тривог, коли крилаті ракети московитів падали на наші міста, в тому числі й на стародавній Львів. Військовослужбовець у траншеї має зупинити навалу танкової роти москалів. Після використання протитанкової ракети треба взяти іншу з верхнього чи нижнього краю траншеї, і так до знищення всіх танків противника. Кожен наступний танковий взвод рухається швидше за попередній, наприкінці гри треба знищити командирську машину:
NLAW.png

Можете пограти прямо зараз.
Код гри:
► Показати
Опис гри (англ.):
► Показати
Програма отримала призове II місце, а також зіграла свою інформаційну роль — член журі не міг стримати емоцій під час гри.
► Показати
Слава Україні! 🇺🇦 Героям слава!
У вас недостатньо прав для перегляду приєднаних до цього повідомлення файлів.
Співзасновник та директор Museum of Computer Technology // Музей Комп'ютерних Технологій.
"If you think you are too old to rock 'n roll, then you are".
Аватар користувача
Nick
Адміністратор
Повідомлень: 66
З нами з: 03 квітня 2023, 11:38
Звідки: Бандерштадт
Дякував (ла): 41 раз
Подякували: 30 разів
Контактна інформація:

Конкурс BASIC 10 Liner Contest

Повідомлення Nick »

Всю зиму 2022-2023 московити обстрілювали енергетичну інфраструктуру, намагаючись поставити наш нарід на коліна. Завдяки їх потугам мені довелося не один раз запускати інверторний генератор, втім особливих незручностей кремлівська наволоч не завдала в першу чергу завдяки філігранній роботі українських сил ППО. Тому сюжет наступної гри був наперед визначений: NASAMS defends Ukraine, а реалізовано її було в категорії EXTREME-256 для платформи MSX:
SCRSHOT1.PNG
SCRSHOT2.PNG
SCRSHOT3.PNG
SCRSHOT4.PNG

Можете пограти прямо зараз.
Код гри:
► Показати
Опис гри (англ.):
► Показати
Можливо, поважне журі трохи втомилося від війни, бо гра зайняла лише 9-те місце:
► Показати
Втім, я отримав ось такий фідбек:
Yes, I think it's hard for us to understand how difficult it really is to live in Ukraine these days. Daily life somehow goes on - for a year now - despite the mortal threat. Your games play like "normal" war games from the 80's that I played detached from their meaning in my youth. Now when I play your games, it's a completely different experience. I have to remember that it has a real, horrible background. It triggers emotions in me. You have found a way to express your anger, your sadness, your fighting spirit, your hope and your fear and send it out into the world.
а також визнання мого скромного таланту геймдизайнера у зовсім несподіваному місці. :D
Яка гра буде наступною? Нептун? HIMARS? І чи буде вона?
Хочу, щоб більше українців приймали участь у цьому захопливому конкурсі, про який пишуть навіть вельми поважні видання.
Слава Україні! 🇺🇦 Героям слава!
У вас недостатньо прав для перегляду приєднаних до цього повідомлення файлів.
Співзасновник та директор Museum of Computer Technology // Музей Комп'ютерних Технологій.
"If you think you are too old to rock 'n roll, then you are".
Аватар користувача
Nick
Адміністратор
Повідомлень: 66
З нами з: 03 квітня 2023, 11:38
Звідки: Бандерштадт
Дякував (ла): 41 раз
Подякували: 30 разів
Контактна інформація:

Re: Конкурс BASIC 10 Liner Contest

Повідомлення Nick »

Маю надію, що хтось з читачів спробує себе у написанні екстремально коротких ігор (чи інших програм) на BASIC, та прийме участь у наступному конкурсі. Хочу поділитися деякими загальними роздумами та специфічними прийомами програмування.

Можливо ви великий фанат певного ретрокомп'ютера, скажімо [ur=https://en.wikipedia.org/wiki/ZX81l]Sinclair ZX81[/url]. Але це не означає, що він є хорошим вибором для вашої 10-рядкової гри, якщо тільки метою не є участь без перемоги. Наприклад, Microsoft BASIC у Mattel Aquarius дозволяє лише 72 символи у рядку. Це один втрачений рядок у PUR-80, бо 72×10=80×9. Було багато надходжень для цієї платформи, але жодне не виграло зі зрозумілих причин. Деякі діалекти, зокрема Бейсик Вільнюс у БК0010-01, забороняють декілька операторів у одному рядку, роблячи задачу програміста вкрай складною.

Деякі платформи мають функції, корисні для створення ігор на BASIC. Незважаючи на згадане обмеження довжини рядка, Mattel Aquarius пропонує набір символів, що містить ігрових персонажів, стіни, вибухи тощо. Меншою мірою це стосується набору символів Commodore PETSCII та деяких інших платформ. Таким чином, можна виводити таких персонажів (PRINT) або заносити їх безпосередньо у відеопам’ять (POKE), створюючи привабливу ігрову графіку:
AquariusCharset.png
Іноді платформа не визначає псевдографічні символи, але користувач може перепрограмувати окремі гліфи. Це додає ще більше гнучкості, проте не безкоштовно — визначення нових символів (часто в операторах DATA) займає місце у програмі. ZX Spectrum пропонує UDG (User Defined Graphics) для цієї мети:
ColorLines.png
Є платформи з багатими можливостями, такі як MSX. Ви можете визначити апаратні спрайти у спосіб подібний до UDG символів, але позиціонувати їх з піксельною точністю (PUT SPRITE), і пересувати заданням нових координат без жодної потреби у відновленні фону в попередній позиції:
SCRSHOT2.PNG
Останнім, але не менш важливим, є швидкодія обраної платформи. Деякі комп'ютери та діалекти BASIC є повільнішими за інші, і певні алгоритми просто не підходять для реалізації на ретроплатформі.

Нижче ми називатимемо MS BASIC інтерпретатори Microsoft (включно з MSX і PC), а інтерпретатори Sinclair — ZX BASIC. Деякі приклади наведено для обох, оскільки підходи Білла Гейтса і Стіва Вікерса радикально відрізнялись.
У вас недостатньо прав для перегляду приєднаних до цього повідомлення файлів.
Співзасновник та директор Museum of Computer Technology // Музей Комп'ютерних Технологій.
"If you think you are too old to rock 'n roll, then you are".
Аватар користувача
Nick
Адміністратор
Повідомлень: 66
З нами з: 03 квітня 2023, 11:38
Звідки: Бандерштадт
Дякував (ла): 41 раз
Подякували: 30 разів
Контактна інформація:

Re: Конкурс BASIC 10 Liner Contest

Повідомлення Nick »

Цілочисельні обчислення

Деякі діалекти, такі як Integer BASIC Стіва Возняка для Apple II, оперують виключно цілими числами. Інші, як то ранні інтерпретатори Microsoft, завжди працюють з плаваючою комою.
MSX BASIC та подібні діалекти пропонують як цілі, так і числа з плаваючою комою. Додавання суфікса % до імені змінної робить її цілочисельною, і код, що оперує цілочисельними змінними, працюватиме набагато швидше, що дуже корисно для програмування ігор.

Але в програмі з 10 рядків кожен символ має значення, і % після кожної змінної наближає нас до межі. На щастя, є рішення:

Код: Виділити все

DEFINT A-Z
оголошує всі змінні цілочисельними. Ви можете оголосити підмножину, наприклад імена, що починаються з C, I, J та K:

Код: Виділити все

DEFINT C,I-K
Якщо є багато рядкових змінних, той самий підхід можна застосувати, щоб усунути зайві суфікси $:

Код: Виділити все

DEFSTR A-D,S
оголошує рядкові змінні, імена яких починаються на A, B, C, D і S.
Співзасновник та директор Museum of Computer Technology // Музей Комп'ютерних Технологій.
"If you think you are too old to rock 'n roll, then you are".
Аватар користувача
Nick
Адміністратор
Повідомлень: 66
З нами з: 03 квітня 2023, 11:38
Звідки: Бандерштадт
Дякував (ла): 41 раз
Подякували: 30 разів
Контактна інформація:

Re: Конкурс BASIC 10 Liner Contest

Повідомлення Nick »

Приберіть зайве

Усуньте пробіли, де це можливо. Для Microsoft BASIC немає різниці між

Код: Виділити все

1 FOR I=1 TO 10
та

Код: Виділити все

1FORI=1TO10
У деяких діалектах ви також можете опускати нулі в операторах DATA:

Код: Виділити все

DATA 1,0,2,0,0,3
дорівнює

Код: Виділити все

DATA1,,2,,,3
Нумерація рядків від 0 дає вам один додатковий символ, оскільки останній рядок буде 9 замість 10. Іноді цей дешевий трюк врятує ваш проєкт.
До речі, оператори DATA дозволені скрізь. Якщо є заповнені рядки, які не досягають ліміту категорії, ви можете помістити DATA туди:

Код: Виділити все

1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:DATA1,2,3,4,5
2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:DATA6,7
3 xxxxxxxxxxxxxxxxxxxxxxxxxxxx:DATA8,9,Hello,World
де xx…xx є деяким значущим кодом на BASIC.
Крім того, DATA/READ може усунути присвоєння, ще більше стиснувши ваш код на ZX BASIC:

Код: Виділити все

1 LET a=16384: LET x=128: LET y=96: LET u=32: LET v=0: LET w=80
можна записати як

Код: Виділити все

1 READ a,x,y,u,v,w: DATA 16384,128,96,32,0,80
Співзасновник та директор Museum of Computer Technology // Музей Комп'ютерних Технологій.
"If you think you are too old to rock 'n roll, then you are".
Аватар користувача
Nick
Адміністратор
Повідомлень: 66
З нами з: 03 квітня 2023, 11:38
Звідки: Бандерштадт
Дякував (ла): 41 раз
Подякували: 30 разів
Контактна інформація:

Re: Конкурс BASIC 10 Liner Contest

Повідомлення Nick »

Ліворуч чи праворуч?

Найбільш типова проблема в грі - керувати якимось об'єктом за допомогою клавіатури. Розглянемо один вимір, де x — горизонтальна координата, а дозволений діапазон — від 0 до 199. Наш BASIC не підтримує конструкцію ELSE. Клавіша [o] використовується для переміщення вліво, а [p] — вправо:

Код: Виділити все

0 LET x=99
1 REM Draw sprite
2 LET k$=INKEY$ : IF k$="" THEN GOTO 2
3 IF k$="o" AND x>0 THEN LET x=x-1
4 IF k$="p" AND x<199 THEN LET x=x+1
5 GOTO 1
Нам безумовно потрібен більш компактний спосіб виразити дії, зроблені в рядках 3 і 4.
У ZX BASIC результатом логічного виразу, наприклад k$="o" AND x>0, є або 1 (істина), або 0 (хиба). Отже, ми можемо вилучити рядки 4-5 і переписати рядок 3 як:

Код: Виділити все

3 LET x=x-(k$="o" AND x>0)+(k$="p" AND x<199) : GOTO 1
Як це працює?

[o] і може рухатися вліво: x = x-1+0 = x-1
[p] і може рухатися вправо: x = x-0+1 = x+1
жодне: x = x-0+0 = x

У MS BASIC результатом логічного виразу є -1 (істина) або 0 (хиба), тому нам просто потрібно змінити знаки:

Код: Виділити все

3 x=x+(k$="o" AND x>0)-(k$="p" AND x<199) : GOTO 1
Щоб перемістити об’єкти з заданим кроком (наприклад, 8), просто помножте відповідний логічний вираз:

Код: Виділити все

3 x=x+8*(k$="o" AND x>0)-8*(k$="p" AND x<199) : GOTO 1
Співзасновник та директор Museum of Computer Technology // Музей Комп'ютерних Технологій.
"If you think you are too old to rock 'n roll, then you are".
Аватар користувача
Nick
Адміністратор
Повідомлень: 66
З нами з: 03 квітня 2023, 11:38
Звідки: Бандерштадт
Дякував (ла): 41 раз
Подякували: 30 разів
Контактна інформація:

Re: Конкурс BASIC 10 Liner Contest

Повідомлення Nick »

"Булеві" фокуси

Тут ми поговоримо про кон'юнкцію і диз'юнкцію. Незважаючи на назву розділу, результати цих операцій не є булевими і відрізняються між діалектами. Розглянемо тестову програму:

Код: Виділити все

1 PRINT "1. "; 2>1 AND 13
2 PRINT "2. "; 2<1 AND 13
3 PRINT "3. "; 2>1 OR 13
4 PRINT "4. "; 2<1 OR 13
5 PRINT "5. "; 13 AND 2>1
6 PRINT "6. "; 13 AND 2<1
7 PRINT "7. "; 13 OR 2>1
8 PRINT "8. "; 13 OR 2<1
яка виведе такі результати:
+----+---------+
|Test|  BASIC  |
|    +----+----+
| No.| MS | ZX |
+----+----+----+
|  1 | 13 |  1 |
|  2 |  0 |  0 |
|  3 | -1 |  1 |
|  4 | 13 |  1 |
|  5 | 13 | 13 |
|  6 |  0 |  0 |
|  7 | -1 |  1 |
|  8 | 13 | 13 |
+----+----+----+
Найкорисніший результат показаний у тестах 5 і 6. В обох діалектах,

Код: Виділити все

IF e THEN LET x=v ELSE LET x=0
можна записати як

Код: Виділити все

LET x=v AND e
де e — логічний вираз, а v — будь-яке ціле число. Якщо v є з плаваючою комою, трюк також працює для ZX BASIC, тоді як MS BASIC залишає лише цілу частину (оскільки логічні операції там є, по суті, побітовими).
Інші вирази залежать від платформи і менш корисні, але все ще застосовні для специфічних завдань, заощаджуючи трохи місця в програмі.
Співзасновник та директор Museum of Computer Technology // Музей Комп'ютерних Технологій.
"If you think you are too old to rock 'n roll, then you are".
Аватар користувача
Nick
Адміністратор
Повідомлень: 66
З нами з: 03 квітня 2023, 11:38
Звідки: Бандерштадт
Дякував (ла): 41 раз
Подякували: 30 разів
Контактна інформація:

Re: Конкурс BASIC 10 Liner Contest

Повідомлення Nick »

Такий потрібний ENDIF

Недоліком більшості інтерпретаторів BASIC є відсутність оператора ENDIF. Конструкції THEN і ELSE (за наявності) діють до кінця рядка. Це значно ускладнює вираження ваших ідей у десяти рядках.

Код: Виділити все

0 REM This is just a dream
1 INPUT x: IF x > 5 THEN PRINT "Here": ENDIF: PRINT "There"
Деякі прийоми для подолання цього обмеження вже були представлені вище. Але є спосіб написати явний IF ... ENDIF: просто використовуйте оператор FOR ... NEXT.

Код: Виділити все

0 REM This is reality (ZX BASIC)
1 INPUT x: FOR i=1 TO x>5: PRINT "Here": NEXT i: PRINT "There"
Як відомо, x>5 дає 1 для істинної умови, тому цикл буде виконано один раз. Для хибної умови він перетворюється на FOR i=1 TO 0, тому тіло циклу буде пропущено.
Для MS BASIC x>5 дає -1 для істинної умови, тому ми можемо записати це як:

Код: Виділити все

0 REM Is this still just a dream? (MS BASIC)
1 INPUT x: FOR i=x>5 TO -1: PRINT "Here": NEXT: PRINT "There"
На жаль, Білл Гейтс вирішив виконати тіло циклу, перш ніж перевірити умову його завершення, і трюк не працює на ранніх інтерпретаторах Microsoft, включно з MSX BASIC. Однак він працює на IBM PC.
Співзасновник та директор Museum of Computer Technology // Музей Комп'ютерних Технологій.
"If you think you are too old to rock 'n roll, then you are".
Відповісти

Повернутись до “Програмування під ретроплатформи”