JavaScriptの勉強を始め、どうしても分からない事があるので、質問させて下さい。


課題のHTMLです。
http://kent-ymmt.xsrv.jp/sample.txt

【課題1】敵を5体にする
【課題2】乱数を用いて敵もたまに攻撃するようにする
変数はなんとなく分かるのですが、所詮なんとなくなので、うまく動きません...
途中で挫折気味ですが、どうしても完成させたいのでよろしくお願いします。ちなみにIEでしか動作出来ないようです。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2008/01/19 18:04:59
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:hidering No.2

回答回数59ベストアンサー獲得回数3

ポイント40pt

http://kent-ymmt.xsrv.jp/sample.txt

↑ダミーです。

こんにちは。面白そうなのでちょっとひまつぶしに書いてみました。

課題が2つ挙げられていますが、敵が攻撃してくることでやらなければならないことが沢山でてきますね。

私はJavaScriptに詳しくないのでソースが汚いかもしれませんが、参考にしてください。


// GameOverかどうか

gameoverFlag = false;

// 自機のX座標の最初の値

fighterX = 0;

// 自機を移動させる

function moveFighter()

{

if(gameoverFlag == true)return;

if(event.keyCode == 74)fighterX = fighterX -2; //J key

if(event.keyCode == 76)fighterX = fighterX +2; //L key

if(event.keyCode == 75)startBeam(); //K key

document.Fighter.style.left = fighterX;

}

// 敵を動かす

var tekiX = new Array(4);

var tekiY = new Array(4);

tekiDx = 2;// 移動する値

function moveEnemy()

{

if(gameoverFlag == true)return;


for(i=0;i<=4;i++){

tekiX[i] = parseInt(document.images["Teki"+i].style.left);

tekiY[i] = parseInt(document.images["Teki"+i].style.top);

}

for(i=0;i<=4;i++){

tekiX[i]=tekiX[i]+tekiDx;

if(tekiX[i]>300){

tekiDx= -2;

for(j=0;j<=4;j++){tekiY[j]=tekiY[j]+10;}

}else if(tekiX[i]<0){

tekiDx=2;

for(j=0;j<=4;j++){tekiY[j]=tekiY[j]+10;}

}

}


for(i=0;i<=4;i++){

document.images["Teki"+i].style.left = tekiX[i];

document.images["Teki"+i].style.top = tekiY[i];

}

var boflg = false;

var clear = 0;

for(i=0;i<=4;i++){

if(tekiY[i] > 150)

{

if(document.images["Teki"+i].style.visibility!="hidden"){boflg = true;}

if(boflg == true){

alert("敵に侵略された!ゲームオーバー");

gameoverFlag = true;

return;

}

}else{if(document.images["Teki"+i].style.visibility=="hidden"){clear++;}}

}

if(clear==5){

alert("ゲームクリア!!");

gameoverFlag = true;

return;

}

if(Math.random()<0.20){

startTekibeam();

}

moveBeam();

moveTekibeam();

setTimeout("moveEnemy()",50);

}

// ビームを発射する

beamFlag = false;

beamX = 0;

beamY = 0;

function startBeam()

{

if(beamFlag == true)return;

beamFlag = true;

beamY = 120;

beamX = fighterX + 12;

}

// ビームを移動する

function moveBeam()

{

if(beamFlag == false)return;

beamY = beamY -5;

document.Beam.style.left = beamX;

document.Beam.style.top = beamY;

if(beamY < -40)beamFlag = false;

hitCheck();

}

// 接触判定

function hitCheck()

{

for(i=0;i<=4;i++){

if((beamX + 8) < tekiX[i]) continue;

if((tekiX[i] + 32) < beamX) continue;

if((beamY + 32) < tekiY[i]) continue;

if((tekiY[i] + 32) < beamY) continue;

document.images["Teki"+i].style.visibility="hidden";

}

}

// 敵ビームを発射するl

beamEnemyFlag = false;

var beamEnemyX = 0;

var beamEnemyY = 0;

function startTekibeam()

{

if(beamEnemyFlag == true)return;

beamEnemyFlag = true;

a=0;

a=Math.floor( Math.random() * 10 /2 );

if(document.images["Teki"+a].style.visibility!="hidden"){

beamEnemyX = tekiX[a];

beamEnemyY = tekiY[a];

}

}

