Forezz

Быки и коровы

Jan 8th, 2022
1,055
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function randomInteger(min, max) {//возвращает случайное число от min до max
  2.     if (min > max) throw new Error('min > max');//ловим неверные min и max
  3.  
  4.     return Math.floor(Math.random() * (max + 1 - min) + min);
  5.  
  6. }
  7.  
  8. //возвращает случайный набор из уникальных цифр заданной длины
  9. function randomNumberFromLength(min_length, max_length) {
  10.     if (min_length > max_length) {//ловим неверные min и max
  11.         alert('До > После');
  12.         return;    
  13.     }
  14.  
  15.     if ((0 >= min_length) || (0 >= max_length)) {//ловим неверные min и max
  16.         alert('Ну и как прикажете обрабатывать такую длину?');
  17.         return;    
  18.     }
  19.  
  20.     let numberLength = randomInteger(min_length, max_length);//случайная длина
  21.     let number = '';
  22.     for (let i = 0; i < numberLength; i++) {
  23.         while (true) {
  24.             let rand = randomInteger(0, 9);
  25.             if (!number.includes(rand)) {
  26.                 number += rand;
  27.                 break;
  28.             }
  29.         }
  30.     }
  31.     return number;
  32. }
  33.  
  34. /*
  35. функция нужна для проверки корректности числа.
  36. Для выхода из неё либо придётся убить программу, либо ввести корректное число, которое она и вернёт
  37. asStr нужен для вывода числа в типе строка
  38. */
  39. function askCorrectNumber(text="", default_value="1", asStr=false) {
  40.     let number;
  41.     while (true) {
  42.         number = prompt(text, default_value);//text и default_value используются только здесь
  43.         if (number == null) {
  44.             menu.innerHTML = 'Отмена ввода пользователем';
  45.             throw new Error('Отмена ввода пользователем');
  46.         }
  47.         if (isFinite(number) && number != '') {
  48.             break;
  49.         } else {
  50.             alert('Некорректное число');
  51.         }
  52.     }
  53.     if (asStr) return number.trim(); //trim для обрезки пробелов в начале и конце
  54.     return +number;
  55. }
  56.  
  57. function Game () {//конструктор игры
  58.     //запрашивает у пользователя верные параметры числа, потом загадывает и возвращает его
  59.     this.createConceivedNumber = function () {
  60.         while (true) {
  61.             let a = askCorrectNumber('Введите от какой длины вы хотите угадывать число:', 3);
  62.             let b = askCorrectNumber('Введите до какой длины вы хотите угадывать число:', 6);
  63.             let conceivedNumber = randomNumberFromLength(a, b);
  64.             console.log(`Загаданное число ${conceivedNumber}`);
  65.             if (conceivedNumber)  {
  66.                 alert(`Длина загаданного числа = ${conceivedNumber.length}`);
  67.                 return conceivedNumber;
  68.             }
  69.         }
  70.     }
  71.  
  72.     this.ask_userTryCount = function () {//Спрашивает верное количество попыток
  73.         let userTryCount = askCorrectNumber('Введите количество попыток', 5);
  74.         if (userTryCount <= 0) {
  75.             alert('Надо просто же натуральную циферку ввести. Пускай их будет 5');
  76.             userTryCount = 5;
  77.         };
  78.         return userTryCount;
  79.     }
  80.  
  81.     this.guessing = function () {//спрашивает у пользователя его догадку. Она должна быть корректной
  82.         while (true) {
  83.             let guess = askCorrectNumber(`Осталось попыток: ${this.userTryCount - this.n_try}`, '', true);
  84.             if (this.isCorrectGuessNumber(guess))//проверяем корректность
  85.              return guess;
  86.         }
  87.     }
  88.     //сверяет длину числа и уникальность цифр. Если корректно => true, иначе false
  89.     this.isCorrectGuessNumber = function (guessNumber) {
  90.         if (guessNumber.length != this.conceivedNumber.length) {
  91.             alert(`Длина у загаданного числа ${this.conceivedNumber.length}, а у вас ${guessNumber.length}`);
  92.             return false;
  93.         }
  94.  
  95.         for (let i = 0; i < guessNumber.length; i++) {
  96.             let digitCount = guessNumber.split(guessNumber[i]).length - 1;
  97.             if (digitCount > 1) {
  98.                 alert(`Цифры не должны повторяться`);
  99.                 return false;
  100.             }
  101.         }  
  102.         return true;
  103.     }
  104.     //сравнивает числа. Alert совпадения. Если числа совпадают => true, иначе false
  105.     this.checkGuess = function () {
  106.         let correctDigit = [];
  107.         let includesDigit = [];
  108.  
  109.         for (let i = 0; i < this.conceivedNumber.length; i++) {
  110.             if (this.conceivedNumber[i] == this.guessNumber[i]) {
  111.                 correctDigit.push(this.guessNumber[i]);
  112.             } else if (this.conceivedNumber.includes(this.guessNumber[i])) {
  113.                 includesDigit.push(this.guessNumber[i]);
  114.             }
  115.         }
  116.  
  117.         if (correctDigit.length == this.conceivedNumber.length) return true;
  118.  
  119.         let msgCorrect = `Количество цифр на своих местах: ${correctDigit.length}. ${correctDigit.length ? `(${correctDigit})` : ''}`;
  120.         let msgIncludes = `Количество цифр не на своих местах: ${includesDigit.length}. ${includesDigit.length ? `(${includesDigit})` : ''}`;
  121.         alert(`${msgCorrect}\n${msgIncludes}`);
  122.         return false;
  123.     }
  124.     //метод запускающий игру
  125.     this.startGame = function () {
  126.  
  127.         this.conceivedNumber = this.createConceivedNumber();//загаданное число
  128.         this.userTryCount = this.ask_userTryCount();//количество попыток
  129.         this.n_try = 0;//количество использованных попыток. Неверный ввод не учитывается в них
  130.  
  131.         while (this.userTryCount - this.n_try != 0) {//до тех пор пока у пользователя есть попытки
  132.             this.guessNumber = this.guessing();//спрашиваем догадку
  133.             if(this.checkGuess()) {//проверяем отгадал ли
  134.                 alert(`Вы отгадали. Супер!`);
  135.                 return true;
  136.             } else {
  137.                 this.n_try++;
  138.             }
  139.         }
  140.         //если попытки закончились
  141.         alert(`Попытки закончились. Загаданное число - ${conceivedNumber}`);
  142.         return false;
  143.     }
  144.  
  145. }
  146.  
  147. do { //играем
  148.     let game = new Game();
  149.     game.startGame();
  150. } while (confirm('Сыграем ещё?'))
  151.  
Advertisement
Add Comment
Please, Sign In to add comment