Вход

Просмотр полной версии : Snake в 93 байт



Firestarter
10.04.2018, 15:28
https://habrastorage.org/webt/eu/a6/az/eua6azciooxwzlooiu0cnzj617w.png
Первую версию змейки я написал за пару часов, и весила она чуть больше 150 байт. Я вспомнил про статьи в электронном журнале и захотел побить рекорд. Следующая версия уже весила 100 байт, но и потраченное время разработки перевалило за 6 часов. Остановившись на этом, показал свою версию игры, а начинающий программист – свою, и после я забыл об игре на некоторое время.

Разбирая папку со своими проектами и исходниками, я наткнулся на исходный код своей Змейки и понял, что код можно немного модифицировать и сократить еще на пару байт. Процесс оптимизации занял целый день, а сокращение составило только 5 байт. В итоге игра стала весить 95 байт.


59 строчек кода без комментариев
Полная релоцируемость программы (размещение в любой адрес без перекомпиляции)
Не используется стек
Используется только основной набор регистров: a,b,c,d,e,h,l и r как генератор случайности
Без использования процедур ПЗУ
Честная инициализация экрана и бордера
Классическое управление клавишами: 6,7,8,9 (Sinclair Joystick)
Каждую инициализацию псевдослучайным образом расставляться кролики


Исходный код:



org #8000
begin ld de,#598f;snake xy
ld hl,#5aff
ld b,l
ld c,l
;---
rabbit1 ld (hl),b
ld a,r
cp l
jr z,rabbit2
inc (hl)
rabbit2 dec hl
bit 3,h
jr nz,rabbit1
ex hl,de
;---
l1 xor a
out (#fe),a
clr ld (de),a
dec de
bit 6,d
jr nz,clr
;---
ld (hl),33
ld d,#5a
move1 ld a,(de)
dec a
cp 254
jr nc,move2
ld (de),a
move2 jr nz,move3
dec (hl)
move3 dec de
bit 3,d
jr nz,move1
;---
ld a,#ef
in a,(#fe)
rra
rra
jr c,$+5
ld bc,#ffe0
rra
jr c,$+5
ld bc,#0020
rra
jr c,$+5
ld bc,#0001
rra
jr c,$+4
ld b,e;ld bc,#ffff
ld c,e
;---
ld a,(hl)
and %00100000
add hl,bc
or (hl)
inc a
cp 7
jr nc,begin
ld a,h
inc a
and %00000011
jr z,begin
jr l1



более подробно можно почитать на хабрахабр (https://habrahabr.ru/post/353206/)

Eltaron
10.04.2018, 17:12
Не используется стек
Используется только основной набор регистров: a,b,c,d,e,h,l и r как генератор случайности
Без использования процедур ПЗУ


Круто, можно ТЕСТ-ПЗУ из этого сделать.
И зашить вот в такой ROM https://hackaday.com/2013/10/09/making-a-core-rope-read-only-memory/ :)

drbars
10.04.2018, 17:22
метка begin потерялась?

Firestarter
10.04.2018, 18:27
Огромное спасибо поправил

drbars
11.04.2018, 18:36
Огромное спасибо поправил



jr c,$+5 ----> jr c,$+4
ld bc,#0001 ----> ld c,#01


-1 байт :)

krt17
11.04.2018, 18:51
-1 байт
Да только не работает, нажми вверх и вправо.
можно вместо ld a, 0xef, сделать xor a, будет работать вся клава, но зато будет работать и -1. Вообще конечно в таких вещах говорить думал 2 часа не совсем верно. Если больше 10 лет было интересно переделать, да еще и на хабре перед непосвященными похвастаться, значит сидело глубоко в голове и потрачено на это намного больше. Но эт лирика, нормальный питон получился.

Firestarter
11.04.2018, 22:43
так как, опрос клавиатуры не изменяет геймплей и управление 6789, то я сократил до 93 БАЙТ!


begin ld de,#598f;snake xy
ld hl,#5aff
ld b,l
ld c,l
;---
rabbit1 ld (hl),b
ld a,r
cp l
jr z,rabbit2
inc (hl)
rabbit2 dec hl
bit 3,h
jr nz,rabbit1
ex hl,de
;---
l1 xor a
out (#fe),a
clr ld (de),a
dec de
bit 6,d
jr nz,clr
;---
; xor a
in a,(#fe)
rra
rra
jr c,$+5
ld bc,#ffe0
rra
jr c,$+5
ld bc,#0020
rra
jr c,$+5
ld bc,#0001
rra
jr c,$+4
ld b,e;ld bc,#ffff
ld c,e
;---
ld (hl),33
ld d,#5a
move1 ld a,(de)
dec a
cp 254
jr nc,move2
ld (de),a
move2 jr nz,move3
dec (hl)
move3 dec de
bit 3,d
jr nz,move1
;---
ld a,(hl)
and %00100000
add hl,bc
or (hl)
inc a
cp 7
jr nc,begin
ld a,h
inc a
and %00000011
jr z,begin
jr l1


P.S. Уважаемые модераторы поменяйте название темы до 93 байт.

- - - Добавлено - - -

Кто читал статью на хабре, добавил раздел краткое описание алгоритма.

Andrew771
11.04.2018, 23:02
Ну что ж, пора за крестики-нолики браться с искусственным интеллектом в 100 байт :)
Если серьезно, то круто! Молодца!

Бука
11.04.2018, 23:37
пора за крестики-нолики браться

Ну, для ПМК советских в 105 байт программы, 15 длинных переменных и стек впихивали ШАШКИ и одноклеточный морской бой.

Рекордной прогой вроде как до сих пор считаются 1K ZX Chess для папы спека. Впрочем для 1к ZX81 и Тетрис сделали.

https://en.wikipedia.org/wiki/1K_ZX_Chess

rasmer
12.04.2018, 13:24
Маму вашу.... Использование в одном листинге DEC, HEX и ссылки типа +n... Наркоманский исход какой-то...

ZX_NOVOSIB
12.04.2018, 14:27
TRD кто-нибудь выложит? :v2_dizzy_hello:

ZEman
12.04.2018, 14:33
а готовый результат не можете выложить ?

krt17
12.04.2018, 22:12
in a, (0xfe)
rra
rra
jr c, $+4
ld c, 0xe0
rra
jr c, $+4
ld c, 0x20
rra
jr c, $+4
ld c, 0x01
rra
jr c, $+3
ld c, e
ld a, c
rla
sbc a, a
ld b, a
И убираем инициализацию b, -1. Спорные места еще есть с виду.
Вообще показательный тред, все это не о чем, ценности не имеет, половина народа даже не запускала, но спасибки понаставила, деградация в чистом виде. Просто заставляет лишний раз задуматься, нафига стараться, если даже последним реально срать.

Kalantaj
12.04.2018, 22:40
ex hl,de
Нет такой команды. Есть ex de,hl
Вместо ld (hl),33 должно быть ld (hl),#33 (если я правильно понял).
И да... Длина - 94 байта а не 93.

- - - Добавлено - - -


TRD кто-нибудь выложит? :v2_dizzy_hello:

а готовый результат не можете выложить ?
Эх лентяи :)
Держите - сделал TRD:

krt17
12.04.2018, 23:15
А ну конечно, еще убрать ненужный ex и вместо него проинициализировать hl. Еще -1

- - - Добавлено - - -

Еще можно начать с ld h, 0x5b, тогда немного загадится буфер принтера и в 128 не заработает, но это вроде как и не требуется. Короче 90 без проблем получается.

Вообщем суммарно

device zxspectrum48
org #8000
begin
ld h, #5b
rabbit1
ld (hl), e
ld a, r
cp l
jr z, rabbit2
inc (hl)
rabbit2
dec hl
bit 3, h
jr nz, rabbit1
ld c, l
ld hl, 0x598f
;---
l1
ld (hl), 0x21
ld d, 0x5a
move1
ld a, (de)
dec a
cp 0xfe
jr nc, move2
ld (de), a
move2
jr nz, move3
dec (hl)
move3
dec de
bit 3, d
jr nz, move1
;---
xor a
out (0xfe), a
clr
ld (de), a
dec de
bit 6, d
jr nz, clr
;---
in a, (0xfe)
rra
rra
jr c, $+4
ld c, 0xe0
rra
jr c, $+4
ld c, 0x20
rra
jr c, $+4
ld c, 0x01
rra
jr c, $+3
ld c, e
ld a, c
rla
sbc a, a
ld b, a
;---
ld a, (hl)
and 00100000b
add hl, bc
or (hl)
inc a
cp 7
jr nc, begin
ld a, h
inc a
and 00000011b
jr z, begin
; bit 0, c
; jr z, l1
; ld a, l
; sub c
; xor l
; and 0xe0
; jr nz, begin
jr l1
display /A,$-0x8000
savesna "snake.sna", 0x8000

krt17
13.04.2018, 22:41
84 байта, с небольшим уменьшением скорости, при этом мне стало комфортнее играть.

device zxspectrum48
org #8000
begin
ld h, #5b
rabbit1
ld a, r
ld (hl), e
cp l
jr z, rabbit2
inc (hl)
rabbit2
dec hl
bit 3, h
jr nz, rabbit1
ld c, l
ld hl, 0x598f
;---
l1
ld (hl), 0x21
ld d, 0x5a
move1
ld a, (de)
dec a
cp 0xfe
jr nc, move2
ld (de), a
move2
jr nz, move3
dec (hl)
move3
dec de
bit 6, d
jr nz, move1
;---
xor a
out (0xfe), a
in a, (0xfe)
rra
rra
jr c, $+4
ld c, 0xe0
rra
jr c, $+4
ld c, 0x20
rra
jr c, $+4
ld c, 0x01
rra
jr c, $+3
ld c, e
ld a, c
rla
sbc a, a
ld b, a
;---
ld a, (hl)
and 00100000b
add hl, bc
or (hl)
inc a
cp 7
jr nc, begin
ld a, h
inc a
and 00000011b
jr z, begin
jr l1
display /A,$-0x8000
savesna "snake.sna", 0x8000

Завтра еще гляну, вроде еще можно подужать, жаль что все игроки в "оптимизацию" молчат.

Spectramine
13.04.2018, 23:05
Играть неинтересно, всё съел, и дальше делать нечего.
В классическом Питоне, когда один кролик на поле, но после его съедения увеличивается длина питона и появляется следующий кролик, интереснее.

upd. К тому же ГСЧ на регистре R слабоват, если выдавать сразу пачку кроликов (виден паттерн расстановки), а вот по одному - было бы ок.

goodboy
13.04.2018, 23:23
а почему нет столкновения с боковыми стенками ?

krt17
13.04.2018, 23:24
Играть неинтересно
Да не, там все нормально у автора, съел все игре конец, молодец, начинай сначала. Это просто калантай умудрился нагадить в трд версии. Так то 23 человека абсолютно счастливы от этой игры, и еще двое от испорченной версии вдвойне :)

Spectramine
13.04.2018, 23:45
Да не, там все нормально у автора, съел все игре конец, молодец, начинай сначала. Это просто калантай умудрился нагадить в трд версии. Так то 23 человека абсолютно счастливы от этой игры, и еще двое от испорченной версии вдвойне :)

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

- - - Добавлено - - -

Но что мне в этой змейке нравится - что она радужная) Ну и длина кода впечатляет, конечно.

Destr
14.04.2018, 15:30
Ну и длина кода впечатляет, конечно.
Десять байт, которые потрясли мир... (http://zxpress.ru/article.php?id=16791)

ZX_NOVOSIB
14.04.2018, 16:49
Интересно, а если питона делать на бейсике, то во сколько байт можно уложиться?

Бука
14.04.2018, 18:16
Интересно, а если питона делать на бейсике, то во сколько байт можно уложиться?

Я делал когда-то, если по минимуму то совсем короткий листинг.

Но я пытался сделать клон с советского игрового автомата, поэтому было несколько уровней с грядками морковки и фиолетовыми зайцами. ;)

Spectramine
14.04.2018, 20:58
Сделал две версии классического питона - без текстуры и с текстурой, на основе алгоритма Firestarter. Над оптимизацией особо не парился, так что длина 145/137 байт
65009
65008

65023

Spectramine
15.04.2018, 15:11
Сделал более отзывчивым управление, играть стало намного приятнее. Напоминаю - по достижению максимальной длины питона при съедении мыши рандомно меняется цвет бордюра, игру можно считать пройденной. Я прошел)

65018

- - - Добавлено - - -

Благодарю Firestarter за оригинальный алгоритм! Получил массу удовольствия в процессе разбора и модификации исходного текста, а также в процессе тестирования своих версий :v2_dizzy_roll:

- - - Добавлено - - -

6501965020

Spectramine
17.04.2018, 01:47
Исправил три мелких бага, за счет исправления второго управление стало ещё более отзывчивым: 65053

(upd. и ещё один нововнесенный, тоже полоска на текстуре в правом нижнем углу).

CodeMaster
17.04.2018, 07:57
Исправил три мелких бага

150 байт - 3 мелких бага, один из которых ещё и влияет на что-то!!! Что тогда говорить о современном софте с гиговым инсталятором??? ;-)

Shiny
17.04.2018, 08:19
Сделал более отзывчивым управление, играть стало намного приятнее. Напоминаю - по достижению максимальной длины питона при съедении мыши рандомно меняется цвет бордюра, игру можно считать пройденной. Я прошел)

65018

- - - Добавлено - - -

Благодарю Firestarter за оригинальный алгоритм! Получил массу удовольствия в процессе разбора и модификации исходного текста, а также в процессе тестирования своих версий :v2_dizzy_roll:

- - - Добавлено - - -

6501965020

Немного мою интру напоминает:

http://www.pouet.net/prod.php?which=69847

Spectramine
17.04.2018, 10:42
150 байт - 3 мелких бага, один из которых ещё и влияет на что-то!!! Что тогда говорить о современном софте с гиговым инсталятором??? ;-)На самом деле, там один баг был на оба файла, забыл перед чтением клавы поставить XOR A, и полуряд читался только в моменты, когда LD A,H:OR L давали сброшенный бит полуряда. Это происходило достаточно часто, так что можно и за баг не считать, но для порядка поставил XOR A.

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

Ошибки - неотъемлимая часть программирования :)

- - - Добавлено - - -


Немного мою интру напоминает:

http://www.pouet.net/prod.php?which=69847

Ага, есть немного) Фрактальный узор приятный.

Shiny
17.04.2018, 12:11
and-xor текстура же(:

TomCaT
24.04.2018, 20:04
Смотришь на эту сотню безостановочных радужных чешуек... так и не хватает змеиного шороха :) .