[elisp] elisp付属tetrisを改造してみるテスト

emacsについているtetrisには一つ問題点があります。それはdownコマンドなのですが、この関数はファミコン初期のテトリスと同じで、ブロックを一気に下まで落とすという仕様になっています。

まぁ実際のところ、このコマンドは結構便利です。でも標準コマンドが無いのも寂しいので標準テトリスのdownコマンドも搭載してみます。

実際には以下のようにしてやります

以下は標準のdownコマンド

(defun tetris-move-bottom ()
  "Drops the shape to the bottom of the playing area"
  (interactive)
  (let ((hit nil))
    (tetris-erase-shape)
    (while (not hit)
      (setq tetris-pos-y (1+ tetris-pos-y))
      (setq hit (tetris-test-shape)))
    (setq tetris-pos-y (1- tetris-pos-y))
    (tetris-draw-shape)
    (tetris-shape-done)))

whileで回して、最後まで落とす仕様になってるのが分かります。

次に、テトリス標準コマンド

(defun tetris-move-one-bottom ()
  "Drops the shape only one block "
  (interactive)
  (let ((hit nil))
	(tetris-erase-shape)
	(setq tetris-pos-y (1+ tetris-pos-y))
	(if (tetris-test-shape) (setq tetris-pos-y (1- tetris-pos-y)))
	(tetris-draw-shape)))

この関数は、仕様として落とすのは一段だけになっています。これがテトリス標準のdown方法です。

次に、テトリスのソースの中にこの関数を入れて、以下のようにキーバインドに設定すれば標準bottomコマンドを使用することが可能になります。

以下は設定例

(define-key tetris-mode-map [down]	'tetris-move-one-bottom)

次にような関数も付け加えると面白いかもしれません。この関数はテトリスブロックをストップさせ、次のブロックを出現させます

(defun tetris-stop-block ()
  "stop tetris block"
  (interactive)
  (tetris-shape-done))

時よ止まれ的な関数。

うーむ, なんかしょぼいなぁw