ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

Sunaba

Sunaba本

Sunaba本こと、「プログラムはこうして作られる プログラマの頭の中をのぞいてみよう」を読み終わった。 Sunabaというオリジナル言語でプログラムの書き方を解説しているので、Sunaba本と呼んでいる。 よくあるプログラミングの本ではまず正解があり、それの…

ループカウンタ

Sunaba本にfor文などのループカウンタにiやjを用いる習慣があるとあった。 iやjはくり返し回数。iが外側でjが内側 iやjを使うのは知っていたが、外側や内側まであるとは知らなかった。自分は特に意識してつかっていないし、著者も書かれているように分かりに…

最終章

読み進めてきたSunaba本もとうとう最終章。 いままで書かれてきたことをまとめている。中には自分にとって耳が痛い話もある。 箇条書きでまとめられていたので、忘れないようにここに引用。 ・結果から出発しろ ・問いかけ方が大事だ。上手に変形しろ ・目的…

数値入れ替え

Sunaba本に書かれていたテンポラリを使わず数値の入れ替えを行う方法。 a = a+b b = a-b a = a-b確かにこれで入れ替わる。でも本にも書かれていたように短くなるわけでもないし分かりにくいので使うことは無いだろう。 でも、こういったパズル的な考え方をす…

ブロックの形状

Sunaba本で4つの四角からなるブロックの形状パターンを導き出す方法が書かれていて、それが興味深かった。 元のゲームを知っているので、どんなブロックがあるかは分かっている。なので、どういう形状がありうるかとは考えたこともなかった。

言語仕様

Sunaba本でブロックの形状を実装する部分を読む。 自分ならどう実装するかなと考えながら読んでいて気がついたのだが、思っていたよりも言語の仕様に影響されているかも。C++ならこういう機能があるから、こう実装出来るなという感じ。 あまりにも言語に特化…

ブロックの回転判定

引き続きSunaba本。 ブロックが回転できるかどうかは、ブロックを回転してしまい、それが他のブロックと重なっていたら、回転できないとして回転を元に戻すことで行っている。 たしかにこれならば回転できるか回転先を1つずつ調べるよりもシンプルで簡単だ。…

部分プログラムの出力

引き続きSunaba本。 部分プログラムの出力の説明が出てきた。いわゆる関数の戻り値。 部分プログラムが出てきたときに値を返す機能もあるのだろうなと思った通りだった。

ブロックの回転

Sunaba本のテトリスのブロックを回転させる処理の部分を読んでいる。 テトリスを実装しようと思ったとき、やっかいだろうなと思ったのが、このブロックを回転させる処理。まずどうやってデータを持つか悩んだし、ブロックが回転できるかの判定もけっこうやっ…

別解法

再びSunaba本。 ある処理を行うときの解法が自分が最初に思ったのと違う方法だった。分かりやすさでいえば本のほうがよいかも。処理負荷的には自分のほうが良さそうな感じ。 できれば読み進める前に本に書かれている方法も思いつきたかった。

引数

Sunaba本でやっと引数が出てきた。Sunabaでは「部分プログラムへの入力」と呼んでいる。 サブルーチンを作っても引数で値を渡せないとやっぱり不便。 C言語を使い始めたころは、引数がよく分からなくて、グローバル変数で値を持っていた。今となってはそんな…

面倒くさい

再びSunaba本から。 「面倒くさい」は間違っていることを表すサインである。 面倒だと感じるということは、もっと良いやり方があるのではないかと感じているということ。コードを書いていて面倒だと感じたら、もっと簡単に簡潔に出来ないか見なおしてみよう…

ちょっと保留

Sunaba本を読んでいてなるほどと思った文。 大抵の場合、やり方が一つしか思いつかないうちは、まだプログラムにすべきではない。 やり方を思いついたら、すぐに実装にとりかかるのではなく、ちょっと保留し、他にもやり方が無いか考える。それらを比較して…

用心深いプログラム

Sunaba本に用心深いプログラムとして、カウンタ値の判定について書かれていた。 例えば、カウンタが1ずつ上がっていくとき、4になったら別の処理を行うような場合、 if (count == 4) { }と書けば期待したとおりに動作はするが、 if (count >= 4) {}と書いて…

条件式

ちょっと間が空いたけど、再びSunaba本。 今回読んだのは条件式。if文は式の演算結果が0かそれ以外で分岐するし、比較演算子の演算結果は0か1になる。 プチコンでボタン入力でキャラの座標を計算する部分ではこのことを利用してコードを短くした。

