1

そこで、戦艦ゲームで 5 隻の船を作成するコードを作成しました。すべてのプレイヤーの船をレイアウトするコードを作成することに成功しました。バグはありませんでした。プレーヤーに船を配置したい場所のコードを書いてもらいました。次に、船の位置を、ゲーム マップである 2 次元配列の対応する部分に書き込みます。もちろん、コードは整数でなければなりません。そうしないと、クラッシュして燃えてしまいます。

そのため、他のことを行う前に、座標が整数かどうかを確認する何かを作成しました。そうでない場合は、関数の作成を再開して、関数の残りの部分が実行されないようにします。数字を正しく書けば問題ありません。問題は、番号を書き込まないと関数は再起動しますが、船が理由もなく配列に書き込まれるため、関数またはその一部はまだ実行されている必要があることです。コードは指定されていないので、これがどのように可能になるのかわかりません.

整数かどうかを確認して関数を再起動するために作成したコードを次に示します。

userYTest = parseInt(prompt("Horizontal Coordinate position for the first unit of a ship"));
userXTest = parseInt(prompt("Vertical Coordinate position for the first unit of a ship"));

        if(userXTest % 1 === 0 && userYTest % 1 === 0) {
            userY = userYTest-1;
            userX = userXTest-1;
            direction = prompt("Now choose the direction you want the rest of your ship to face.  You may   use the words left, right up, or down.").toLowerCase(); 
        }
        else{
            window.alert("You must enter a number between one and ten for the two coordinates.");
            ship();
//ship is the name of the function
        }

これがすべてのコードです。

//These are all the different game boards you need to keep track of. Two possible values in each position 1 or 0
var user = [[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]];
var cpu = [[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]];
var userGuessed = [[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]];
var userHit = [[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]];
var cpuGuessed = [[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]];
var cpuHit = [[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]];

var clearBoard = [[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]];

// These are just used to set left the game board.
// I counted 10 by 10 - it should be 10 by 10
var userY = 0;
var userX = 0;
var cpuX = 0;
var cpuY = 0;
var cpuDir = 0;
var cpuWork = false;
var direction = "";
var isThere = false;
var i=0;
var userXTest;
var userYTest;

// In battleship, there is 1x5 length ship, 1x4 length ship, 2 1x3 length ship, and 1x2 length ship. down now it checks how many units are covered to see if you have all the ships. Later we need to add so they ships are the down shape


//User will add their ships here one by one.  If you can think of a better have a go at it!

