-
Notifications
You must be signed in to change notification settings - Fork 0
/
game-guess-password.js
113 lines (88 loc) · 4.01 KB
/
game-guess-password.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
const readlineSync = require('readline-sync');
class GameBullsAndCows {
static _numAttempts = 10;
static _startRange = 100;
static _endRange = 999999;
static numUseAttempts = 0;
static game() {
this.numUseAttempts = 0;
const pcNumber = randomInteger(this._startRange, this._endRange);
const pcNumberLength = String(pcNumber).length;
console.log('\x1b[36m%s\x1b[0m', `Компьютер задумал число из ${pcNumberLength} цифр. У тебя есть ${this._numAttempts} попыток, чтобы угадать его`);
this._round(pcNumber, pcNumberLength);
}
static askStartGame() {
while (true) {
const startGame = readlineSync.question('Начнем игру? (y/n) ');
if (startGame === 'y') break;
if (startGame === 'n') console.log('Не может быть. Подумай еще раз');
if (startGame !== 'n' && startGame !== 'y') console.log('Неизвестная команда');
}
}
static _round(pcNumber, pcNumberLength) {
if (this.numUseAttempts >= this._numAttempts) {
console.log('\x1b[31m%s\x1b[0m', 'Попытки закончились. Вы проиграли!');
console.log('\x1b[31m%s\x1b[0m', 'Загаданное число', pcNumber);
if (!this._repeatGame()) return;
}
console.log('\x1b[33m%s\x1b[0m', `Число оставшихся попыток ${this._numAttempts - this.numUseAttempts}`);
const userNumber = this._askNumber(pcNumberLength);
const result = this._checkNum(pcNumber, userNumber);
if (result.completeCoincidence) {
console.log('\x1b[35m%s\x1b[0m', 'Ура!!! Вы угадали!');
if (!this._repeatGame()) return;
}
const matchingNumbersInTheirPlaces = result.first;
const matchingNumbersNoInTheirPlaces = result.second;
console.group();
console.log('\x1b[32m%s\x1b[0m', 'Совпавших цифр не на своих местах: ', `${matchingNumbersInTheirPlaces} из ${pcNumberLength}`);
console.log('\x1b[32m%s\x1b[0m', 'Цифр на своих местах: ', `${matchingNumbersNoInTheirPlaces.length} (${matchingNumbersNoInTheirPlaces.join(', ')})`);
console.groupEnd();
this.numUseAttempts++;
this._round(pcNumber, pcNumberLength);
}
static _repeatGame() {
if (this._askRepeatGame()) {
this.askStartGame();
this.game();
} else {
console.log('Хорошего дня!');
return false;
}
}
static _askNumber(pcNumberLength) {
let userNumber = readlineSync.question(`Какое число задумал компьютер? `);
if (isNaN(+userNumber)) {
console.log('\x1b[31m%s\x1b[0m', 'Введенное значение не является числом. Попробуйте снова');
return this._askNumber(pcNumberLength);
}
if (userNumber.length !== pcNumberLength) {
console.log('\x1b[31m%s\x1b[0m', `Загаданное число состоит из ${pcNumberLength} цифр, а ваше из ${userNumber.length}. Повторите ввод`);
return this._askNumber(pcNumberLength);
}
return userNumber;
}
static _askRepeatGame() {
const startGame = readlineSync.question('Поиграем снова? (y/n) ');
if (startGame !== 'n' && startGame !== 'y') console.log('Неизвестная команда');
return startGame === 'y';
}
static _checkNum(pcNumber, userNumber) {
const arr1 = pcNumber.toString().split('');
const arr2 = userNumber.toString().split('');
const resultFirstArr = arr1.filter((n, index) => (arr2.includes(n) && n !== arr2[index]));
const resultSecondArr = arr1.filter((n, index) => n === arr2[index]);
return {
first: resultFirstArr.length,
second: resultSecondArr,
completeCoincidence: !(pcNumber - userNumber)
}
}
}
function randomInteger(min, max) {
let rand = min + Math.random() * (max + 1 - min);
return Math.floor(rand);
}
GameBullsAndCows.askStartGame();
GameBullsAndCows.game();
// node bulls-and-cows.js