初めまして。
C言語を貴殿のサイト様で勉強している者です。
C言語でゲームを作っているのですが、「割った余り」という概念がいまいち理解できません。
具体的にどういった箇所で使うのか、また応用の仕方も解せないんです・・・。
------------------------------------------
if(hantei[y/32-1][x/32]==1)//進めるか判定
return 1;//エラー
------------------------------------------
上記の判定([y32-1])や、
------------------------------------------
if(ch.x%32==0 && ch.y%32==0)
------------------------------------------
の、割り切る判定もちょっと苦手、というかよくわかっていません。
具体的にご教授頂けないでしょうか?
申し訳ありません・・・。
割った余りという概念
Re:割った余りという概念
<if(hantei[y/32-1][x/32]==1)//進めるか判定
まずこの時について、具体的にxの値に対する計算結果を考えます。
000~031:0
032~063:1
064~095:2
096~127:3
...(以下略)
上記から分かるように「x/32」の結果は「32」毎に1ずつ増えていきます。
1マスの横サイズを32ピクセルとした時、何マス目か?をこの計算によって得られます( 「0マス目」から始まる )
これをもう少し身近な例で例えます。
1マスが5mmの方眼紙ノートがあります。ノートの適当な位置に点を付けます。
点がノートの左端(マス目の端)から何mmの所にあるか定規で測ります。
「これは左から何マス目ですか?」と聞かれると左端からの距離○○mmが分かっているため
「○○mm / 5mm 」の小数部を切った値に+1すると、点が左から何マス目か分かりますよね。
※ 12mmなら2.4、切捨てて2。それに1足すと3マス目と分かります。
次に点が方眼紙のマスの端にありますか?と聞かれると
方眼は5mmの正方形なので「○○mmを5で割って、余りが無い(0)時」というのは分かりますよね。
※ 10mmなら2余り0なのでマスの端になる
さて、では方眼紙の例を5mmから32mmに置き換えてみてください。一緒の事をしてるのは分かりますか?
大体こんな感じです。
まずこの時について、具体的にxの値に対する計算結果を考えます。
000~031:0
032~063:1
064~095:2
096~127:3
...(以下略)
上記から分かるように「x/32」の結果は「32」毎に1ずつ増えていきます。
1マスの横サイズを32ピクセルとした時、何マス目か?をこの計算によって得られます( 「0マス目」から始まる )
これをもう少し身近な例で例えます。
1マスが5mmの方眼紙ノートがあります。ノートの適当な位置に点を付けます。
点がノートの左端(マス目の端)から何mmの所にあるか定規で測ります。
「これは左から何マス目ですか?」と聞かれると左端からの距離○○mmが分かっているため
「○○mm / 5mm 」の小数部を切った値に+1すると、点が左から何マス目か分かりますよね。
※ 12mmなら2.4、切捨てて2。それに1足すと3マス目と分かります。
次に点が方眼紙のマスの端にありますか?と聞かれると
方眼は5mmの正方形なので「○○mmを5で割って、余りが無い(0)時」というのは分かりますよね。
※ 10mmなら2余り0なのでマスの端になる
さて、では方眼紙の例を5mmから32mmに置き換えてみてください。一緒の事をしてるのは分かりますか?
大体こんな感じです。
Re:割った余りという概念
初めまして。自分もここで勉強しているものです。
割った余りを使うというのはプログラムを組む上では非常に重要なことのようです。
(自分も勉強し始めた頃は、余りを使う発想に驚かされました)
割った余りは色々な使い方があるようです。
3の倍数を考えて見ますと・・・
3の倍数とは3で割り切れる数であり、3で割って余りが0の数とも解釈できます。
割りたい数をiとした場合、3の倍数は i%3=0 とも言えます。
これを頭において
------------------------------------------
if(ch.x%32==0 && ch.y%32==0)
------------------------------------------
を見てみますと、ch.xが32の倍数の時 かつ ch.yが32の倍数の時 と読めると思います。
つまり ch.xもch.yも32の倍数の場合のみ、実行するという意味にとれませんか?
下手な説明ですみません。余りを使った一例ですので、数字をいろいろ変えて
試行錯誤していけば、見えてくる物があると思いますので頑張ってください。
割った余りを使うというのはプログラムを組む上では非常に重要なことのようです。
(自分も勉強し始めた頃は、余りを使う発想に驚かされました)
割った余りは色々な使い方があるようです。
3の倍数を考えて見ますと・・・
3の倍数とは3で割り切れる数であり、3で割って余りが0の数とも解釈できます。
割りたい数をiとした場合、3の倍数は i%3=0 とも言えます。
これを頭において
------------------------------------------
if(ch.x%32==0 && ch.y%32==0)
------------------------------------------
を見てみますと、ch.xが32の倍数の時 かつ ch.yが32の倍数の時 と読めると思います。
つまり ch.xもch.yも32の倍数の場合のみ、実行するという意味にとれませんか?
下手な説明ですみません。余りを使った一例ですので、数字をいろいろ変えて
試行錯誤していけば、見えてくる物があると思いますので頑張ってください。
Re:割った余りという概念
挙げられた例についてはもう回答が出ているようなので、トランプで一例を。
標準ライブラリ<stdlib.h>の中に0から0x7FFF(32767)までの値をランダムに求める、rand関数というものがありますが、
このような固定の数字のままでは非常に扱いづらいです。
そこで、
a = rand()%54;
とすることで、0~53までの値をaに代入できます。
(DXライブラリでは a = GetRand(53); で同様の処理ができます)
予め0-12:クラブ 13-25:スペード 26-38:ハート 39-51:ダイヤ 52,53:ジョーカーと決めておけば、
上記の代入の後、
a / 13 == 0 →クラブ
a / 13 == 1 →スペード
a / 13 == 2 →ハート
a / 13 == 3 →ダイヤ
a / 13 == 4 →ジョーカー
a % 13 +1 → そのカードの数字(ジョーカーの場合を除く) (+1は0~12を1~13にするためです)
というように、ランダムにカードを一枚選ぶことができます。
標準ライブラリ<stdlib.h>の中に0から0x7FFF(32767)までの値をランダムに求める、rand関数というものがありますが、
このような固定の数字のままでは非常に扱いづらいです。
そこで、
a = rand()%54;
とすることで、0~53までの値をaに代入できます。
(DXライブラリでは a = GetRand(53); で同様の処理ができます)
予め0-12:クラブ 13-25:スペード 26-38:ハート 39-51:ダイヤ 52,53:ジョーカーと決めておけば、
上記の代入の後、
a / 13 == 0 →クラブ
a / 13 == 1 →スペード
a / 13 == 2 →ハート
a / 13 == 3 →ダイヤ
a / 13 == 4 →ジョーカー
a % 13 +1 → そのカードの数字(ジョーカーの場合を除く) (+1は0~12を1~13にするためです)
というように、ランダムにカードを一枚選ぶことができます。