Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создание библиотеки (https://javascript.ru/forum/misc/77604-sozdanie-biblioteki.html)

ProgYoung 25.05.2019 22:32

Создание библиотеки
 
Я правильно понимаю, что это синтаксис библиотеки в javascript с ключом rank и значением suit?
var hand = [
 { "rank":"семерка", "suit":"пик" },
 { "rank":"четверка", "suit":"червей" },
 { "rank":"двойка", "suit":"треф" },
 { "rank":"семерка", "suit":"пик" },
 { "rank":"восьмерка", "suit":"бубен" }
];


Тогда как мне создать такую же библиотеку по ходу выполнения кода. Т.е. у меня есть текстовые поля, куда рандомно закидываются значения карт (номинал и масть, например, восьмерка черви или туз треф). Теперь, чтобы работать с этими значениями, мне нужно присвоить переменной hand значения текстовых полей так, как показано выше, чтобы я мог обращаться к номиналам (hand.rank) и к мастям (hand.suit)

<input type="button" value="Кликни!" onclick="func1()">
  <p><input type="text" id="random1" readonly></p>
  <p><input type="text" id="random2" readonly></p>
  <input type="text" id="random3" readonly>
  <p><input type="text" id="random4" readonly></p>
  <input type="text" id="random5" readonly>
  <p><input type="button" value="Кликни!" onclick="ANSWER"></p>
  <p><input type="text" id="solve"></p>



var ranks = ["двойка","тройка","четверка","пятерка","шестерка",
"семерка","восьмерка","девятка","десятка","валет","дама","король","туз"];
var suits = ["пик","червей","треф","бубен"];

function func() {
   return {
      rank: ranks[Math.floor(Math.random() * ranks.length)],
      suit: suits[Math.floor(Math.random() * suits.length)]
   };
}
     
var hand = [];
 
function func1() {
   for (var i = 0; i < 5; i++) {
      var card = func();
      hand[i] = card;
      document.getElementById("random" + (i + 1)).value = card.rank + " " + card.suit;
   }
}

function containsNTimes(handRanks, rank, n) {
 //.............
}

function containsNMasti_1(handRanks, suit, n) {
 //..............
}

function containsNMasti_2(handRanks1, rank) {
 //.............
 }
}

function FullHouse(hand) {
  //............
}

function StreetFlesh(hand) {
  //............
}

function ANSWER() {
  // ЗДЕСЬ НУЖНО СОЗДАТЬ ТУ САМУЮ БИБЛИОТЕКУ hand
   try {
      while(true) {
	     if (FullHause(hand)) {
		    document.getElementById('solve').value = 'Комбинация - Фулл-Хауз';
         }
         else if (StreetFlesh(hand)) {
		    document.getElementById('solve').value = 'Комбинация - Стрит-Флеш';
         }
         else {
		    document.getElementById('solve').value = 'Нет известной комбинации';
         }
      }
   } catch (e) {
      alert( 'No game!' );
   } finally {
      if (confirm("Продолжить?")) break;
	  else break;
   }
}


Буду очень благодарен за помощь!

Malleys 25.05.2019 22:41

Цитата:

Сообщение от ProgYoung
Я правильно понимаю, что это синтаксис библиотеки в javascript с ключом rank и значением suit?

Нет, это массив объектов с ключами rank и suit и соответствующими значениями

Цитата:

Сообщение от ProgYoung
// ЗДЕСЬ НУЖНО СОЗДАТЬ ТУ САМУЮ БИБЛИОТЕКУ hand

Уже создана, проверьте!

ProgYoung 25.05.2019 22:47

Malleys,
Да, в этой строчке создается объект:
var hand = [];

Но он пустой. Или когда рандомно заполняются поля, то и заполняется сам объект с ключом и значением?
Я не знаю, как вот передать все это в функцию ANSWER...

Malleys 25.05.2019 22:50

Цитата:

Сообщение от ProgYoung
Или когда рандомно заполняются поля, то и заполняется сам объект с ключом и значением?

Да!

Цитата:

Сообщение от ProgYoung
Я не знаю, как вот передать все это в функцию ANSWER...

Оно глобальное hand, так и используйте.

function ANSWER() {
  // ЗДЕСЬ НУЖНО СОЗДАТЬ ТУ САМУЮ БИБЛИОТЕКУ hand
   alert(hand);
   try {
      while(true) {

ProgYoung 25.05.2019 22:57

Malleys,
проблема в том, что у меня ничего не происходит, когда нажимаю на кнопку "кликни!":
<p><input type="button" value="Кликни!" onclick="ANSWER()"></p>

Я думал, это из-за того, что массив объектов пустой, но видимо дело в другом...

ProgYoung 25.05.2019 23:02

Malleys,
Я закомментировал try,catch и finally, вот что вывелось:
[object Object],[object Object],[object Object],[object Object],[object Object]

Почему так?

Malleys 25.05.2019 23:19

Потому что по умолчанию строковое представление объектов так выглядит!

Можно так...
alert(JSON.stringify(hand));


А можно своё собственное, которое я уже писал вам...
alert(hand.map(function(card) { return card.rank + " " + card.suit; }).join(", "));


А это...
function ANSWER() {
  // ЗДЕСЬ НУЖНО СОЗДАТЬ ТУ САМУЮ БИБЛИОТЕКУ hand
   try {
      while(true) {
         if (FullHause(hand)) {
            document.getElementById('solve').value = 'Комбинация - Фулл-Хауз';
         }
         else if (StreetFlesh(hand)) {
            document.getElementById('solve').value = 'Комбинация - Стрит-Флеш';
         }
         else {
            document.getElementById('solve').value = 'Нет известной комбинации';
         }
      }
   } catch (e) {
      alert( 'No game!' );
   } finally {
      if (confirm("Продолжить?")) break;
      else break;
   }
}
Оно у вас застревает в вечном цикле... и зачем вам тут try,catch и finally, ошибок не предвидится... может это также как с библиотекой, вы думаете одно, а оно означает другое?

ProgYoung 25.05.2019 23:20

Malleys,
вот-вот, сам понимаю, что ошибок не может быть, если все автоматически задается, но у меня такая лабораторная - обязательное использование этой конструкции.

Malleys 25.05.2019 23:29

Цитата:

Сообщение от ProgYoung
но у меня такая лабораторная - обязательное использование этой конструкции.

Так может это для того, чтобы, когда дойдёт до 'Нет известной комбинации', нужно выкинуть ошибку, и поймать её там, где у вас написано 'No game!' А while(true) { вообще не нужно!

Может так?
function ANSWER() {
  // ЗДЕСЬ НУЖНО СОЗДАТЬ ТУ САМУЮ БИБЛИОТЕКУ hand
   try {
         if (FullHause(hand)) {
            document.getElementById('solve').value = 'Комбинация - Фулл-Хауз';
         }
         else if (StreetFlesh(hand)) {
            document.getElementById('solve').value = 'Комбинация - Стрит-Флеш';
         }
         else {
            document.getElementById('solve').value = 'Нет известной комбинации';
            throw new Error("Нет известной комбинации");
         }
   } catch (e) {
      alert( 'No game!' );
   } finally {
      if (confirm("Продолжить?")) func1(); // а здесь заново запустить
   }
}

ProgYoung 25.05.2019 23:34

Malleys,
Теперь понял, зачем эта конструкция. Но все равно ничего не происходит при нажатии на вторую кнопку
Первая тоже перстала работать

Malleys 25.05.2019 23:39

Цитата:

Сообщение от ProgYoung
Теперь понял, зачем эта конструкция. Но все равно ничего не происходит при нажатии на вторую кнопку
Первая тоже перстала работать

Удивительно у вас получается!

Однако, вот пример целиком! Вам только дописать функции FullHouse, StreetFlesh...
<input type="button" value="Начать!" onclick="func1();">
<p><input type="text" id="random1" readonly></p>
<p><input type="text" id="random2" readonly></p>
<p><input type="text" id="random3" readonly></p>
<p><input type="text" id="random4" readonly></p>
<p><input type="text" id="random5" readonly></p>
<input type="button" value="Проверить!" onclick="ANSWER();">
<p><input type="text" id="solve"></p>

<script>
// это все возможные номиналы
var ranks = ["двойка", "тройка", "четверка", "пятерка", "шестерка",
	"семерка", "восьмерка", "девятка", "десятка", "валет", "дама", "король", "туз"
];
var suits = ["пик", "червей", "треф", "бубен"];

function func() {
	return {
		rank: ranks[Math.floor(Math.random() * ranks.length)],
		suit: suits[Math.floor(Math.random() * suits.length)]
	};
}

var hand = [];

function func1() {
	for (var i = 0; i < 5; i++) {
		var card = func();
		hand[i] = card;
		document.getElementById("random" + (i + 1)).value = card.rank + " " + card.suit;
	}

	document.getElementById("solve").value = hand.map(function(card) {
		return card.rank + " " + card.suit;
	}).join(", ");
}

function containsNTimes(handRanks, rank, n) {
	//.............
}

function containsNSuit_1(handRanks, suit, n) {
	//..............
}

function containsNSuit_2(handRanks1, rank) {
	//.............
}

function FullHouse(hand) {
	//............
}

function StreetFlesh(hand) {
	//............
}

function ANSWER() {
	try {
		if (FullHause(hand)) {
			document.getElementById('solve').value = 'Комбинация - Фулл-Хауз';
		} else if (StreetFlesh(hand)) {
			document.getElementById('solve').value = 'Комбинация - Стрит-Флеш';
		} else {
			document.getElementById('solve').value = 'Нет известной комбинации';
			throw new Error("Нет известной комбинации");
		}
	} catch (e) {
		alert('No game!');
	} finally {
		if (confirm("Продолжить?")) func1();
	}
}
</script>


UPD Это, конечно, была особая жемчужина!
if (confirm("Продолжить?")) break;
      else break;

ProgYoung 26.05.2019 00:15

Malleys,
Спасибо большое! Все получилось! Функции у меня уже были готовы, не смог связать эти два клика) А почему у меня ваш код не работал, фиг знает, скопировал заново, добавил свои функции и заработало


Часовой пояс GMT +3, время: 18:05.