ループの最初

引き続きSunaba本。 ループ内でカウンタを使っているような場合、1回目のループのときだけカウンタの値が異なるようなコードになってしまうことがある。初期値0を入れてループを始めたが、2回目のループの最初は1から始まる場合など。 ループの1回目だけ動作…

条件実行

Sunaba本で条件実行の部分を読む。つまりif文。 ここまでif文に相当するものが出てきてなかったことに驚く。意外と使わなくてもコードは書けてしまうものなのだなと。

論理式

Sunaba本でキー入力を判定してキャラクターを移動させる部分を読む。 前フレームで入力が無くて今回入力があったときにキャラを移動させるというのを論理式で実装している。 例えばC言語で書いてみたら、次のような感じかな。 int x; // キャラx座標 int inp…

キー入力

Sunaba本でキー入力の部分を読む。 予想通り、キーボードからの入力は特定のメモリに値が入るというものだった。 特定のメモリが入出力などの機能を提供しているというのは、まるで組み込み系のプログラミングをしているかのようだ。まあ、本物はこんなにシ…

スコープ

引き続きSunaba本。 名前付きメモリ、すなわち変数にはスコープがあることがわかった。部分プログラム内で定義した名前付きメモリはその外からは見ることは出来ない。 さすがにスコープが無いとすべての名前付きメモリを把握しておかなければならないのでプ…

変数

Sunabaの本を継続中。 ここに来て初めて変数が出てきた。大抵のプログラミングの本は変数が最初に出てくるので、この本はかなり特殊とも言える。 今まで変数を使わずにメモリの値を使って処理を行っていたので、まるでアセンブラでコードを書いているかのよ…

描画待ち

Sunabaの本を引き続き読んでいる。 描画のアップデートの解説の部分。簡単に言ってしまえばVsync待ち。 今では理解しているけど、最初はなかなか理解できなかった。もともと1/60秒はブラウン管から来ているわけだが、今はもうGPUのフレームレートに合わせて…

プログラミングの解説に適したもの

Sunabaの本を読んでいる。 プログラムが期待したとおりに動かなかったとき、原因を探るためにプログラムがどう動いているかを1行ずつ確認していくのだが、この文章がなかなかもどかしい。何行でと書かれているたびにコードも見るので、場合によってはページ…

実験は小さく

Sunabaの本に書かれていたこと。 新しいことをする時には、試したいことだけのプログラムを書こう。 あるプログラムを書いていて、新しいことを試すときに、それまでのコードに追加していくことは良くある。 しかし、新しいことは最初からうまくいかないわけ…

部分プログラム

SunabaではC言語でいう関数、BASICでのサブルーチンのことを部分プログラムといい、部分プログラムを呼び出すことを参照すると言っている。 たしかに初心者にいきなり関数というよりも部分プログラムというほうが分かりやすい。

コードを短くする

Sunabaの本でプログラムコードを短くしていく部分を読む。 同じ処理をまとめて短くしていくのは最適化をしているようだ。しかし、ここのコードではトリッキーで、あとから見たときに読むのが大変だろうと思った。 と思いながら読み進めていたら、こういうコ…

プログラムのデバッグ

Sunabaの本のプログラムが思った通りに動かなかったとき、どうやって直していくか解説している部分を読んだ。 ちょっと周りくどい感じがしないでもないけど、まあ、自分の考え方とそう違っているわけでも無い。 でも、最近はツールの性能が上がって、考える…

くり返し

Sunabaの本でくり返しを解説している部分を読んでいる。 メモリの値をカウンタとしてループ判定を行う処理を見ていると、なんとなくアセンブラでコードを書いている気分になってきた。 自分はプログラマーであるから理解できているけど、そうでない人はどこ…

オフサイドルール

Sunabaでは繰り返す処理のまとまりを行の先頭の空白、つまりインデントで指定する。 インデントで処理範囲を指定する言語で、自分が知っているのは他にはPythonだけである。このインデントで範囲を指定することをオフサイドルールと言うらしい。初めて知った…

0始まり

Sunabaの本で、メモリのアドレスを表す値が0始まりになっていることを解説している部分を読んだ。ここまで深く自分で考えたことは無かった気がする。 確かにプログラミングでは配列のインデックスなど0始まりのものが多い。 プログラミングを始めた頃はち…