// 敵ビームを移動する

function moveTekibeam()

{

if(beamEnemyFlag == false)return;

beamEnemyY = beamEnemyY + 5;

document.Beam.style.left = beamEnemyX;

document.Beam.style.top = beamEnemyY;

if(beamEnemyY > 172)beamEnemyFlag = false;

tekihitCheck()

}

// 敵ビーム接触判定

function tekihitCheck()

{

if((beamEnemyX + 8) < fighterX) return;

if((fighterX + 32) < beamEnemyX) return;

if((beamEnemyY + 32) < 150) return;

if(182 < beamEnemyY) return;

alert("敵にやられた。ゲームオーバー!!");

gameoverFlag = true;

return;

}


body内のimgは以下のようにします。

img src="teki.jpg" name="Teki0" style="position:absolute;left:0px;top:0px;"

img src="teki.jpg" name="Teki1" style="position:absolute;left:0px;top:0px;"

img src="teki.jpg" name="Teki2" style="position:absolute;left:0px;top:0px;"

img src="teki.jpg" name="Teki3" style="position:absolute;left:0px;top:0px;"

img src="teki.jpg" name="Teki4" style="position:absolute;left:0px;top:0px;"

id:elk-elg

ありがとうございます!作動しています。が、敵が一体しか表示されていません。余力がありましたら、修正してもらえませんでしょうか?よろしくお願いします。

2008/01/19 17:51:07

その他の回答2件)

id:so-asano No.1

回答回数40ベストアンサー獲得回数5

ポイント40pt

課題ってことなんで、間違ってる点を軽く指摘していく感じで。


# var tekiX = new Array(4);


オブジェクトのスコープ、ってことを考えよう。function 内だと、寿命がその中だけになってしまう。


# tekiX = tekiX + tekiDx;


配列を使っているんだから、この記述はおかしいよね。あと、TekiY も配列にしなくていいのかな?


# for(i=0;i>4;i++){


これだと、いきなりループを抜けてしまうよね? 0~4 まで、5回ループを回したいなら、for(i=0; i<5; i++) って書かないと。for 文について、理解を深めよう。

あと、ビームに関連する変数も、敵側のものを設けて、それの処理もしないといけないよね。


コードが書き進んだら、また回答しようかと。とりあえず、ってことで。


url が必要な気もしないので。http://xxx.xxx

id:elk-elg

ありがとうございます。自分の実力では早かったようです。精進します。

2008/01/19 17:49:36
id:hidering No.2

回答回数59ベストアンサー獲得回数3ここでベストアンサー

ポイント40pt

http://kent-ymmt.xsrv.jp/sample.txt

↑ダミーです。

こんにちは。面白そうなのでちょっとひまつぶしに書いてみました。

課題が2つ挙げられていますが、敵が攻撃してくることでやらなければならないことが沢山でてきますね。

私はJavaScriptに詳しくないのでソースが汚いかもしれませんが、参考にしてください。


// GameOverかどうか

gameoverFlag = false;

// 自機のX座標の最初の値

fighterX = 0;

// 自機を移動させる

function moveFighter()

{

if(gameoverFlag == true)return;

if(event.keyCode == 74)fighterX = fighterX -2; //J key

if(event.keyCode == 76)fighterX = fighterX +2; //L key

if(event.keyCode == 75)startBeam(); //K key

document.Fighter.style.left = fighterX;

}

// 敵を動かす

var tekiX = new Array(4);

var tekiY = new Array(4);

tekiDx = 2;// 移動する値

function moveEnemy()