for(i=0;i<4;i++){
    if (i===0){
        window.alert("We will be placing your 1 by 5 length ship.  Take note that you are playing on a 10 by 10 board.");
        ship();
    }
    if (i===1){
        window.alert("We will be placing your 1 by 4 length ship.  Take note that you are playing on a 10 by 10 board.");
        ship();
    }
    if (i===2){
        window.alert("We will be placing your two 1 by 3 length ships.  Take note that you are playing on a 10 by 10 board.");
        ship();
        ship();
    }
    if (i===3){
        window.alert("We will be placing your 1 by 2 length ship.  Take note that you are playing on a 10 by 10 board.");
        ship();
    }
    function ship(){
        userYTest = parseInt(prompt("Horizontal Coordinate position for the first unit of a ship"));
        userXTest = parseInt(prompt("Vertical Coordinate position for the first unit of a ship"));

        if(userXTest % 1 === 0 && userYTest % 1 === 0) {
            userY = userYTest-1;
            userX = userXTest-1;
            direction = prompt("Now choose the direction you want the rest of your ship to face.  You may   use the words left, right up, or down.").toLowerCase(); 
        }
        else{
            window.alert("You must enter a number between one and ten for the two coordinates.");
            ship();
        }
        //Making sure the ship will fit and nothing is already there!
        if ((userY+4-i)>9 && direction=== "down"){
         window.alert("You are too close to the down edge of the board to do that. Restarting...");
         ship();
        }
        else if ((userY-4-i)<0 && direction=== "up"){
         window.alert("You are too close to the up edge of the board to do that. Restarting...");
         ship();
        }
        else if ((userX+4-i)>9 && direction=== "right"){
         window.alert("You are too close to the bottom edge of the board to do that. Restarting...");
         ship();
        }
        else if ((userX-4-i)<0 && direction=== "left"){
         window.alert("You are too close to the top edge of the board to do that. Restarting...");
         ship();
        }
        else if (user[userY][userX] === 1) {
            window.alert("Coordinate already used. Please try again");
            ship();
        } 

        else if (user[userY][userX] === null || user[userY][userX] === ""){
            window.alert("That coordinate isn't on the board. Restarting...");
            ship();
        }

        else if(direction ==="left" || direction ==="right" || direction ==="up" || direction ==="down") {
            for(var a=1; a<5-i; a++){

                if(direction=== "down"){
                    if(user[userY+a][userX] === 1){
                        window.alert("Can't place your ship in that direction, another ship is in your way.");
                        isThere=true;
                    }
                }
                if(direction=== "up"){
                    if(user[userY-a][userX] === 1){
                        window.alert("Can't place your ship in that direction, another ship is in your way.");
                        isThere=true;
                    }
                }
                if(direction=== "right"){
                    if(user[userY][userX+a] === 1 ){
                        window.alert("Can't place your ship in that direction, another ship is in your way.");
                        isThere=true;
                    }
                }
                if(direction=== "left"){
                    if(user[userY][userX-a] === 1){
                        window.alert("Can't place your ship in that direction, another ship is in your way.");
                        isThere=true;
                    }
                }
                if(isThere===true){
                    isThere = false;
                    ship(); 
                    return false;
                }
                else{
                    user[userY][userX] = 1;
                }
            }

        }
        else{
            window.alert("Sorry but you didn't type in the direction you wanted your ship to go correctly. Restarting...");
            ship();
        }


        // Building Ship 1x5
        for(var b=1; b<5-i; b++){

            if (direction==="left"){
                user[userY][userX-b] =1;
            }
            else if (direction==="right"){
                user[userY][userX+b] =1;
            }
            else if (direction==="up"){
                user[userY-b][userX] =1;
            }
            else if (direction==="down"){
                user[userY+b][userX] =1;
            }
        }
}

}

console.log(user);
4

2 に答える 2

1

まず、関数自体を呼び出しても、元の関数の実行は停止しないことを理解してください。これ(jsfiddle)を試して、それがどのように機能するかを確認してください:

var i = 0;
function askDogsName() {
    var dogsName = prompt("What is the dog's name?");
    if (dogsName != "Rover") {
        askDogsName();
    }
    i++;
    document.body.innerHTML += "i = " + i
        + "; dog's name: " + dogsName + '<br />';
}
askDogsName();

関数の新しい再帰が完了すると、元の再帰は単に中断したところから続行されます。「再起動」しません。したがって、特にグローバル変数を使用しているため、これは有効でないユーザー入力に応答する良い方法ではありません。関数の各再帰は、制御をその「親」(それを呼び出した関数の再帰) に戻す前に、予測が困難になる方法でこれらの変数を変更する可能性があります。

代わりにできることは、戻り値を使用して、正しい入力が与えられたかどうかを確認することです。

function ship() {
     var c;
     while (!c) {
         c = getValidCoords();
     }
     x = c[0];
     y = c[1];
     // then make the ship at x, y
 }
 function getValidCoords() {
     y = parseInt(prompt("Horizontal Coordinate position for the first unit of a ship"));
     x = parseInt(prompt("Vertical Coordinate position for the first unit of a ship"));
     // conduct various tests on x and y
     if (testsFail) {
         return false;
     }
     return [x, y];
  }
于 2013-08-10T00:49:04.810 に答える
1

間違っている場合は再帰できません。次のようなことを試してください:

var done;
while (!done) {
    if(userXTest % 1 === 0 && userYTest % 1 === 0) {
        userY = userYTest-1;
        userX = userXTest-1;
        direction = prompt("Now choose the direction you want the rest of your ship to face.  You may   use the words left, right up, or down.").toLowerCase(); 

        ... All the other tests that are after the else part ...

        else { // if its a good answer
            done = true;
        }
    }
    else{
        window.alert("You must enter a number between one and ten for the two coordinates.");
    }

}

彼らもやめたいと言うことができる何らかの方法が必要になるでしょう。

于 2013-08-09T23:55:07.443 に答える