明日への断片

ゲーム制作やプログラミング関する記事を中心に更新していこうと思います。

19欠片目:暗号について考える

 こんにちは。小中学生の頃は、自分で書いた字が暗号のように解読困難だったvoidです。今では丁寧に書くように気を付けています...


今日は昔ハマっていた暗号について書いて見たいと思います。

暗号遊び

 なぞなぞやパズルが好きで、秘密の暗号とかに憧れていたせいもあって、暗号遊びにはまっていた時期があります。自分で暗号を作ったり、人が作った暗号を解読したりしていました。

それを最近ふと思い出したので、ブログに載せてみようと思いました。

作った暗号

自分で1から考えたり、漫画や小説にあったものを改造したりもしていました。

レベル:★

かひらえざじうみせ ↑

レベル:★★

22* 15 03 32 83* 13 32* 81* 55 21 54 55 25 14

レベル★★★

あをのこしす んつもうろよ ごくけおい うるっもで


正解をここに書いても面白みに欠けると思うので、明日の記事で答えと解法を載せようと思います。(需要があるかは分かりませんが)

もし、お暇があれば解読してみて下さい。


暗号作りの難しいところ

 暗号は簡単に解読されても困りますが、絶対に解けない暗号は暗号とは言えないでしょう。一定の解法を元に解読されて初めて暗号になるのです。
(なんて小難しいことは考えずに作っていましたが...)


本日はこんな感じです。ではまた!

18欠片目:気付きにくいバグ集

 こんにちは。最近金欠のvoidです。近々バイトを始めます。


本日は、エラーは起きないけど思った通りの動作にならなかった時に、自分がよく失敗しているミスや、直すのに時間がかかってしまったバグを集めてみました。

それって本当に条件式?

 
■.変数aと変数bの値が等しいときに処理Aを実行したい!

// 誤
if( a = b)
{
  処理A;
}
// 正
if( a == b)
{
  処理A;
}

誤の場合だと、aとbが等しいかどうかではなく、 a = bの式の評価値、即ちbの値が0以外であれば処理Aは実行されてしまいます。

このミスは、初心者の頃数学記号と混同して使っていたり、タイプミスで = を1個打ち損ねていたときに起こしてしまいます。このようなバグの厄介なところはコンパイルに時エラーにならないことです。

a = bという記述自体に誤りはありませんが、求めているのはa == bの評価値です。

対処法 if文などに使われる条件式では基本的には=で代入することはないので、実行されるはずのない処理が実行されていたら条件式が間違っていないかよく見直す。

制御文の適応範囲

■.次のプログラムで、実行されるのはどの処理?

int a = 1;
int b = 2;

// case1
if( a == b)処理A;

// case2
if( a == b);
{
  処理B;
}

// case3
if( a == b)
  処理C;
  処理D;


正解は、処理Bと処理Dです。


if文などの制御文は基本的に、その次の文までが適応範囲になります。

case1のように、if文と処理を1行で書いても、if文が成立していないため処理Aは実行されません。

case2では、if文の直後にセミコロンが存在しているので、if文の適応範囲はそのセミコロンまでで終わってしまいます。ですから、処理Bは条件に関係なく実行されてしまうのです。

case3では、処理Cがif文の適応範囲内にあるので、今回のif文は成立していないため実行されません。しかし、これもまたここまででif文の範囲は終わってしまっているので、処理Dはif文に関係なく実行されてしまいます。

うーん、どこまでがif文の制御下にあるのかが、非常に分かり辛いですね。

対処法 ネスト(入れ子)構造を利用する

中括弧{}を用いてネスト構造にすることで、どこまでがif文なのかはっきりさせることが出来ます。
先ほどのcase3を例に挙げると、

// case3
if( a == b)
{
  処理C;  // {}の中は字下げ(インデント)する。
}

処理D;

このような構造を作ってあげることで、処理Cだけがif文で制御されていることが分かりやすくなります。

余談。~バグという言葉の重み~

 ゲーム制作を知らなかった頃はゲームのバグは、普通じゃあり得ない挙動をするのがとても可笑しくて笑っていただけの記憶がありますが、今ではすっかり、バグという存在があるだけで、頭を抱える程悩ませてくれる存在となっています。たった数年で言葉の重みはここまで変わるものかと痛感しました...

以上。

 今回は比較的初心者が陥りやすいミスの対処法を書いてみました。
誰か1人でも役に立った方がいらっしゃれば幸いです...

ではまた!

