Сторінка 2 з 3

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

Додано: 16 квітня 2023, 23:03
Nick
Конкурс має ще одну категорію "SCHAU" для неігрових програм, правила якої аналогічні EXTREME-256. Я подумав, якщо у 1978-му Даніель Бріклін придумав VisiCalc, чом би у 2021-му не перетворити його в 10 рядків коду на ZX BASIC? ;)
ZXcel1.png
ZXcel2.png
ZXcel3.png
Коробкова версія у стилі Пітера Нортона: :D
Cover.png
Код програми (щиро дякую геніальному Стіву Вікерсу за VAL):
► Показати
Опис програми (англ.):
► Показати
І ця моя робота нарешті вразила поважне журі — I місце!
► Показати
Попереду був 2022-й і зовсім інші ігри... :(

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

Додано: 16 квітня 2023, 23:06
monoxrom
Мені дуже коробочка від софтини сподобалась!
Я б такий софт і прикупив))) Пора робити з ігрового спектрума, офісний пк!

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

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

Можете пограти прямо зараз.
Код гри:
► Показати
Опис гри (англ.):
► Показати
Програма отримала призове II місце, а також зіграла свою інформаційну роль — член журі не міг стримати емоцій під час гри.
► Показати
Слава Україні! 🇺🇦 Героям слава!

Конкурс BASIC 10 Liner Contest

Додано: 17 квітня 2023, 09:46
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? І чи буде вона?
Хочу, щоб більше українців приймали участь у цьому захопливому конкурсі, про який пишуть навіть вельми поважні видання.
Слава Україні! 🇺🇦 Героям слава!

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

Додано: 18 квітня 2023, 12:31
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. Деякі приклади наведено для обох, оскільки підходи Білла Гейтса і Стіва Вікерса радикально відрізнялись.

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

Додано: 18 квітня 2023, 14:14
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.

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

Додано: 18 квітня 2023, 14:17
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

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

Додано: 18 квітня 2023, 14:21
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

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

Додано: 18 квітня 2023, 14:24
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 залишає лише цілу частину (оскільки логічні операції там є, по суті, побітовими).
Інші вирази залежать від платформи і менш корисні, але все ще застосовні для специфічних завдань, заощаджуючи трохи місця в програмі.

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

Додано: 18 квітня 2023, 14:26
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.