MaminProgrammist
@MaminProgrammist
Я слава беброу

Как мне укоротить код, но так, чтобы функционал не менялся?

Учу js, делаю задание. Сделал игру - камень-ножницы-бумага + (расширенная версия) камень-ножницы-бумага-ящерица-спок. Игру я сделал и она соответствует требованиям задания, вот только код, ну вот, слиииииииииииишком большой.
Как мне его укоротить? Посоветуйте, пожалуйста, или скиньте уже укороченный код, если вам не лень.
Вот сам код:
flag1 = true
flag2 = true
while (flag1) {
    var gameModeChange = prompt('Выберите режим игры - rps или rpsls (Rock-paper-scissors или Rock-paper-scissors-lizard-spock)\nЕсли захотите завершить игру, напишите "отмена"');

    var computerScore = 0;
    var userScore = 0;
    
    if (gameModeChange === 'rps' || gameModeChange === 'rpsls') {
        while (flag2) {
            const computerRandChoice = () => {
                let random = Math.random()
                if (gameModeChange === 'rps') {
                    if (random <= 0.33) {
                        computer = 'камень';
                    } else if (0.34 <= random && random <= 0.66) {
                        computer = 'ножницы';
                    } else {
                        computer = 'бумага';
                    }
                } else if (gameModeChange === 'rpsls') {
                    if (random <= 0.2) {
                        computer = 'камень';
                    } else if (0.21 <= random && random <= 0.4) {
                        computer = 'ножницы';
                    } else if (0.41 <= random && random <= 0.6) {
                        computer = 'бумага';
                    } else if (0.61 <= random && random <= 0.8) {
                        computer = 'ящерица';
                    } else {
                        computer = 'спок';
                    }
                };

                return computer
            };

            computerRandChoice()

            let computerChoice = computerRandChoice();

            if (gameModeChange === 'rps') {
                let userChoice = prompt('Камень\nНожницы\nБумага\n(Отобразить) очки\nОтмена')
                userChoice = userChoice.toLowerCase();
                if (userChoice === 'камень' && computerChoice === 'ножницы' || userChoice === 'ножницы' && computerChoice === 'бумага' || userChoice === 'бумага' && computerChoice === 'камень') {
                    userScore += 1;
                    alert(`Вы получили очко, потому-что Вы выбрали ${userChoice}, а компьютер выбрал ${computerChoice}.`)
                } else if (computerChoice === 'камень' && userChoice === 'ножницы' || computerChoice === 'ножницы' && userChoice === 'бумага' || computerChoice === 'бумага' && userChoice === 'камень') {
                    computerScore += 1;
                    alert(`Компьютер получил очко, потому-что вы выбрали ${userChoice}, а компьютер выбрал ${computerChoice}.`)
                } else if (userChoice === 'очки') {
                    alert(`Вы: ${userScore}\nКомпьютер: ${computerScore}`)
                } else if (userChoice === computerChoice) {
                    alert('Ничья');
                } else if (userChoice === 'отмена') {
                    flag2 = false
                }
            } else if (gameModeChange === 'rpsls') {
                let userChoice = prompt('Камень\nНожницы\nБумага\nЯщерица\nСпок\n(Отобразить) Очки\nОтмена')
                userChoice = userChoice.toLowerCase();
                if (userChoice === 'камень' && computerChoice === 'ножницы' || userChoice === 'камень' && computerChoice === 'ящерица' || userChoice === 'ящерица' && computerChoice === 'бумага' || userChoice === 'ящерица' && computerChoice === 'спок' || userChoice === 'спок' && computerChoice === 'ножницы' || userChoice === 'спок' && computerChoice === 'камень' || userChoice === 'ножницы' && computerChoice === 'бумага' || userChoice === 'ножницы' && computerChoice === 'ящерица' || userChoice === 'бумага' && computerChoice === 'спок' || userChoice === 'бумага' && computerChoice === 'камень') {
                    userScore += 1;
                    alert(`Вы получили очко, потому-что Вы выбрали ${userChoice}, а компьютер выбрал ${computerChoice}.`)
                } else if (computerChoice === 'камень' && userChoice === 'ножницы' || computerChoice === 'камень' && userChoice === 'ящерица' || computerChoice === 'ящерица' && userChoice === 'бумага' || computerChoice === 'ящерица' && userChoice === 'спок' || computerChoice === 'спок' && userChoice === 'ножницы' || computerChoice === 'спок' && userChoice === 'камень' || computerChoice === 'ножницы' && userChoice === 'бумага' || computerChoice === 'ножницы' && userChoice === 'ящерица' || computerChoice === 'бумага' && userChoice === 'спок' || computerChoice === 'бумага' && userChoice === 'камень') {
                    computerScore += 1;
                    alert(`Компьютер получил очко, потому-что вы выбрали ${userChoice}, а компьютер выбрал ${computerChoice}.`)
                } else if (userChoice === computerChoice) {
                    alert('Ничья');
                } else if (userChoice === 'очки') {
                    alert(`Вы: ${userScore}\nКомпьютер: ${computerScore}`)
                } else if (userChoice === 'отмена') {
                    flag2 = false
                }
            } 
        }

        let diff = 0;

        if (userScore > computerScore) {
            diff += userScore - computerScore;
            alert(`Вы победили с отрывом в ${diff} очко/очка/очков\nВы победили ${userScore} раз\nКомпьютер ${computerScore} раз`)
        } else if (computerScore > userScore) {
            diff += computerScore - userScore;
            alert(`Компьютер победил вас с отрывом в ${diff} очко/очка/очков\nВы победили ${userScore} раз\nКомпьютер ${computerScore} раз`)
        } else if (computerScore === userScore){
            alert(`Ничья\nВы победили ${userScore} раз\nКомпьютер ${computerScore} раз`)
        }

    } else {
        flag1 = false
    }
}
  • Вопрос задан
  • 170 просмотров
