GO TO TOP
ゲーム制作講座

制作講座目次 / PREV(イベントハンドラを使いこなせ) / NEXT(フォームを使いこなせ) / トップページ / text mode
basic
2.乱数を使いこなせ

★乱数とは?

ワープロやメーラーのような一般のソフトウェアのプログラミングで使うことはめったに無いのに、ゲームプログラムになると、ものすごくひんぱんに使う命令があります。それが乱数です。
乱数を一言で言うと、サイコロを振ると毎回違う数が出るように、命令をするたびに毎回違う数を返す命令のことです。
乱数を自由に使うことが出来れば、ゲームの幅が広がります。是非使いこなせるようにしてください。

★ランダムな宝探し

さっきまでの宝探しゲームは、当たりが2番と決まっています。これでは一度ゲームをした人は、2回目以降結果が分かっているのでつまらなくなってしまいます。そこで、ページを開く度に当たりの番号が変わるようにしましょう。

<html><head>
<script language="JavaScript">
var count=0;
var atari=Math.floor(Math.random()*3+1);

function clickhere(n){
  count++;
  if(count==1){
    if(n==atari) alert("あたり");
    else alert("はずれ");
  }
  else{
    alert("2回もクリックしちゃ、ダメダメ!");
  }
}
</script></head>
<body>
宝探しゲーム! どこか好きなところを1回だけクリックしてね。<br>
<a href="JavaScript:clickhere(1);">その1</a><br>
<a href="JavaScript:clickhere(2);">その2</a><br>
<a href="JavaScript:clickhere(3);">その3</a><br>
</body></html>

赤字の部分が前の例と違う部分です。ここで、新しい関数が2つ出てきているので、それについて説明します。

Math.floor() は、()内の数を超えない整数値を返します。小数点以下切り捨てのようなことをしたい場合は便利です。例えば、Math.floor(5.5) なら5、Math.floor(-5.5) なら−6を返します。ちなみに、「返す」というのは、その結果がMath.floor()に代入されるといった感じのことです。例えば、a=3+Math.floor(1.1) の場合、Math.floor(1.1)は1を返すので、a=3+1 になり、結果として a=4 となります。

Math.random() がここの章で重要な、乱数を返す関数です。Math.random() が返す範囲は0以上1未満の小数です(1を返すことはありません)。それ以外の乱数がほしい場合は、Math.random()にかけ算や足し算をして調整します。

書式返す値
Math.random()0以上1未満の小数
Math.random()*30以上3未満の小数
Math.random()*3+11以上4未満の小数
Math.floor(Math.random()*3+1)1以上3以下の整数(4は含まれない!)

上のプログラムでは、atari は1以上3以下の整数を返すことになります。clickhere(n)のn の中身は、1,2,3のうちのどれかしか当てはまらないので、必ず当たりが含まれることになります。*1

*1 Math.floor(Math.random()*4+1)とすると、当たりが出ない場合が起こります。試してみましょう。

★じゃんけん

ちょっと宝探しゲームばかりだったので、ここらでネタを変えましょう。

<html><head>
<script language="JavaScript">
var aite;
var message;

function clickhere(n){
  aite=Math.floor(Math.random()*3+1);
  if(n==1) message="あなた:グー\n";
  if(n==2) message="あなた:チョキ\n";
  if(n==3) message="あなた:パー\n";
  if(aite==1) message+="相手:グー";
  if(aite==2) message+="相手:チョキ";
  if(aite==3) message+="相手:パー";
  alert(message);
}
</script></head>
<body>
じゃんけん大会! 好きなところをクリックしてね。<br>
<a href="JavaScript:clickhere(1);">グー</a><br>
<a href="JavaScript:clickhere(2);">チョキ</a><br>
<a href="JavaScript:clickhere(3);">パー</a><br>
</body></html>

3つのうち1つをクリックするのは、今までと同じですが、関数 clickhere() の中身が違っています。まず、変数 aite に1〜3の乱数が入ります。これが相手の手になります。そして、変数 message*2には alert で表示する文章が入ります。なお、message 内に入っている \n は alert 内の改行をするために入れています。

*2 message+="相手:グー" は、message=message+"相手:グー" と同じ意味です。

★じゃんけん勝敗の判定

さて、2人の出した手を見て、どちらが勝っているかを判定するには、どうしたらよいでしょうか。まず、あいこは if(n==aite) で判定すればいいので簡単ですね。
「あなたの勝ち」の判定は「n==1 かつ aite==2」「n==2 かつ aite==3」「n==3 かつ aite==1」の3通りです。最初の2つは if(n+1==aite) で大丈夫そうですが、3つ目の判定が問題です。
この問題を解決するために、剰余(じょうよ)というのを使います。簡単に言うと、わり算のあまりを求めるものです。
書式結果
1 % 31 / 3 = 0 あまり 1 なので、1
2 % 32 / 3 = 0 あまり 2 なので、2
3 % 33 / 3 = 1 あまり 0 なので、0
4 % 34 / 3 = 1 あまり 1 なので、1
5 % 35 / 3 = 1 あまり 2 なので、2

a % b の結果は、必ず b 未満の数になるので、「下1桁の数を得たい」などの時によく使います( a % 10 を実行すればいいわけですね)。じゃんけんの判定では、n+1 と aite の両方に剰余を実行させています。そうすると、「n==3 かつ aite==1」の時でも、(3+1)%3=1、aite%3=1 となり、勝ちの判定が出来ます。
負けの判定は、あいこ、勝ち以外の時なので、else 文を使います。

<html><head>
<script language="JavaScript">
var aite;
var message;

function clickhere(n){
  aite=Math.floor(Math.random()*3+1);
  if(n==1) message="あなた:グー\n";
  if(n==2) message="あなた:チョキ\n";
  if(n==3) message="あなた:パー\n";
  if(aite==1) message+="相手:グー\n";
  if(aite==2) message+="相手:チョキ\n";
  if(aite==3) message+="相手:パー\n";
  
  if(n==aite) message+="あいこです";
  else {
    if((n+1)%3==aite%3) message+="あなたの勝ち";
    else message+="相手の勝ち";
  }
  alert(message);
}
</script></head>
<body>
じゃんけん大会! 好きなところをクリックしてね。<br>
<a href="JavaScript:clickhere(1);">グー</a><br>
<a href="JavaScript:clickhere(2);">チョキ</a><br>
<a href="JavaScript:clickhere(3);">パー</a><br>
</body></html>


制作講座目次 / PREV(イベントハンドラを使いこなせ) / NEXT(フォームを使いこなせ)
記事の無断転載を禁ず(リンクは歓迎)
質問があればメールでどうぞ
(送ってくれた質問は、FAQとしてここに載せることがあります。質問者の名前は公開しません。)