Qwertiy писал(а):Ты рисуешь линии вокруг фишек, а я - фишки целиком
Не понял, а что мешает перерисовать только 2 (две) фишки - которые местами меняются? Остальные же не меняются.
Qwertiy писал(а):0. Я бы не сказал, что твой код очень понятный
Согласен - на любителя. Мне мой привычнее. Всегда стараюсь избежать кучи IF'ов, через которые потом, когда идея забыта, трудно продираться. Для этого, даже в разовых случаях использую функции типа Min, Max, GetRandom и т.п.
Qwertiy писал(а):Эффективность. Ты делаешь очень мало перемещений при перемешивании ... если поставить то же число, какое используется у меня,
Простая проверка даёт - из 64К пермещений примерно 24К - за пределы площадки (не проходят
If NewX >= 0 And NewX < N And NewY >= 0 And NewY < M Then), 18К - сами в себя (Index(X, Y) = Index(NewX, NewY)) и ещё 4К*2 - "обратные" (т.е. когда пустая ячейка сдвигается, например, вверх, а следующим ходом вниз, что "перемешивания" не даёт - *2 потому что 2 хода лишних). Итого "полезных" перемещеий 14К. У меня "бесполезные" варианты проверяются в SwapCells. По части медленности моего перемешивания - мой косяк, причина - вызов PrintCell из SwapCell при перемешивании, когда отрисовка не нужна. Фиксится в SwapCell:
- Код: Выделить всё
If Me.Visible Then
PrintCell emptyCell
PrintCell curCell
End If
Тогда скорость загрузки сравнима.
2. Discussible. В общем случае - да. В случае квадратных ячеек - координаты меняются только при ресайзе, можно и хранить, чтоб потом не пересчитывать при кликах
Qwertiy писал(а): У меня реализована возможность перетаскивать фишку, у тебя - нет. У меня обрабатывается только действие, аналогичное по сути клику по фишке, у тебя - любой MouseUp.
Дело в том, что в эту игру я никогда не играл, поэтому специально сделал эту фичу (пардон, если не по правилам) - можно нажать на фишке, передумать и отпустить на другой. Если другая может двигаться - двинется, если нет - ничего не произойдет. В этом случае перетаскивание противоречит этой логике.
Qwertiy писал(а):У меня размер шрифта меняется при изменении размера окна, у тебя - нет. У меня можно начать новую игру, у тебя - нет
А ещё - у меня форма называется Form1, а у тебя - "Пятнашки"!
Qwertiy писал(а): У меня любой ход выполняется за O(1)
- ну, во-первых, как минимум за О(4)
For Q=0 To 3 - это только в MouseUp. А во-вторых, эффективность часто зависит не от количества, а от "толщины" О.
Qwertiy писал(а):у тебя - поиск пустой ячейки O(n*m)
- это в первом варианте, я класс перегрузил, по привычке, "на будущее", чтоб было. Во втором варианте этого нет.
Qwertiy писал(а):проверка на победу O(n*m)
Это максимум, когда все ячейки на месте, иначе выскочит на первой несоответсвующей ( к тому же, в цикле всего одна проверка). Не думаю, что 4 вложенных IF'а с расчетами ItemsLeft +/- 1 намного быстрее.
Qwertiy писал(а):Единственная неожиданность в твоей программе
это баг. Курсор (и текущая ячейка) меняются по MouseMove над другой ячейку, поэтому SwapCells таки свапает назад, а курсор остаётся.