Comments 10
Хорошая статья, спасибо!
Насчет состояния: можно было бы просто перед сдвигом проводить фазу "слияния" — если есть две одинаковых плитки в направлении сдвига то они заменяются на одну удвоенного значения. Тогда у плиток не будет никакого особого собственного состояния. Чтобы не сливать одну и ту же клетку 2 раза достаточно просто никогда не смотреть назад. Тогда получится что-то вроде:
8 8 2 2 0 -->
^
8 8 2 2 0 -->
^
8 8 2 2 0 -->
^
8 8 0 4 0 -->
^
8 8 0 4 0 -->
^
8 8 0 4 0 -->
^
0 16 0 4 0 -->
^
0 0 0 16 4 -->
^
Хорошая идея, вот только пример у вас как раз смотрит назад. Замените в нем исходную 8 на 4 и все сломается. Правильный пример:
8 8 2 2 0 -->
^ (следующее 2!=0, идем вперед)
8 8 2 2 0 -->
^ (следующее 2==2, заменяем нашу 2 на 4, а следующее 2 на 0, переходим на 2 позиции вперед)
8 8 0 4 0 -->
^ (следующее 8==8, заменяем нашу 8 на 16, а следующее 8 на 0, переходим на 2 позиции вперед)
0 16 0 4 0 -->
^ (оказались за пределами мира, сдвигаем все к правой границе)
0 0 0 16 4 -->
Не понял, что должно сломаться. Какая разница мы из iй смотрим в i+1 или из i+1 смотрим в i?
Судя по вашему примеру, вы смотрите на предыдущую цифру, когда решаете, нужно слияние или нет (если что, направление "вперед" — справа налево, вот так: <---).
Так как вы утверждаете, что хранить состояние клетки не нужно, то в ситуации:
8 8 0 4 0 -->
^
вы не знаете, 4 уже была или получена слиянием. И если в вашем примере вместо этого будет
8 4 0 4 0 -->
^
то вы сольете эти 2 четверки
Не солью, у нас правая граница проходит по нулю. То есть у нас скорее два указателя, на текущий и предыдущий. Просто на картинке решил этого не показывать, видимо зря.
А если начнем с ситуации
8 4 0 4 0
то тоже не сольете? А если сольете, то как вы отличите ее от ситуации с уже произведенным слиянием, если мы не храним состояние ячейки — т.е. не знаем, была она слита за эту итерацию, или с самого начала итерации была такой?
Как yew по удобности? Всё хочу попробовать, да руки на дошли
2048 WASM или игра на Rust за 2 дня