17欠片目:第1回ゲームに学ぶ ~Minecraft編~

 こんにちは。口内炎だったり、痣だったり、頭痛だったり...常に体の何処かしらが痛む呪いにかかっているvoidです。誰か解呪方法を教えてください。

 今回は、世界的に人気なゲーム「Minecraft」を知ることで、面白いゲーム作りのヒントを得ようという目論見のもとMinecraftの魅力に迫っていきたいと思います。
(今後もやるかもしれないので第1回と銘打つ)

MineCraft

f:id:yasu-game-void:20170226005004j:plain

 Minecraft(マインクラフト)は「マイクラ」の愛称でお馴染みの3Dのサンドボックスゲームです。


広大な3Dのフィールド上で、ブロックを自由に配置して建物を建てたり、アイテムをクラフトして道具を作って冒険を快適にしたり、敵と戦ってダンジョンを攻略したり...とにかく遊びの幅が広いゲームなのです。

ここがすごいぞMineCraft

 f:id:yasu-game-void:20170226010236j:plain
 ↑googleの検索ウィンドウに「ま」とだけ入れたときの候補。3番目にマインクラフト。

世界中で愛されるゲーム

 マインクラフトはスウェーデンのMojangという会社から発売されたPCゲームでした。そこから、多言語化され、さらにiOSやAndoroid等のスマートフォンや、PSVita,Playstation3/4,WiiU,Xbox等の幅広いプラットフォームに移植されています。また、間もなく発売されるNintendo Switchでの発売も決定しているようです。

そうして、世界中の様々なプレイヤーに遊ばれるようになっていき、2016年には全世界での売上本数が、なんと
1億本を突破したそうです。

生半可な人気ではこのような数字を出すことはできないでしょう。


人々は何故こんなにもマインクラフトに魅かれるのか?(自分も魅かれてますが!)自分なりの分析をしていきたいと思います。

進化し続けるゲーム

f:id:yasu-game-void:20170226015648p:plain
 PC版マインクラフトの正式版がリリースされたのは2011年です。が、その以前のアルファ版から2017年現在に至るまで、バージョンアップを繰り返してきています。バージョンアップされる度に追加される新要素新アイテムにより、プレイヤーは飽きることなく遊べます。また、ユーザーの意見を取り入れた改善も行われているので、遊びやすさも高まってきています。

一人でも、みんなでも

 マインクラフトはマルチプレイに対応しています。友達同士で同じ世界を協力して冒険したり、一緒に建物を建てたり、時には剣を交えて戦ったりなど、遊びの幅は更に更に広がっていきます。このように、誰かと一緒に楽しむことが出来るのもマインクラフトの魅力の一つです。

想像⇒創造のゲーム性

 マインクラフトの世界は、ほとんどが立方体のブロックでできていて、それを並べて配置することで誰でも簡単に建物を建てるとが出来ます。こんな家を作ってみたいというイメージから、実際にブロックを使って形にできる。マインクラフトはこの、「想像」から「創造」がスムーズにできるゲームなので、プレイヤーの想像力がゲーム性に反映されていると言えるかもしれません。

最近では日本の小中学校でも、子供たちの想像力を養うため、などの理由での授業に取りれ入れられるようになっています。

すげぇ...マイクラすげぇ...

 はい。マインクラフトのすごさに語彙力がやられてしまいました。(わーい、すごーい)

マインクラフトが世界中で愛される理由はまだまだ他にもあると思いますが、人気ゲームの秘密に一歩迫まることは出来たと思います。


いきなりこんなすごいゲームを作るのは厳しいですが、学んだことを少しずつ自分の作品作りに生かしていきたいと思います。本日は以上!ではまた!!


iOS版

Minecraft: Pocket Edition

Minecraft: Pocket Edition

  • Mojang
  • ゲーム
  • ¥840

16欠片目:古き日は終わり、新しい日々は動き出す

 こんにちは。家で財布の中身を確認していたら、財布のチャックを開いたままポケットに入れていて、ポケットの中に小銭が放出されていたvoidです。しかも一部は家に落としていたようです...

本日は、色々あって短いです。

専門学校の一年間修了

 本日、学校で成績発表が行われ、無事に1年生を終えることが出来ました!
振り返ってみると、色んな事がありすぎた一年で、授業での制作課題や海外への短期研修、学内でのコンペティション、学園祭にその他のイベント等への参加。(これらの詳細はまたいつか話そうかと)


もう、盛りだくさんのてんこ盛りでした。


その中で、いくつかの場所では結果を残すことが出来、また結果を残せずとも大きな糧を得られる経験ばかりで、とても充実した一年だったと思います。

次の一年間は、この1年を最大限に生かし、この一年間に負けないような行動をして行きたいです。


次の目標

 今、私が抱いている目標はCESA主催の「日本ゲーム大賞マチュア部門」に挑戦し、結果を残すことです。それは、これまでに成し遂げてきたことよりも、遥かに難しい目標だと感じています。
この目標を達成するには、今まで以上の努力が不可欠なのです。


しかしながら、この一年間で少なからず疲れを感じてしまっています。自分の体調と勉強のバランスも難しいなぁと感じております。

新しい日々

 4月からは、学校では新しいクラスのメンバーとともに新しいことを勉強していきます。また、その他にも新しく挑戦することがいくつか決まっています。そんな新しいことが、自分への刺激になって、リフレッシュや視野の拡張に繋がっていったらいいなと思っています。


本日は、一年間のざっくりとした振り返りと、新年度に向けての抱負を書いてみました。
書くだけならだれでもできるので、それを実際にできる人間になっていきたいと思います。

以上。ではまた!

15欠片目:知って得する剰余演算

 こんにちは。最近肩こりが辛くて困っているvoid(19歳)です。
この年でこれだと、将来が不安になってきます...

剰余演算ってなんだろう

 四則演算はご存知かと思われます。足す、引く、掛ける、割るの四つですね。もう少し数学的に言うと、加算、減算、乗算、徐算となります。

表にまとめるとこんな感じです。

  意味 数学の記号 C言語での記号
加算 足し算 + +
減算 引き算 - -
乗算 掛け算 × *
徐算 割り算 ÷ /


この辺りは馴染み深いものだと思われますが、C言語ではもう一つ剰余算というものがあり、これがまたゲーム制作で便利なのです。

数学で言うところのmod計算に当たるのですが、簡単に言うと、割った余りを求める計算です。
例えば、

5 mod 2 は 「5を2で割った余り」という意味です。

5÷2 = 2余り1

なので、5 mod 2の計算結果は1です。
C言語のプログラムではmodではなく%記号を使って、

int num = 5 % 2;    // numの値は1

このように書きます。

  意味 数学の記号 C言語での記号
剰余算 割った余りを求める mod %

いつ剰余演算を使うのか

例① 乱数(ランダムな数値)を使いたいとき

 C言語では乱数を使うためにrand()関数が用意されています。(stdlib.hをインクルードすることで使うことが出来ます。)

rand()関数を呼び出すと0~32767のランダムな数値を返してくれます。

...正直、ゲームを作る上では基本的には32768個も幅があっては困ります。
例えば、コンピュータと1対1で対戦できる簡単なじゃんけんゲームを作ろうとしたとき、コンピュータの手をランダムに設定するには、「ぐー、ちょき、ぱー」の3つがあれば十分ですね。

ここで、剰余演算を使うのです‼



ある数aをbで割った余りが、bより大きくなることは絶対にありません。余りの方が大きかったらまだその数をbで割ることが出来るからです。



つまり、rand()関数で得られた値を3で割った余りは0,1,2のどれかにしかなりません。

int com_hand = rand() % 3;    // com_hand の値は0~2のいずれか

こうしてあげれば、あとは0のときはグーと表示、1のときはチョキ...等を決めて、表示してあげればじゃんけんゲームっぽいものをつくれそうですね!

例② 数の位を意識したいとき

 例えば、ある数字の1の位だけを取り出したいとき。

2345という数値があるとします。この時の「5」という数字だけが欲しいとします。

そんな時も剰余です!

2345を分解してみると、

2345 = 2340 + 5ですね。

この時、2340は10で割り切ることが出来ますが、5は割ることが出来ず余りとなります。


...もうお分かりでしょうか

2345 % 10 とすると、計算結果は見事5になります。


ちなみに、
2345 % 100 とすると、計算結果は45になります。

(超)余談

 完全に余談になりますが、自分は道路を歩いているときや、家族で車で出かけるとき、大変暇になりがちなので通りすがる車のナンバープレートの数字を加減乗除して10を作るという数遊びを小学生の頃から(今でもたまに)やっています。
例えば、1348(適当に思いついた数字)だと、

3-1= 2 4/2 = 2 8+2 = 10 とか、
1+4= 5 8-3 = 5 5+5 = 10 とか。

色んなパターンを試して遊んでます。

前に止まっている車だと見ながらできるので楽ですが、通りすぎていった車だと思い出しながら計算するので結構難しかったりします。誰が先にできるか人と競うのも面白いので是非、交通事故にならない程度に遊んでみてください。

本日は以上よ(い・じょうよ)

 なんつってー...


... ... ...


...コホン。剰余演算について分かって頂けましたでしょうか?この計算も、使い方次第では例で挙げた他にも色んな使い道ができる面白い子だと思います。

寒いギャグ失礼しました。ではまた!



 