Решения вопроса 3
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
отрефакторите, вынесите куски кода в функции, текстовые строки в константы, да и вообще используйте форматированные строки

let message = `Ничья
Вы победили ${userScore} раз
Компьютер ${computerScore} раз`
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const declination = (number, titles) => titles[
  (number % 100 > 4 && number % 100 < 20)
    ? 2
    : [2, 0, 1, 1, 1, 2][(number % 10 < 5) ? number % 10 : 5]
  ];

const games = {
  rps: ['камень', 'ножницы', 'бумага'],
  rpsls: ['камень', 'ножницы', 'бумага', 'ящерица', 'спок']
};
const beats = {
  камень: ['ножницы', 'бумага'],
  ножницы: ['бумага', 'ящерица'],
  бумага: ['камень', 'спок'],
  ящерица: ['бумага', 'спок'],
  спок: ['ножницы', 'камень'],
};
const winMsgs = ['Ничья', 'Вы победили', 'Компьютер победил'];

const gameNames = Object.keys(games).map((k) => `${k} (${games[k].join('-')})`);
const selectGameMsg = `Выберите режим игры:\n${gameNames.join('\n')}\nдругое значение для завершения`;
while (true) {
  let gameMode = prompt(selectGameMsg);
  let choices = games[gameMode] ?? null;
  if (choices === null) {
    break;
  }
  let userChoiceMsg = `Выберите свой ход:\n${choices.join('\n')}\nочки - показать счётчик побед\nвыход - завершить игру`;
  let userWins = 0;
  let compWins = 0;
  while (true) {
    let userChoice = prompt(userChoiceMsg);
    if (userChoice === 'выход') {
      break;
    }
    if (userChoice === 'очки') {
      alert(`Ваших побед: ${userWins}\nПобед компьютера: ${compWins}`);
    }
    if (!choices.includes(userChoice)) {
      continue;
    }
    let compChoice = choices[Math.floor(Math.random() * choices.length)];
    let winner = 0;
    if (beats[userChoice].includes(compChoice)) {
      winner = 1;
      userWins += 1;
    } else if (beats[compChoice].includes(userChoice)) {
      winner = 2;
      compWins += 1;
    }
    alert(`Ваш выбор: ${userChoice}\nВыбор компьютера: ${compChoice}\n${winMsgs[winner]}`);
  }
  let finalMsg = 'Ничья';
  let diff = userWins - compWins;
  if (diff > 0) {
    finalMsg = `Вы выиграли с перевесом в ${diff} ${declination(diff, ['очко', 'очка', 'очков'])}`;
  } else if (diff < 0) {
    finalMsg = `Компьютер выиграл с перевесом в ${-diff} ${declination(-diff, ['очко', 'очка', 'очков'])}`;
  }
  alert(`Ваших побед: ${userWins}\nПобед компьютера: ${compWins}\n${finalMsg}`);
}
Ответ написан
Комментировать
Fragster
@Fragster
помогло? отметь решением!
Вынести данные для if объекты (отдельно для каждого типа игры) с ключом - id варианта - с полями: представление варианта, массив id кого бьет. Остальной код становится тривиальным.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы