• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usuwanie elementu po jego wylosowaniu z tablicy

Object Storage Arubacloud
0 głosów
960 wizyt
pytanie zadane 28 października 2018 w JavaScript przez Mikołaj Użytkownik (780 p.)

Witam,

Zacząłem tworzyć grę w Wisielca wg. poradnika JS Pana Zelenta. Po napisaniu kodu losującego, chciałbym stworzyć skrypt, który usuwałby już wylosowane elementy z tablicy. Chodzi mi o to, że jeżeli dane hasło zostało już wylosowane, nie może się ono powtórzyć. Użyć funkcji slice?

var hasla = new Array(11);
hasla[0] = "GDYBY KÓZKA NIE SKAKAŁA TO BY NÓŻKI NIE ZŁAMAŁA";
hasla[1] = "BEZ PRACY NIE MA KOŁACZY";
hasla[2] = "NIE RÓB DRUGIEMU CO TOBIE NIE MIŁE";
hasla[3] = "GDZIE KUCHAREK SZEŚĆ TAM NIE MA CO JEŚĆ";
hasla[4] = "NIE OCENIAJ KSIĄŻKI PO OKŁADCE";
hasla[5] = "NIE DZIEL SKÓRY NA NIEDŹWIEDZIU";
hasla[6] = "CEL UŚWIĘCA ŚRODKI";
hasla[7] = "DO WESELA SIĘ ZAGOI";
hasla[8] = "KŁAMSTWO MA KRÓTKIE NOGI";
hasla[9] = "JEDNA JASKÓŁKA WIOSNY NIE CZYNI";
hasla[10] = "TRAFIŁO SIĘ ŚLEPEJ KURZE ZIARNO";
hasla[11] = "NIE CHWAL DNIA PRZED ZACHODEM SŁOŃCA";
var x = Math.floor((Math.random() * 12));
var haslo = hasla[x];


var dlugosc = haslo.length;
var ile_skuch = 0;

var yes = new Audio("yes.wav");
var no = new Audio("no.wav");

var win = new Audio("win.wav");
var loose = new Audio("loose.wav");

var haslo1 = "";

for (i=0; i<dlugosc; i++)
{
	if (haslo.charAt(i)==" ") haslo1 = haslo1 + " ";
	else haslo1 = haslo1 + "-";
}

function wypisz_haslo()
{
	document.getElementById("plansza").innerHTML = haslo1;
}

window.onload = start;

var litery = new Array(35);

litery[0] = "A";
litery[1] = "Ą";
litery[2] = "B";
litery[3] = "C";
litery[4] = "Ć";
litery[5] = "D";
litery[6] = "E";
litery[7] = "Ę";
litery[8] = "F";
litery[9] = "G";
litery[10] = "H";
litery[11] = "I";
litery[12] = "J";
litery[13] = "K";
litery[14] = "L";
litery[15] = "Ł";
litery[16] = "M";
litery[17] = "N";
litery[18] = "Ń";
litery[19] = "O";
litery[20] = "Ó";
litery[21] = "P";
litery[22] = "Q";
litery[23] = "R";
litery[24] = "S";
litery[25] = "Ś";
litery[26] = "T";
litery[27] = "U";
litery[28] = "V";
litery[29] = "W";
litery[30] = "X";
litery[31] = "Y";
litery[32] = "Z";
litery[33] = "Ż";
litery[34] = "Ź";



function start()
{
	
	var tresc_diva ="";
	
	for (i=0; i<=34; i++)
	{
		var element = "lit" + i;
		tresc_diva = tresc_diva + '<div class="litera" onclick="sprawdz('+i+')" id="'+element+'">'+litery[i]+'</div>';
		if ((i+1) % 7 ==0) tresc_diva = tresc_diva + '<div style="clear:both;"></div>';
	}
	
	document.getElementById("alfabet").innerHTML = tresc_diva;
	
	
	wypisz_haslo();
}

String.prototype.ustawZnak = function(miejsce, znak)
{
	if (miejsce > this.length - 1) return this.toString();
	else return this.substr(0, miejsce) + znak + this.substr(miejsce+1);
}