{

if(gameoverFlag == true)return;


for(i=0;i<=4;i++){

tekiX[i] = parseInt(document.images["Teki"+i].style.left);

tekiY[i] = parseInt(document.images["Teki"+i].style.top);

}

for(i=0;i<=4;i++){

tekiX[i]=tekiX[i]+tekiDx;

if(tekiX[i]>300){

tekiDx= -2;

for(j=0;j<=4;j++){tekiY[j]=tekiY[j]+10;}

}else if(tekiX[i]<0){

tekiDx=2;

for(j=0;j<=4;j++){tekiY[j]=tekiY[j]+10;}

}

}


for(i=0;i<=4;i++){

document.images["Teki"+i].style.left = tekiX[i];

document.images["Teki"+i].style.top = tekiY[i];

}

var boflg = false;

var clear = 0;

for(i=0;i<=4;i++){

if(tekiY[i] > 150)

{

if(document.images["Teki"+i].style.visibility!="hidden"){boflg = true;}

if(boflg == true){

alert("敵に侵略された!ゲームオーバー");

gameoverFlag = true;

return;

}

}else{if(document.images["Teki"+i].style.visibility=="hidden"){clear++;}}

}

if(clear==5){

alert("ゲームクリア!!");

gameoverFlag = true;

return;

}

if(Math.random()<0.20){

startTekibeam();

}

moveBeam();

moveTekibeam();

setTimeout("moveEnemy()",50);

}

// ビームを発射する

beamFlag = false;

beamX = 0;

beamY = 0;

function startBeam()

{

if(beamFlag == true)return;

beamFlag = true;

beamY = 120;

beamX = fighterX + 12;

}

// ビームを移動する

function moveBeam()

{

if(beamFlag == false)return;

beamY = beamY -5;

document.Beam.style.left = beamX;

document.Beam.style.top = beamY;

if(beamY < -40)beamFlag = false;

hitCheck();

}

// 接触判定

function hitCheck()

{

for(i=0;i<=4;i++){

if((beamX + 8) < tekiX[i]) continue;

if((tekiX[i] + 32) < beamX) continue;

if((beamY + 32) < tekiY[i]) continue;

if((tekiY[i] + 32) < beamY) continue;

document.images["Teki"+i].style.visibility="hidden";

}

}

// 敵ビームを発射するl

beamEnemyFlag = false;

var beamEnemyX = 0;

var beamEnemyY = 0;

function startTekibeam()

{

if(beamEnemyFlag == true)return;

beamEnemyFlag = true;

a=0;

a=Math.floor( Math.random() * 10 /2 );

if(document.images["Teki"+a].style.visibility!="hidden"){

beamEnemyX = tekiX[a];

beamEnemyY = tekiY[a];

}

}

// 敵ビームを移動する

function moveTekibeam()

{

if(beamEnemyFlag == false)return;

beamEnemyY = beamEnemyY + 5;

document.Beam.style.left = beamEnemyX;

document.Beam.style.top = beamEnemyY;

if(beamEnemyY > 172)beamEnemyFlag = false;

tekihitCheck()

}

// 敵ビーム接触判定

function tekihitCheck()

{

if((beamEnemyX + 8) < fighterX) return;

if((fighterX + 32) < beamEnemyX) return;

if((beamEnemyY + 32) < 150) return;

if(182 < beamEnemyY) return;

alert("敵にやられた。ゲームオーバー!!");

gameoverFlag = true;

return;

}


body内のimgは以下のようにします。

img src="teki.jpg" name="Teki0" style="position:absolute;left:0px;top:0px;"

img src="teki.jpg" name="Teki1" style="position:absolute;left:0px;top:0px;"

img src="teki.jpg" name="Teki2" style="position:absolute;left:0px;top:0px;"

img src="teki.jpg" name="Teki3" style="position:absolute;left:0px;top:0px;"

img src="teki.jpg" name="Teki4" style="position:absolute;left:0px;top:0px;"

id:elk-elg

ありがとうございます!作動しています。が、敵が一体しか表示されていません。余力がありましたら、修正してもらえませんでしょうか?よろしくお願いします。

2008/01/19 17:51:07
id:hidering No.3

回答回数59ベストアンサー獲得回数3

ポイント20pt

http://kent-ymmt.xsrv.jp/sample.txt

↑ダミーです。

body内のimgが違ってました。ここで敵の位置が初期化されてます。

img src="teki.jpg" name="Teki0" style="position:absolute;left:0px;top:0px;"

img src="teki.jpg" name="Teki1" style="position:absolute;left:40px;top:0px;"

img src="teki.jpg" name="Teki2" style="position:absolute;left:80px;top:0px;"

img src="teki.jpg" name="Teki3" style="position:absolute;left:120px;top:0px;"

img src="teki.jpg" name="Teki4" style="position:absolute;left:160px;top:0px;"

id:elk-elg

ありがとうございます。作動しました。

2008/01/19 18:02:24

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません