読者です 読者をやめる 読者になる 読者になる

明日への断片

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

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

C/C++

 こんにちは。最近肩こりが辛くて困っている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 とか。

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

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

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

 なんつってー...


... ... ...


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

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