function sprawdz(nr)
{
	
	var trafiona = false;
	
	for(i=0; i<dlugosc; i++)
	{
		if (haslo.charAt(i) == litery[nr]) 
		{
			haslo1 = haslo1.ustawZnak(i,litery[nr]);
			trafiona = true;
		}
	}
	
	if(trafiona == true)
	{
		yes.play();
		var element = "lit" + nr;
		document.getElementById(element).style.background = "#003300";
		document.getElementById(element).style.color = "#00C000";
		document.getElementById(element).style.border = "3px solid #00C000";
		document.getElementById(element).style.cursor = "default";
		
		wypisz_haslo();
	}
	else
	{
		no.play();
		var element = "lit" + nr;
		document.getElementById(element).style.background = "#330000";
		document.getElementById(element).style.color = "#C00000";
		document.getElementById(element).style.border = "3px solid #C00000";
		document.getElementById(element).style.cursor = "default";	
		document.getElementById(element).setAttribute("onclick",";");		
		
		//skucha
		ile_skuch++;
		var obraz = "img/s"+ ile_skuch + ".jpg";
		document.getElementById("szubienica").innerHTML = '<img src="'+obraz+'" alt="" />';
	}
	
	//wygrana
	if (haslo == haslo1)	
	document.getElementById("alfabet").innerHTML  = "Tak jest! Podano prawidłowe hasło: "+haslo+'<br /><br /><span class="reset" onclick="location.reload()">JESZCZE RAZ?</span>';


	//przegrana
	if (ile_skuch>=9)
	document.getElementById("alfabet").innerHTML  = "Przegrana! Prawidłowe hasło: "+haslo+'<br /><br /><span class="reset" onclick="location.reload()">JESZCZE RAZ?</span>';


	if (haslo==haslo1)
	win.play();


	if(ile_skuch>=9)
	loose.play();
}

 

4 odpowiedzi

0 głosów
odpowiedź 29 października 2018 przez C.J Obywatel (1,370 p.)
1. Jako zakres losowania zamiast liczby, podaj zmienną równą na początku 12

2. Kiedy wylosujesz numerek, stwórz nową tablicę (o 1 komórkę mniejszą, od poprzedniej)

3. Przepisz jedną tablice do drugiej (pomijając wylosowany element)

4. Zmniejsz zmienną (odpowiedzialną za zakres) o jeden
0 głosów
odpowiedź 29 października 2018 przez MrxCI Dyskutant (8,260 p.)
// jakies elementy
const x = [1,2,3,6,8,8,12,11,454,"element"];

// wylosowany element ktorego chcemy sie pozbyc, tu przypisany testowo.
const w =  6;



const y = x.filter(e=>(e!=w)); // kasowanie wylosowanego elementu (w) z tablicy (x)


console.log(y); // output [1,2,3,8,8,12,11,454,"element"]

 

Można to chyba zrobić na wiele sposobów, to jest mój ulubiony, czy wydajny nie mam pojęcia, ktoś kto się zna lepiej może ocenić to rozwiązanie =)

0 głosów
odpowiedź 30 października 2018 przez X3h Dyskutant (9,540 p.)

https://codepen.io/Elek/pen/qJGgLB

Zrobiłem losowanie kolejnych haseł trochę inaczej. Na początku pobieram przemieszane z ogólnej puli. Iteruje je od końca. Jak dojdę do indeksu ujemnego zapisuje ostatnie hasło od którego startowałem, żeby pod koniec losowania uniknąć możliwego wylosowania tego samego drugi razy pod rząd. Usuwam ostatnie hasło z obecnej puli. Mieszam obecną pulę. Wrzucam zapisane hasło pomiędzy 0, a przedostatni indeks. Całość dzieje się w 

setCurrentCrossword()

Znalazłem dłuższą chwilkę i napisałem całość.

Z poprzedniej rozmowy wynika, że ludzie tutaj: nie wiedzą na jakich zasadach działa stackoverflow, oczekują gotowców jak na stackoverflow mimo tego, że problemy tutaj odnoszą się do wielu informacji na raz, a nie do jednego konkretnego, narzekają na złe odpowiedzi i mimo, że mogliby pomóc, ale nic dalej nie robią, widzą w odpowiedziach coś czego tam nie ma. Dodatkowo: system zarządzania odpowiedziami powinien być taki sam jak na stacku, powinien istnieć system uprzywilejowań jak na stacku. Inaczej to forum będzie na dnie.

–1 głos
odpowiedź 28 października 2018 przez X3h Dyskutant (9,540 p.)
przywrócone 30 października 2018 przez X3h
Po przepisaniu kodu z filmu na yt chciałbyś kontynuacji na podobnym poziomie aranżacji. Tak, slice jest metodą, która zwraca kopię z pierwszego poziomu tablicy. Potrafi nawet wybrać elementy od indeksu startowego bez lub z podaniem końcowego. Wpisz w Google js array slice. Zrozum regulamin.
2
komentarz 28 października 2018 przez Tomek Sochacki Ekspert (227,510 p.)
kod z tych kursow ma wiele wad ale to nieważne, ciekawo mnie co ludziom przeszkadza to dawanie gotowych kodów... kurde na SO to czestor norma że ludzie w odpowiedzi dają gotowy kod i pod nim są różne ciekawe dyskusje... ehh nie rozumiem czasem tego forum...
komentarz 28 października 2018 przez X3h Dyskutant (9,540 p.)
Tam regulamin jest dużo ostrzejszy. Nie możesz dać łapki od tak. Najpierw przechodzisz przez pewne sito, a potem dowiadujesz się, że dziurki są coraz mniejsze. Dyskutują tylko ci najlepsi. A tutaj to jest dno. Ale wracając. Co w ogóle oznacza komentarz wyżej do mojej odpowiedzi?
komentarz 28 października 2018 przez Mikołaj Użytkownik (780 p.)

@X3h, 

1. Tak, użyłem tego samego kodu co P. Zelent, ale nie rozumiem co w tym złego? Dodałem do niego jeszcze swoje modyfikacje, więc nie rozumiem w czym problem.

2. Nie rozumiem komentarzy do posta, w którym ktoś się pyta jak to zrobić, a odpowiedź to "Tak, sprawdź sobie w internecie". Właśnie jesteśmy w internecie i po przeczytaniu dużej ilości informacji na ten temat nadal nie rozumiem, więc proszę o pomoc.

komentarz 28 października 2018 przez X3h Dyskutant (9,540 p.)
Nie, nie miałem zamiaru, ani nawet na myśli powiedzieć czegoś złego o kimś i nie powiedziałem. To tylko fakty pozwalające rozwiązać problem. Dałem rozwiązanie, opisałem i pokazałem gdzie będzie więcej informacji.
2
komentarz 28 października 2018 przez ScriptyChris Mędrzec (190,190 p.)

@X3h,

Nie możesz dać łapki od tak

Na StackOverflow nie możesz dać łapki ot tak?

Dyskutują tylko ci najlepsi

Możesz podać jakiś przykład? Po czym rozpoznajesz "tych najlepszych"?

A tutaj to jest dno

Jeśli odnosisz się do poziomu kultury, to zacznij od poprawy jej u siebie.

komentarz 28 października 2018 przez X3h Dyskutant (9,540 p.)

Thanks for the feedback! Votes cast by those with less than 15 reputation are recorded, but do not change the publicly displayed post score.

Przykład: https://stackoverflow.com/questions/18262306/quicksort-with-python/48093329#

Powiedziałem wszystko ok co potwierdził autor pytania. Moje inne odpowiedzi pomagają i jakoś idzie się dogadać.

komentarz 28 października 2018 przez Mikołaj Użytkownik (780 p.)
No dobrze, ale mi nie pomogłeś. I z tego co widzę to podałeś mu kod

Podobne pytania

+1 głos
2 odpowiedzi 138 wizyt
0 głosów
2 odpowiedzi 6,437 wizyt
pytanie zadane 13 kwietnia 2018 w C i C++ przez antek782 Początkujący (490 p.)
0 głosów
2 odpowiedzi 197 wizyt
pytanie zadane 21 lipca 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...