Отгадать слово по буквам
Я пытаюсь написать программу, которая загадывает слово и ты его должен угадать по буквам.
У меня проблема с тем, что я не понимаю, как написать логику нахождения следующей одинаковой буквы.
Например:
Слово автомагистраль
я понимаю как найти первую букву а, но не понимаю как найти вторую букву, а потом третью
Итоговым результатом я хочу, чтобы я на странице подставлялась одна буква вместо _, если мы нашли нужную букву
Вся логика происходит в функции logic
const edit__block = document.querySelector('.edit__block');
const button = document.querySelector('.button');
const form = document.querySelector('.form');
const find__word = document.querySelector('.find__word');
const words = [
'машина',
'яблоко',
'корона',
'автомагистраль',
'электростанция'
];
const findWord = words[getRandomInt(words.length)];
let word = [];
console.log(findWord);
for (let i = 0; i < findWord.length; i++) {
find__word.innerHTML += '<span>_</span>';
}
const spans = find__word.querySelectorAll('span');
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
function logic(letter) {
for (let i = 0; i < findWord.length; i++) {
if (word.length == 0 && letter == findWord[i]) {
word[i] = letter;
spans[i].innerHTML = word[i];
break;
}
for (let j = 0; j < word.length; j++) {
if (letter == findWord[i] && word[i] != letter) {
console.log('i', i);
console.log('j', j);
word[i] = letter;
spans[i].innerHTML = word[i];
console.log(word);
console.log('Вы отгадали букву!');
console.log('');
break;
}
}
}
console.log(word);
console.log('');
}
function submitForm(event) {
event.preventDefault();
const letter = edit__block.value;
logic(letter);
edit__block.value = '';
}
function editBlock(event) {
if (!event.target.value.match(/[а-яА-ЯЁё]+/)) {
event.target.value = '';
}
if (event.target.value.length > 1) {
event.target.value = event.target.value[0];
}
}
form.addEventListener('submit', submitForm);
edit__block.addEventListener('input', editBlock);
edit__block.addEventListener('keydown', function(e) {
if ((e.key == 'я' || e.key == 'Я' || e.key == 'z' || e.key == 'Z') && e.ctrlKey) {
e.target.value = e.target.value.slice(0, -1);
}
if (e.key == 'Enter') {
submitForm(e);
}
})
body {
margin: 0;
font-family: sans-serif;
}
*,
*:before,
*:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.container {
max-width: 250px;
margin: 0 auto;
}
.card {
border: 1px solid black;
display: -webkit-flex;
display: -moz-flex;
display: -ms-flex;
display: -o-flex;
display: flex;
flex-direction: column;
align-items: center;
}
.card__item {
min-width: 180px;
margin-bottom: 10px;
padding: 0 20px;
}
.card__item:first-child {
background: #E0EAF4;
width: 100%;
padding: 10px 10px;
text-align: center;
}
.edit__block {
margin: 10px 0;
border: 1px solid black;
padding: 5px 10px;
}
.edit__block:focus {
border: 1px solid transparent;
}
.button {
background-color: #0C88EC;
height: 40px;
border-radius: 50px;
text-transform: uppercase;
display: flex;
justify-content: center;
align-items: center;
color: white;
cursor: pointer;
outline: none;
border: 0;
width: 100%;
}
.find__word span {
font-weight: bold;
}
.find__word span:not(:first-child) {
margin-left: 7px;
}
<div class="container">
<div class="card">
<div class="card__item">
Стартовый экран
</div>
<div class="card__item">
Я загадал для вас слово
</div>
<div class="card__item find__word">
</div>
<div class="card__item">
Дерзайте и отгадывайте!
</div>
<div class="card__item">
<form class="form">
<input class="edit__block" placeholder="Введите букву!" autofocus="">
<input class="button" type="submit" value="ок">
</form>
</div>
<div class="card__item final">
Ваш JavaScript
</div>
</div>
</div>
Ответы (2 шт):
Правильно работает? Проверки на полностью отгаданное слово нет.
let WORD = [...findWord]; // Добавил в код это
function logic(letter) {
let index = WORD.indexOf(letter);
if(index >= 0 && letter != ''){
spans[index].textContent = letter;
WORD[index] = '';
}
if(WORD.every(l => l == '')){
console.log('ОТГАДАНО СЛОВО'); // Логика после того как отгадано все слово
edit__block.disabled = true;
button.disabled = true;
}
}
const edit__block = document.querySelector('.edit__block');
const button = document.querySelector('.button');
const form = document.querySelector('.form');
const find__word = document.querySelector('.find__word');
const words = [
'машина',
'яблоко',
'корона',
'автомагистраль',
'электростанция'
];
const findWord = words[getRandomInt(words.length)];
let WORD = [...findWord];
console.log(findWord);
for (let i = 0; i < findWord.length; i++) {
find__word.innerHTML += '<span>_</span>';
}
const spans = find__word.querySelectorAll('span');
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
function logic(letter) {
let index = WORD.indexOf(letter);
if(index >= 0 && letter != ''){
spans[index].textContent = letter;
WORD[index] = '';
}
if(WORD.every(l => l == '')){
console.log('ОТГАДАНО СЛОВО'); // Логика после того как отгадано все слово
edit__block.disabled = true;
button.disabled = true;
}
}
function submitForm(event) {
event.preventDefault();
const letter = edit__block.value;
logic(letter);
edit__block.value = '';
}
function editBlock(event) {
if (!event.target.value.match(/[а-яА-ЯЁё]+/)) {
event.target.value = '';
}
if (event.target.value.length > 1) {
event.target.value = event.target.value[0];
}
}
form.addEventListener('submit', submitForm);
edit__block.addEventListener('input', editBlock);
edit__block.addEventListener('keydown', function(e) {
if ((e.key == 'я' || e.key == 'Я' || e.key == 'z' || e.key == 'Z') && e.ctrlKey) {
e.target.value = e.target.value.slice(0, -1);
}
if (e.key == 'Enter') {
submitForm(e);
}
})
body {
margin: 0;
}
*,
*:before,
*:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.container {
max-width: 250px;
margin: 0 auto;
}
.card {
border: 1px solid black;
display: -webkit-flex;
display: -moz-flex;
display: -ms-flex;
display: -o-flex;
display: flex;
flex-direction: column;
align-items: center;
}
.card__item {
min-width: 180px;
margin-bottom: 10px;
padding: 0 20px;
}
.card__item:first-child {
background: #E0EAF4;
width: 100%;
padding: 10px 10px;
text-align: center;
}
.edit__block {
margin: 10px 0;
border: 1px solid black;
padding: 5px 10px;
}
.edit__block:focus {
border: 1px solid transparent;
}
.button {
background-color: #0C88EC;
height: 40px;
border-radius: 50px;
text-transform: uppercase;
display: flex;
justify-content: center;
align-items: center;
color: white;
cursor: pointer;
outline: none;
border: 0;
width: 100%;
}
.find__word span:not(:first-child) {
margin-left: 7px;
}
<div class="container">
<div class="card">
<div class="card__item">
Стартовый экран
</div>
<div class="card__item">
Я загадал для вас слово
</div>
<div class="card__item find__word">
</div>
<div class="card__item">
Дерзайте и отгадывайте!
</div>
<div class="card__item">
<form class="form">
<input class="edit__block" placeholder="Введите букву!" autofocus="">
<input class="button" type="submit" value="ок">
</form>
</div>
<div class="card__item final">
Ваш JavaScript
</div>
</div>
</div>
Проблема заключается в лишнем цикле, при проверке буквы и неудачных проверках.
Логика должна быть следующей:
- бежим по загаданному слову
- если буква совпала с догадкой и раньше не была угадана на этой позиции показываем
В итоге цикл преобразуется в следующий:
for (let i = 0; i < findWord.length; i++) {
if (letter == findWord[i] && !word[i]) {
word[i] = letter;
spans[i].innerHTML = word[i];
console.log('Вы отгадали букву!');
break;
}
}
const edit__block = document.querySelector('.edit__block');
const button = document.querySelector('.button');
const form = document.querySelector('.form');
const find__word = document.querySelector('.find__word');
const words = [
'машина',
'яблоко',
'корона',
'автомагистраль',
'электростанция'
];
const findWord = words[getRandomInt(words.length)];
let word = [];
console.log(findWord);
for (let i = 0; i < findWord.length; i++) {
find__word.innerHTML += '<span>_</span>';
}
const spans = find__word.querySelectorAll('span');
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
function logic(letter) {
for (let i = 0; i < findWord.length; i++) {
if (letter == findWord[i] && !word[i]) {
word[i] = letter;
spans[i].innerHTML = word[i];
console.log('Вы отгадали букву!');
break;
}
}
console.log(word);
console.log('');
}
function submitForm(event) {
event.preventDefault();
const letter = edit__block.value;
logic(letter);
edit__block.value = '';
}
function editBlock(event) {
if (!event.target.value.match(/[а-яА-ЯЁё]+/)) {
event.target.value = '';
}
if (event.target.value.length > 1) {
event.target.value = event.target.value[0];
}
}
form.addEventListener('submit', submitForm);
edit__block.addEventListener('input', editBlock);
edit__block.addEventListener('keydown', function(e) {
if ((e.key == 'я' || e.key == 'Я' || e.key == 'z' || e.key == 'Z') && e.ctrlKey) {
e.target.value = e.target.value.slice(0, -1);
}
if (e.key == 'Enter') {
submitForm(e);
}
})
body {
margin: 0;
}
*,
*:before,
*:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.container {
max-width: 250px;
margin: 0 auto;
}
.card {
border: 1px solid black;
display: -webkit-flex;
display: -moz-flex;
display: -ms-flex;
display: -o-flex;
display: flex;
flex-direction: column;
align-items: center;
}
.card__item {
min-width: 180px;
margin-bottom: 10px;
padding: 0 20px;
}
.card__item:first-child {
background: #E0EAF4;
width: 100%;
padding: 10px 10px;
text-align: center;
}
.edit__block {
margin: 10px 0;
border: 1px solid black;
padding: 5px 10px;
}
.edit__block:focus {
border: 1px solid transparent;
}
.button {
background-color: #0C88EC;
height: 40px;
border-radius: 50px;
text-transform: uppercase;
display: flex;
justify-content: center;
align-items: center;
color: white;
cursor: pointer;
outline: none;
border: 0;
width: 100%;
}
.find__word span:not(:first-child) {
margin-left: 7px;
}
<div class="container">
<div class="card">
<div class="card__item">
Стартовый экран
</div>
<div class="card__item">
Я загадал для вас слово
</div>
<div class="card__item find__word">
</div>
<div class="card__item">
Дерзайте и отгадывайте!
</div>
<div class="card__item">
<form class="form">
<input class="edit__block" placeholder="Введите букву!" autofocus="">
<input class="button" type="submit" value="ок">
</form>
</div>
<div class="card__item final">
Ваш JavaScript
</div>
</div>
</div>