Java Scriptの解説
9.ゲームの作り方(その3)
ゲームに欠かせない乱数の使い方を説明します。乱数とはでたらめの数値です。何らかの規則性があれば乱数とは言いません。
もぐら叩きゲームのように何処に出現させるか決めるのに乱数が使われます。
1.「もぐら叩きゲーム」の基礎
ゲームの部屋にある「ばい菌クリックゲーム」の基礎的な部分を説明します。
乱数を使うことにより絵の表示場所を変えます。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
<HTML>
<HEAD>
<TITLE>Java Script 例1</TITLE>
<SCRIPT LANGUAGE=”JavaScript”>
<!−−
img0=new Image(48,48);img1=new Image(48,48);
img2=new Image(48,48);
img0.src="../game2/back1.gif";img1.src="../game2/peke1.gif";
img2.src="../game2/peke2.gif";
scrnx=8;scrny=1;
p_bact=0
var h_bact;
score=0;kaisu=0;
function display(){cnt=0;
for (y=0;y<scrny;y++){
for (x=0;x<scrnx;x++){
document.write("<A HREF='JavaScript:draw("+cnt+")'><IMG SRC='../game2/back1.gif' BORDER=0 WIDTH=48 HEIGHT=48></A>");
cnt++;}
document.write("<BR>");}}
function draw(n){
if ((p_bact==n)&&(h_bact==false)){
document.images[n].src=img1.src;
score=score+1;
h_bact=true;}}
function START(){cnt=0;score=0;kaisu=0;
for (y=0;y<scrny;y++){
for (x=0;x<scrnx;x++){
document.images[cnt].src=img0.src;
cnt++;}}
bact();}
function bact(){
if (kaisu<20){damy1=p_bact;
document.images[damy1].src=img0.src;
p_bact=Math.floor(Math.random()*scrnx*scrny);
damy2=p_bact;
document.images[damy2].src=img2.src;
h_bact=false;
tid=setTimeout("bact()",1500);
kaisu=kaisu+1;}
else {clearTimeout(tid);
alert("ゲームオーバー");}}
//−−>
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT LANGUAGE=”JavaScript”>
<!−−
display();
//−−>
</SCRIPT>
<FORM NAME="MyForm">
<INPUT TYPE="button" VALUE="スタート" onClick="START(this)">
</FORM>
</BODY>
</HTML>
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
例1表示 ここをクリックして下さい。例が表示されます。
<解説>
1)変数の説明
1.絵
img0.srcは,背景となる水色の絵、img1.srcは,ばい菌をクリックしてやっつけた時の絵,img2.srcは,元気なばい菌の絵です。
2.変数
scrnx=8;scrny=1; 絵の配列です。x軸方向(scrnx)に8個,y軸方向(scrny)1行です。
p_bact=0 ばい菌の絵を表示する場所です。一番左端が0番,右端が7番になります。
h_bact; ばい菌のどちらの絵(元気なばい菌か,やっつけられたばい菌)を表示するか決める変数。
score=0; 今回は,関係ないのですがうまくクリックした得点を計算する変数です。例題では得点を表示しませんが,どの様に得点計算するか参考にして下さい。
kaisu=0; ゲーム終了のための,ばい菌が出た回数を計算する変数。
2)function display()
ゲームの作り方(その2)の例題1を参考にして下さい。ここでは,省略します。
3)function draw(n)
絵がクリックされた時の処理です。
1.if ((p_bact==n)&&(h_bact==false)){
ばい菌が表示された場所(p_bact)とクリックされた場所(n)が一致した時,初めて処理されます。
さらにもうひとつ条件を」付けます。h_bact==false 即ち元気なばい菌の絵をクリックした時のみ以下の処理がされます。
この条件を付けないと,やられたばい菌をクリックすれば,1匹のばい菌で何度も得点計算されます。
2.document.images[n].src=img1.src;
クリックされた絵の場所のばい菌をやっつけられた絵にします。
3.score=score+1; 得点計算です。
4.h_bact=true; h_bactがtrueに変わりますので,一度やられたばい菌をクリックしても得点計算されなくなります。
4)function START()
スタートボタンが押された時,初期化する必要があります。変数,絵を初期化します。
cnt=0;score=0;kaisu=0; 変数の初期化
document.images[cnt].src=img0.src; 絵の初期化
5)function bact()
1.if (kaisu<20){ ばい菌が出た回数が20未満であれば,ゲームを続けます。
2.前に表示されたばい菌の絵を背景の絵に置き換えます。
damy1=p_bact; ばい菌の表示された場所をdamy1に代入。
document.images[damy1].src=img0.src; damy1の場所の絵を背景の絵に置き換えます。
3.新たに表示する場所を乱数で求めます。
p_bact=Math.floor(Math.random()*scrnx*scrny);
Math.random()これは,0から1の間の乱数です。欲しい乱数は,0から7の乱数です。scrnx*scrnyをかけます。
Math.floor これは整数化するためのものです。ばい菌を表示する場所は整数ですのでこの計算が必要です。
4.ばい菌の絵を表示します。
1.ばい菌の表示
damy2=p_bact;
document.images[damy2].src=img2.src;
乱数で得られた新しい場所に,ばい菌の絵を表示します。
h_bact=false; 元気な時のばい菌ですので,h_bactにfalseを代入します。
2.表示場所の更新
1.5秒毎に,bact()関数が呼ばれて,新たな場所にばい菌表示します。
tid=setTimeout("bact()",1500);
3.回数計算
kaisu=kaisu+1;
4.ゲーム終了
else {clearTimeout(tid);
alert("ゲームオーバー");}}
最初の条件式if (kaisu<20)が満たされなくなると上記が実行され,ゲーム終了です。
2.複数の絵をランダムに配置する
何種類かの絵をバラバラに配置する時に使うものは,ランダムな順列です。
例はボタンを押すたびに絵の配列が変わります。ランダムな順列という乱数の使い方です。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
<HTML>
<HEAD>
<TITLE>Java Script 例2</TITLE>
<SCRIPT LANGUAGE=”JavaScript”>
<!−−
flag=new Array(6);
gazo=new Array(7);
ban=new Array(6);
var kk;
gazo[0]=new Image(100,100);gazo[1]=new Image(100,100);gazo[2]=new Image(100,100);gazo[3]=new Image(100,100);
gazo[4]=new Image(100,100);gazo[5]=new Image(100,100);gazo[5]=new Image(100,100);gazo[6]=new Image(100,100);
gazo[0].src="../game1/back2.gif";gazo[1].src="../game1/buta.gif";gazo[2].src="../game1/buta10.gif";
gazo[3].src="../game1/buta11.gif";gazo[4].src="../game1/buta12.gif";gazo[5].src="../game1/buta13.gif";
gazo[6].src="../game1/buta20.gif";
flag[0]=1,flag[1]=1,flag[2]=1,flag[3]=1,flag[4]=1,flag[5]=1;
ban[0]=0,ban[1]=1,ban[2]=2,ban[3]=3,ban[4]=4,ban[5]=5;
function disp(){
for (i=0;i<6;i++){
document.write("<A HREF='JavaScript:draw("+i+")'><IMG SRC='../game1/back2.gif' BORDER=0 WIDTH=100 HEIGHT=100></A>");}
document.write("<BR>");}
function draw(n){
if (flag[n]<0) {document.images[n].src=gazo[0].src;}
if (flag[n]>0) {kk=ban[n]+1;
document.images[n].src=gazo[kk].src;}
flag[n]=flag[n]*(-1);}
function START(){
for (i=0;i<=5;i++){flag[i]=1;
document.images[i].src=gazo[0].src;
ban[i]=i;}
for (i=5;i>0;i−−){
j=Math.floor(5*Math.random());
d=ban[i];ban[i]=ban[j];ban[j]=d;}}
//−−>
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT LANGUAGE=”JavaScript”>
<!−−
disp();
//−−>
</SCRIPT>
<FORM NAME="MyForm">
<INPUT TYPE="button" VALUE="スタート" onClick="START(this)">
</FORM>
</BODY>
</HTML>
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
例2表示 ここをクリックして下さい。例が表示されます。
<解説>
1)初期値
1.画像
gazo[0].srcは,背景の絵です。gazo[1].srcからgazo[6].srcは表示する絵です。
2.変数
var kk; 絵を表示する場所を代入する変数
flag[0]=1,flag[1]=1,flag[2]=1,flag[3]=1,flag[4]=1,flag[5]=1;
絵を表示するか,背景を表示するかを決める変数
ban[0]=0,ban[1]=1,ban[2]=2,ban[3]=3,ban[4]=4,ban[5]=5;
絵をどの場所に表示するかの変数
2)function disp()
説明省略
3)function draw(n)
絵がクリックされた時の処理
flag[n]の初期値は1です。背景の絵が表示されていて,クリックすると絵が表示されます。そして,flag[n]は−1に置き換わります。
ですからflag[n]=1は,背景が表示されているとき,flag[n]=−1の時は絵が表示されているときです。
flag[n]が正か負かでどちらの絵を表示するか判断します。
1.if (flag[n]<0)
{document.images[n].src=gazo[0].src;}
クリックされた時,背景に変えます。
2.if (flag[n]>0) {kk=ban[n]+1;
document.images[n].src=gazo[kk].src;}
クリックされた時,絵に変えます。kk=ban[n]+1これは,乱数と絵の番号に1つ差があるために1を加えます。
3.flag[n]=flag[n]*(-1);
flag[n]を変える。
4)function START()
1.初期化
for (i=0;i<=5;i++){flag[i]=1;
document.images[i].src=gazo[0].src;
flag[i]を初期化して,絵も背景にします。
ban[i]=i;}
ban[i]が,ランダムな配列を得るためのものです。0から5までの数字が入ります。
ban[0]=0,ban[1]=1,...
gazo[n]は1から6までの番号の所に絵がありますので,前にkk=ban[n]+1と計算して代入してます。
2.ランダム配列
for (i=5;i>0;i−−){
j=Math.floor(5*Math.random());
d=ban[i];ban[i]=ban[j];ban[j]=d;}}
前の初期化のban[0]=0,ban[1]=1,..を含めて,これはそのままテクニックとして覚えて下さい。ban[i]とban[j]を入れ替えてバラバラの配列を作ります。
ban[0]=0,ban[1]=1,ban[2]=2,ban[3]=3,ban[4]=4,ban[5]=5と並んだものを入れ変えます。5番と3番を入れ替えれば
ban[0]=0,ban[1]=1,ban[2]=2,ban[3]=5,ban[4]=4,ban[5]=3 さらに4番と1番を入れ替えれば
ban[0]=0,ban[1]=4,ban[2]=2,ban[3]=5,ban[4]=1,ban[5]=3となります。これを繰り返すとランダム配列ができます。
娯楽室の各部屋