🐱

FileMakerで1フィールドテトリス その2

2022/11/17に公開約3,700字

今回は、1フィールドテトリス その2です

前回はコチラ
https://zenn.dev/ontherocks_plz/articles/c10828730be715

前回はほんのお触り程度のプレイ時間で寸止めでしたが、ここからは、本格的に配列を使った仕組みの解説をしていきたいと思います。「寸止め」という言葉に艶めかしいイメージを抱いた方、穢れ過ぎですよ!

まずは、プレイエリア(盤面)を作成します。
縦20×横10の大きさの2次元配列が必要になりますが、縦横という言葉ではテトリスの回転概念が取り扱い辛いですので、以後、縦=y軸(または単にy)横=x軸(または単にx)、として進めていきます。

つまり、2次元配列でのこのy軸とx軸の関係は、こうなります。
y軸とx軸の関係y軸とx軸の関係

注意する点は、インデックス(いわゆる座標)が、このように対応する点です。
インデックスの見方インデックスの見方

中の値を特定する場合は、この座標を用いて [y][x] の記述の仕方と順番で指定します。
例えば [2][4] であれば、yの座標が2 xの座標が4、の値を指定することになります。

y軸は下に向かって座標が加算されるとか、ちょっと頭が混乱しそうですよね、「何か昔に学校で習った時はy軸は上向き加算だった!」ってね。実はそれはですね、そもそもユークリッド空間っていう概念があtt...

要は宇宙空間には上下左右という概念はないでしょ?っていう

まぁ....そんな感じです、えぇ。
分かります?分からないですか?
大丈夫です安心して下さい。私も良く分かっていません。

プレイエリアの準備

それでは、プレイエリアの用意です。実際に20×10の2次元配列を載せてみます。

$$blocks
[
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
	[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
]

思ったよりも縦長になりましたねぇ...
でもこれは、JSONFormatElements を当てて整形しているからですが、ここがポイントです。普通に JSONSetElement で作成すると横長になりますが、JSONFormatElements で整形することで縦長の見た目の、正にテトリス用のプレイエリアにすることができます。コレ大事。

値を全て 0 にしているのは、ブロックがないを表す為です。じゃあ、無いなら null でいいかというと、色々面倒臭いのでそれは止めた方がいいですね。

ところで、この20×10の配列の作り方ですが...

  • ちまちま座標を指定して泥臭く
  • 再帰カスタムでカッコよく
  • Whileループでさり気なく

好きなやり方でいいと思いますが、私?私はこうやりました。
漢は黙って手打ち漢は黙って手打ち

この程度の配列作成にクールさは要らない
この程度の配列作成にクールさは要らない

自分自身に挑戦したい人だけ、再帰カスタムやWhileでやって自己満足して下さい。

え?プレイエリアの大きさを可変させて遊びたい?
我がままさんだなぁ...

じゃあ再帰カスタム関数、func.create.PlayArea ( y.Max ; x.Max ) のコードを置いときますね。

func.create.PlayArea ( y.Max ; x.Max )
Let (

[
	~y.Max = y.Max ;
	~x.Max = x.Max ;

	$y.Cnt = Case ( IsEmpty ( $y.Cnt ); 0 ; $x.Cnt = ~x.Max - 1 ; $y.Cnt + 1 ; $y.Cnt ) ;
	$x.Cnt = Case ( IsEmpty ( $x.Cnt ) ; 0 ; $x.Cnt = ~x.Max - 1 ; 0 ; $x.Cnt + 1 )
];

Case (
	$y.Cnt > ~y.Max - 1 ; Let ( [ $y.Cnt=""; $x.Cnt="" ]; "" ) ;
	JSONSetElement ( func.create.PlayArea ( ~y.Max ; ~x.Max ) ; "[" & $y.Cnt & "][" & $x.Cnt & "]" ; 0 ; JSONNumber )
 )

 )

引数 y.Max x.Max に、それぞれ1以上の希望の数値を入れれば2次元配列が完成します。
コードが良く分からないという方は...手打ち配列作成を頑張って下さい。

とにもかくにも、作成した20×10の2次元配列プレイエリアを

$$blocksというグローバル変数に設定

しておきましょう。
この $$blocks というグローバル変数上の2次元配列に、積みあがったテトリミノや、落下するテトリミノを描いていきます。1フィールドテトリスは当然1つしかフィールドを使わないので、その分、ガンガングローバル変数を使用し処理していく必要があります。

フィールドにプレイエリアを試しに反映

ではここで実際に、適当なフィールドにプレイエリアを反映させてみましょう。
$$blocksJSONFormatElements を当てつつ、「0」をテキスト全置換しフィールド設定します。

フィールド設定
Substitute ( Filter ( JSONFormatElements ( $$blocks ) ; "0¶" ) ;

	[ "0" ; "□" ]

 )

プレイエリアプレイエリア

おぉ!
プレイエリアが出来上がり、テトリスゲームにちょっと近づきましたね!

ちなみに、全置換するテキストは別に でなくても良いですよ。
㍉

ただ、
あんまりふざけたのにすると、テトリミノがズレたりしますのでそこは大人な対応で。
それに何より見辛くて仕方ない

その2 おわり

今回はプレイエリア作成まででしたが、いかがだったでしょうか。
$$blocks というグローバル変数に20×10の2次元配列を設定しておく、繰り返しますがここが非常に大事です。

次回は、
FileMaker的テトリミノの設定と、その回転処理について解説したいと思います。

それでは
Let's enjoy FileMaker!

Discussion

ログインするとコメントできます