Сообщение от Dilettante_Pro
|
закомментировал загрузку скрипта <script src="battleship.js"></script>
|
проблема в том, что там находится основной код программы и что-то в нем конфликтует с window.onload, что это может быть?
battleship.js:
var model = {
boardSize: 10,//размер поля
numShips: 10,//количество кораблей
shipLength: [1, 2, 3, 4],//длина каждого из 4 кораблей
shipsSunk: 0,//потоплено кораблей
ships:[ {locations: [0], hits: [""]},//0
{locations: [0], hits: [""]},//1
{locations: [0], hits: [""]},//2
{locations: [0], hits: [""]},//3
{locations: [0, 0], hits: ["", ""]},//4
{locations: [0, 0], hits: ["", ""]},//5
{locations: [0, 0], hits: ["", ""]},//6
{locations: [0, 0, 0], hits: ["", "", ""]},//7
{locations: [0, 0, 0], hits: ["", "", ""]},//8
{locations: [0, 0, 0, 0], hits: ["", "", "", ""]}],//9
generateShipLocations: function() {
var locations;
for(var i = 0; i < this.numShips; i++) {
do {
if (i < 4) {
locations = this.generateShip1();//генрируются корабли на одну клетку
} else if (i > 3 && i < 7) {
locations = this.generateShip2(2);//на две
} else if (i > 6 && i < 9) {
locations = this.generateShip2(3);//на три
} else {
locations = this.generateShip2(4);//на четыре
}
} while (this.collision(locations)||this.around(locations));//проверка на наезды
this.ships[i].locations = locations;//установление позиции
console.log(this.ships[i].locations);
}
},
generateShip1: function() {
var row, col;
row = Math.floor(Math.random() * this.boardSize);//горизонталь
col = Math.floor(Math.random() * this.boardSize);//вертикаль
var newShipLocations = [];
newShipLocations.push(row + "" + col);
return newShipLocations;
},
generateShip2: function(l) {
var direction = Math.floor(Math.random() * 2);//установления положения
var row, col;
if (direction === 1) {
row = Math.floor(Math.random() * this.boardSize);
col = Math.floor(Math.random() * (this.boardSize-this.shipLength[l-1]));//горизантально
} else {
row = Math.floor(Math.random() * (this.boardSize-this.shipLength[l-1]));
col = Math.floor(Math.random() * this.boardSize);//вертикально
}
var newShipLocations = [];
for (var i = 0; i<this.shipLength[l-1]; i++) {
if (direction === 1) {
newShipLocations.push(row + "" + (col + i));
} else {
newShipLocations.push((row + i) + "" + col);
}
}
return newShipLocations;
},
around: function(locations) {
var round = [-11, -10, -9, -1, 1, 9, 10, 11];
for (var i = 0; i < this.numShips; i++) {
var ship = model.ships[i];//пребирание разных кораблей
for (var j = 0; j < locations.length; j++) {
for (var h = 0; h < round.length; h++) {
if (ship.locations.indexOf(String(Number(locations[j]) + round[h])) >= 0) {//проверка присутствия заданых координат
return true;
}
}
}
}
return false;
},
collision: function(locations) {//массив позиций для нового коробля
for (var i = 0; i < this.numShips; i++) {
var ship = model.ships[i];//пребирание разных кораблей
for (var j = 0; j < locations.length; j++) {
if (ship.locations.indexOf(locations[j]) >= 0) {//проверка присутствия заданых координат
return true;
}
}
}
return false;
},
fire: function(guess) {//метод получает координаты выстрела
for (var i=0; i<this.numShips; i++) {//перебор массива ships
var ship = this.ships[i];// получение объекта ships
var index = ship.locations.indexOf(guess);// в массиве locations идет поиск координат, а метод indexOf возвращает его индекс или -1
if (index >= 0) {//если координаты есть в массиве
ship.hits[index] = "hit";//по тому же индексу в массиве hits ставится отметка
view.displayHit(guess);//вывод коробля на введенных координатах
view.displayMessage("HIT!");//вывод сообщения о попадании
if (this.isSunk(ship, this.ships[i].locations.length)) {//когда произошло попадание, идет проверка на потопление
view.displayMessage("You sank my battleship!");//вывод сообщения о потоплении
this.shipsSunk++;//если потоплен, то в свойство прибавляется 1
view.displaySank("Ships sank: " + this.shipsSunk);
}
return true;//попал
}
}
view.displayMiss(guess);//вывод miss на введенных координатах
view.displayMessage("You missed");//вывод сообщения о поподании
return false;//мимо
},
isSunk: function(ship, l) {//получение объекта коробля
for (var i=0; i<this.shipLength[l-1]; i++) {
if (ship.hits[i] !== "hit") {//проверяет, что все клетки помечены маркером поподания
return false;//если нет, то корабль жив
}
}
return true;//корабль потоплен
}
};
var controller = {
guesses: 0,
processGuess: function(guess) {
var location = parseGuess(guess);
if(location && alreadyHit(location)) {
this.guesses++;
var hit = model.fire(location);
if (hit && model.shipsSunk === model.numShips) {
view.displayMessage("You sank all my battleships, in " + this.guesses + " guesses");
}
}
}
};
var view = {
displayMessage: function(msg) {// функция получает сообщение, которое нужно отобразить
var messageArea = document.getElementById("messageArea");//получаем элемент по id
messageArea.innerHTML = msg; //обновление текста
},
displayHit: function(location) {
var cell = document.getElementById(location);// получаем элемент по определенным координатам
cell.setAttribute("class", "hit");//присваивание класса
},
displayMiss: function(location) {
var cell = document.getElementById(location);
cell.setAttribute("class", "miss");
},
displaySank: function(msg) {
var sankInformation = document.getElementById("sankInformation");
sankInformation.innerHTML = msg;
}
};
var nowStyle = 1;
function parseGuess (guess) {
var alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"];// алфавит
if (guess===null || guess.length !==2) { //если координаты null ИЛИ больше двух знаков..
alert("Oops, please enter a letter and a number of the board.");//..выводится сообщение
} else {
firstChar = guess.charAt(0);//перменной присваивается первый знак координат
var row = alphabet.indexOf(firstChar);//перменной присваивается индекс первого знака координат
var column = guess.charAt(1);//перменной присваивается второй знак координат
if (isNaN(row)|| isNaN(column)) {//если это не число
alert("Oops,that isn't on the board."); //выводится сообщение об ошибке
} else if (row<0 || row>=model.boardSize || column < 0 || column >= model.boardSize) {//если больше или меньше размеров..
alert ("Oops, that's off the board!");//..выводится сообщение об ошибке
} else {
return row + column;//если все ок, то возвращаются координаты
}
}
return null;
}
function alreadyHit (guess) {
for (var i=0; i < model.numShips; i++) {//перебор массива ships
var ship = model.ships[i];// получение объекта ships
var index = ship.locations.indexOf(guess);// в массиве locations идет поиск координат, а метод indexOf возвращает его индекс или -1
if (index >= 0 && ship.hits[index] == "hit") {//есть координаты И есть отметка hit
alert("You've already hit here! Try again");
return null;
} else {
return true;
}
}
}
function handleKeyPress (e) {
var fireButton = document.getElementById ("fireButton");
if (e.keyCode===13) {
fireButton.click();
return false;
}
}
function init() {
var fireButton = document.getElementById("fireButton");
fireButton.onclick = handleFireButton;
var guessInput = document.getElementById("guessInput");
guessInput.onkeypress = handleKeyPress;
model.generateShipLocations();
}
function handleFireButton() {
var guessInput = document.getElementById("guessInput");
var guess = guessInput.value;
controller.processGuess(guess);
guessInput.value = "";
}
window.onload = init;
for (var i = 0; i<model.boardSize; i++) {
for (var j = 0; j<model.broadSize; j++){
controller.processGuess(i + "" + j);
}
}