14欠片目:紛らわC言語

 こんにちは。本日、湯船でウトウトしていたら、浴槽に頭を打ち付け目が覚めたvoidです。
(痛みとかじゃなくて、大きな音に驚いて目が覚めました。心臓バクバクでした。)



昨日は紛らわしい日本語とかについて書いていましたが、そう言えばプログラミング言語にもややこしいやつがいたなぁと思い、今日はC言語さんのややこしい点について書いていこうと思います。

同じ記号のはずなのに...

 C言語の厄介な点の一つとして、同じ記号が複数の別の役割を持っていることがあります。

例えば『*』アスタリスクは、

1.乗算演算子
2.ポインタ宣言子
3.間接参照演算子

3つもの意味を持ってしまっています。



 自分が初めてC言語を学んだときには、特に2と3の違いを理解するのに苦しんだ記憶があります。どちらもポインタを使うときに出てくるので、大変紛らわしいです。


/* アスタリスク豪華盛り合わせサンプルコード*/


int a = 0;    /* 普通の変数aの宣言*/
int* pa;      /* 変数aへのポインタ変数の宣言<<ポインタ宣言子>>*/

pa = &a;      /* ポインタ変数paに変数aのアドレスを代入*/
a = 10;       /* 変数aに10を代入*/
*pa = a * 2;  /* ポインタ変数paの参照(すなわちa)にa(10)×2を代入<<関接参照演算子>>*/


ふと、元々のC言語でのコメントは「//」は使えなくて、「/**/」だったなーと思い出して書いてたら、*の場所が増えて思いの外読みにくかったです。

宣言するときは宣言子。値を参照するときは、間接参照演算子
(意味的にはそのままなので、慣れれば割と問題ないですね)



他にも、『&』アンパサンドも、

・アドレス演算
・ビット積演算
・C++の参照

等で使われています。

豆粒ほどもない豆知識

 以上。本日の豆粒ほどもない豆知識のお話でした。
もはや、ゴマ粒です。ゴマ知識です。いいですね、ゴマ知識。


テレレテッテテッテッテー♪
新しいカテゴリー「ゴマ知識」 が 追加された

13欠片目:よく考えてみたら不思議な日本語

 こんにちは。子供の頃ガムを噛んでいて、噛むのに疲れて「噛み疲れた」と言ったところ、「何に噛み付かれたの!?」と心配されたことがあるvoidです。(日本語って難しい)

というわけで、今日は、普段何気なく使っているけど、よく考えたらちょっとおかしい日本語を挙げていきたいと思います。

カウントダウン


 いきなりですが、3からカウントダウンをしてみてください。



終わりましたか?





本当に終わりました?(しつこい)


おそらく、多くの人は「さん・に・いち・ゼロ」とカウントダウンするはずです。


ここでおかしな点は、何故ゼロ(zero)だけが英語かということです。
「さん(日本語)・に(日本語)・いち(日本語)・zero(English)」です。おかしいです。



自分は、これに気が付いたとき、「こんなものは不自然だ、認めない」という謎の意地が生まれ、0を零(れい)と読むようにし始めました。




1か月くらいしか継続しなかったと思います。
やっぱり慣れているものが一番のようです。

逆の意味を有する単語

今度

  例①「また今度ねー」       :意味[次回]
  例②「今度のプロジェクトでは...」 :意味[今回]

適当

  例①「適当なことを言うのはやめなさい。」:意味[でたらめな]
  例②「適当な量を加えます。」      :意味[適切な]


つまり、

「今度(②)は適当(①)な日本語を使ってしまっていたので、今度(①)からは適当(②)な日本語を使いましょう。」
ということなのでしょうか...


もうどういうことなのか分からないですね。

相反する故事成語(ことわざ、慣用句)

 故事成語には、先人たちの知恵と経験が盛り込まれていて、よく教訓などにされますが、21世紀を生きる我々にとっては「先人の数」はあまりに多過ぎたのかもしれません。

・急いては事を仕損ずる、急がば回れ←→善は急げ

・3度目の正直←→2度あることは3度ある

・武士は食わねど高楊枝←→腹が減っては戦はできぬ

・立つ鳥跡を濁さず←→あとは野となれ山となれ

などなど。


時にはこっち、時にはあっちと、自分に都合の良い教訓を並べ立てる人はたまに見かけますね。(かく言う自分も...)


結論:伝わればいいんじゃない?

 と、いかにも適当な結論で、締めくくり。

とまぁ、こんな感じのどうしようもないけど、ちょっと気になることについて書いていくのも、書いている方としては楽しいものです。(この記事を読まれている方にとって楽しいかは不安ですが...)

本日は以上。ではまた!