【TIC-80】map 命令の remap と一画面ライフゲーム

作ったもの。

![1scrLifeGame.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/e5bf6052-3e57-3632-6f55-cacf0177e3dc.gif)

##map命令のremap
[前回の記事](https://qiita.com/uokagi/items/b1b61b5dc4a540e3cc21)では
`map ([x=0, y=0], [w=30, h=17], [sx=0, sy=0], [colorkey=-1], [scale=1], [remap=nil])`
の`remap`に関して「remap は‥‥こおるばっく関数？？（便利らしいのですがサンプルも見つけられず使い方が分かりませんでした）」と書いてしまいましたが（なんとなく）わかりました。

ありがとう [TIC-80 wiki](https://github.com/nesbox/TIC-80/issues/753)！（および回答者様）
ありがとう google翻訳！

要は 引数に`(tileid [,x,y])`「 `mget(x,y)`で取得できるタイル番号 tileid 」を取って、
返り値` tile [,flip [,rotate] ] ]` を返すような関数をセットしておけば、
mapデータはそのままで表示のみ返り値の tile のタイルを表示してくれるということでした
（いやそう書いてあったのですが理解力がなくて情けない）

なるほど、これを使えば（タイムなどのグローバル変数を参照して）**タイルをアニメーションさせたり**`mget(x,y)`と合わせて近傍のセルをチェックして（リアルタイムではないが）**オートタイルっぽいこと**もできると。

[境界線付きデータ](https://qiita.com/uokagi/items/4f3c003bcbcd1b2eeb3a)もわざわざデータに書き込む必要はないということです。

##remap（命令に渡す関数）を使ってみよう

オートタイルもどきに使ってみようかなと思ったのですが、データを書き換えずに表示のみ変更って
他の何かに使えないかな？と考えたとき、「[ライフゲーム](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)」を思い出しました。

昔からありますし、世間でもQiita内でもときどき記事があがっているようですね。（今色々読んでます）

適当に実装してみた後、自分は確か**[MSX](https://ja.wikipedia.org/wiki/PV-7)に打ち込んで試した**のが最初だったかな？と思って検索したら、
なんと**[作者様のページ](http://www.geocities.jp/hiroshikoubou/page015.html)**が！！

うおー感動だー。プログラムリストも載ってるー。しかも[一画面プログラム](http://nagix.hatenablog.com/entry/2015/12/06/093757)だ！
（まあ当時記憶媒体もないので1画面プログラムぐらいしか入力できなかった）
**1988年**‥‥自分も年を取るはずだぁ

プログラムを読んだ感想ですが、リスト内の「**そそりだくAAOOEE**」が印象的でした。
あ、いや濁点「 ゛」ではなくてチルダ「~」かな、それと「く」ではなくて不等号「＜」かな？

‥‥いやほんと分からないんです、マシン語をかなり使ってるので。
BASIC部分はまだそうでもないのですが（かなり怪しいですが）、マシン語部分はさっぱりです。

と、とりあえず TIC-80 のエディタの一画面（**40x17文字**）でできるかやってみようと書いたのが
冒頭のプログラムです。

以下改行やインデントを入れて載せます。

```1scrLifeGame.lua
X,Y,W,H,SF,SP,num=0,0,240,136,60,4,1
ng={}
for r=1,H do
    ng[r]={}
end

function rm(t,x,y)
    local n=0
    for ox=-1,1 do
        for oy=-1,1 do
            n=n+mget(x+ox,y+oy)
        end
    end
    if t==0 then
        t=(n==3)and 1 or 0
    else
        t=(n==3 or n==4)and 1 or 0
    end
    ng[y-Y+1][x-X+1]=t
    return t
end

ct,sx,sy=SF,-720,-408
map(X,Y,W,H,sx,sy)

function TIC()
    if ct==SP then
        map(X,Y,W,H,sx,sy,-1,1,rm)
    end
    ct=ct-1
    if ct==SP//2 then
        print(num)
        for r=1,H do
            for c=1,W do 
                mset(X+c-1,Y+r-1,ng[r][c])
            end
        end
    end
    sy=sy+(btn(0)and 4 or btn(1)and -4 or 0)
    sx=sx+(btn(2)and 4 or btn(3)and -4 or 0)
    if ct==0 then
        ct=SP
        num=num+1
    end
end
```

コード圧縮技術(?)は特に使っていません（知識も技術もない）が普通に一画面に収まりました。
変数名を短くしたり、後は論理演算子を用いた三項演算子っぽい書き方を利用したくらいですかね。

後で少し調べてみましたが、コード圧縮の技術も色々あるようです。
「なるほどー」と思うものや「何いってだこいつ（理解できない）」など様々です。

まあ、タイルデータや配置処理、さらに音まである(!)元プログラムとは比ぶべくもないのですが。

横8ドットで2色という制限のなかできれいに見えるセルはすごいなあと本当に感心してしまいます。
([geocitiesが近々終了する](https://info-geocities.yahoo.co.jp/close/index.html)らしいですが残ってほしいです）

![qiita.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/d815ce3f-cf5f-3c94-db96-00c73cb75382.gif)

「Qiita」もなかなか生き残るな（笑

このような感じで自分でドットをポチポチ打って、ペタペタ配置して
さっと実行できて**1ボタンでgif動画にもできる**（しかも無料）「[TIC-80](https://tic.computer/create)」は
すばらしいと思うのですが皆様もいかがでしょうか！
（日本語の情報が少ないのです、助けてください）

※ 追記
理解できる範囲でコードを縮めて、全体表示、一時停止、データ反映追加。
![二丁拳銃.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/cccb6e4c-2a53-5756-4f5d-14979b4af7fc.gif)