Просмотр полной версии : 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/)
Не используется стек
Используется только основной набор регистров: a,b,c,d,e,h,l и r как генератор случайности
Без использования процедур ПЗУ
Круто, можно ТЕСТ-ПЗУ из этого сделать.
И зашить вот в такой ROM https://hackaday.com/2013/10/09/making-a-core-rope-read-only-memory/ :)
Firestarter
10.04.2018, 18:27
Огромное спасибо поправил
Огромное спасибо поправил
jr c,$+5 ----> jr c,$+4
ld bc,#0001 ----> ld c,#01
-1 байт :)
-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 байт :)
Если серьезно, то круто! Молодца!
пора за крестики-нолики браться
Ну, для ПМК советских в 105 байт программы, 15 длинных переменных и стек впихивали ШАШКИ и одноклеточный морской бой.
Рекордной прогой вроде как до сих пор считаются 1K ZX Chess для папы спека. Впрочем для 1к ZX81 и Тетрис сделали.
https://en.wikipedia.org/wiki/1K_ZX_Chess
Маму вашу.... Использование в одном листинге DEC, HEX и ссылки типа +n... Наркоманский исход какой-то...
ZX_NOVOSIB
12.04.2018, 14:27
TRD кто-нибудь выложит? :v2_dizzy_hello:
а готовый результат не можете выложить ?
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:
А ну конечно, еще убрать ненужный 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
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 слабоват, если выдавать сразу пачку кроликов (виден паттерн расстановки), а вот по одному - было бы ок.
а почему нет столкновения с боковыми стенками ?
Играть неинтересно
Да не, там все нормально у автора, съел все игре конец, молодец, начинай сначала. Это просто калантай умудрился нагадить в трд версии. Так то 23 человека абсолютно счастливы от этой игры, и еще двое от испорченной версии вдвойне :)
Spectramine
13.04.2018, 23:45
Да не, там все нормально у автора, съел все игре конец, молодец, начинай сначала. Это просто калантай умудрился нагадить в трд версии. Так то 23 человека абсолютно счастливы от этой игры, и еще двое от испорченной версии вдвойне :)
Ну всё равно, если бы появлялся один кролик за другим, и длина питона увеличивалась от минимума до упора, было бы интереснее, по-моему. Может, займусь на досуге, переделаю.
- - - Добавлено - - -
Но что мне в этой змейке нравится - что она радужная) Ну и длина кода впечатляет, конечно.
Ну и длина кода впечатляет, конечно.
Десять байт, которые потрясли мир... (http://zxpress.ru/article.php?id=16791)
ZX_NOVOSIB
14.04.2018, 16:49
Интересно, а если питона делать на бейсике, то во сколько байт можно уложиться?
Интересно, а если питона делать на бейсике, то во сколько байт можно уложиться?
Я делал когда-то, если по минимуму то совсем короткий листинг.
Но я пытался сделать клон с советского игрового автомата, поэтому было несколько уровней с грядками морковки и фиолетовыми зайцами. ;)
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 мелких бага, один из которых ещё и влияет на что-то!!! Что тогда говорить о современном софте с гиговым инсталятором??? ;-)
Сделал более отзывчивым управление, играть стало намного приятнее. Напоминаю - по достижению максимальной длины питона при съедении мыши рандомно меняется цвет бордюра, игру можно считать пройденной. Я прошел)
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
Ага, есть немного) Фрактальный узор приятный.
Смотришь на эту сотню безостановочных радужных чешуек... так и не хватает змеиного шороха :) .
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot