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

Gra w kości javascript (jak napisać "jeśli na kostce wypadnie 6 trzy razy z rzędu wywołaj .winner")

Object Storage Arubacloud
0 głosów
2,006 wizyt
pytanie zadane 2 lutego 2017 w JavaScript przez lapa19904 Stary wyjadacz (11,560 p.)
Napisałem prostą grę w kości, już niedługo będziecie mogli w nią zagrać. Można grać w kostkowe oczko itp(w przyszłości chciałbym pokera kostkowego zrobić). Gdzie jeden gracz rzuca więcej niż jeden raz z rzędu (zazwyczaj 3 razy). Chciałbym dodać zasadę wedle której gracz wyrzucający 3 razy z rzędu 6 zostaje okrzyknięty zwycięzcą. Wiem jak wywołać zwycięzcę w przypadku większej liczby punktów w jednym rzucie lub zebrania większej liczy punktów w kilku rzutach (kolejka po kolejce. Jednak nie potrafię nakazać js by wywoływał funkcję po wyrzuceniu tej samej wartości kolka razy pod rząd.

Sam wynik rzutu to : var xxx Math.floor(Math.random() *6) +1;  

Nie mam pomysłu jak to zapisać ale chciałbym coś w stylu:

if xxx = 6 /3 times in row do something (document.querySelector('.player').classList.add('winner');

Jakieś wskazówki?

7 odpowiedzi

+1 głos
odpowiedź 2 lutego 2017 przez Gracjan Pasik Obywatel (1,810 p.)

Nie znam JavaScriptu, ale napiszę ci to w C++ a ty przerobisz:

int ileRazySzesc = 0;

if (wynik==6)
{
ileRazySzesc++;
}
else
{
ileRazySzesc = 0;
}

if (ileRazySzesc == 3)
{
//tutaj wywołanie tego zwycięstwa
}

 

Powinieneś sobie poradzić, mam nadzieję, że pomogłem.

+1 głos
odpowiedź 2 lutego 2017 przez Kornelia Kobiela Nałogowiec (33,340 p.)
Rozumiem, że każdą rundę składającą się z trzech rzutów rozgrywasz w jakiejś pętli, czy w podobny sposób. Otóż moim zdaniem można ustawić licznik - zmienną pokazującą ile w danej rundzie wypadło 6. Ustawiasz ją na zero i jeśli wypadnie 6 to zwiększasz o 1. Jeśli po rundzie wartość zmiennej jest równa trzy, nadajesz klasę winner.
+1 głos
odpowiedź 3 lutego 2017 przez ShiroUmizake Nałogowiec (46,300 p.)

Chcę nauczyć się tego jak wywołać funkcje kiedy random wyrzuca ten sam numer więcej niż 1 ( w tym wypadku dokładnie 3 razy). Na pewno przyda mi się to w przyszłych realizacjach które mam w dalszych planach.


if (this.player.getWinRounds()  == this.gameConfig.getMaxRound()){
this.winGame = true;
return this.player;
}
var pickNumber = Math.random (bla bla)
if (this.gameConfig.getWinNumber() == pickNumber){
this.IncreastWinRoundCurrentPlayer() // Szóstka powoduje, wzrost możliwości wygranej?
}

increastWinRoundCurrentPlayer(){
this.player.incerastWinRounds();
}

Powiedzmy, że mamy obiekt gameControler, gameConfig ,jakiś app (klasa główna), player (model). App decyduje czyja tura , co się wywołuje itd. Zaczyna się gra, następuje tura n gracza (którego przekazuje app), rzuca tą kostką. Wyrzuca raz 6 . gameControler sprawdza, pod jakie zasady ta liczba podlega. Jak wiemy 6 zwiększa szansę na wygraną to zwiększamy licznik obiektu player (konkretenego n gracza). Sprawdzamy czy3 razy wypadla szostka  (this.player.getWinRounds() == this.gameConfig.getMaxRound()). Jeżeli tak to zmieniamy stan gry na true. Wychodzimy z gameControlera, wracamy do App. App sprawdza czy gra się zakończyła. Jeżeli się zakończyła coś tam robi. Pokazałem przykład jak to można rozwiązać w "świadomym OOP", na funkcjach łatwo się zagubić. Nie wiem jakie rozwiązanie ty używasz.

+1 głos
odpowiedź 3 lutego 2017 przez Sinnley Stary wyjadacz (12,810 p.)

Zaznaczam, że nie znam javascriptu, więc kod może być gdzieś niepoprawny, pisałem go jednocześnie szukając informacji. Nastomiast ja zrobiłbym to tak, jeśli coś nie działa pewnie dasz radę to przerobić:

 

function foo(){

var six = 0;
var got = 0;

while(true){

		got = Math.floor(Math.random()*5 - 1);
		if(got == 6){
    	six = six + 1;
    }
    if(six == 3){
    break;
    }
}

}

 

+1 głos
odpowiedź 3 lutego 2017 przez Marcin2000Xpl Gaduła (3,250 p.)

Ja bym to zrobił tak.

var shoots = []; //Lista rzutów

function losuj() {
	shoots.push(Math.floor(Math.random()*6)+1); //Losowanie liczby
	if(czyWygrana()) //Sprawdzenie czy wygrana
		alert("Wygrana!!!"); //Powiadomienie o wygraniu
}

function czyWygrana(){
	var last3=shoots.slice(-3); //Ostatnio wylosowane 3 liczby
	var count6=last3.filter(function(n){return n==6;}); //Ile liczb 6 w ostatnio wylosowanych 3 liczbach
	var win=count6.length==3; //Czy wszystkie ostatnie 3 wylosowane liczby to 6
	return win;
}

// Można jeszcze skrócić funkcję 'czyWygrana'

/*function czyWygrana(){
	return shoots.slice(-3).filter(function(n){return n==6;}).length==3;
}*/

Mam nadzieję, że pomogłem wink

0 głosów
odpowiedź 3 lutego 2017 przez lapa19904 Stary wyjadacz (11,560 p.)
Dziękuje za odpowiedź Gracjan, sęk w tym że nie wiem jak zapisać "ileRazySzesc"

Nie zapiszę tego słownie bo nie jest to var, a funkcja to int. Zapisać "3*6"?

Kornelia niestety nie mogę ponieważ ilość rzutów nie jest w żaden sposób ograniczona, punkty się sumują dopóki gracz nie wyrzuci 1 na kostce. Kiedy wyrzuci 1 traci zebrane wcześniej punkty.

Teoretycznie mógłbym ograniczyć do 3 rzutów i zapisać co zrobić jak wynik jednej kolejki = 18 albo dodać 2 kości i zrobić tak jak w rzucie 3 kościami gracz wyrzuci 6/6/6 ale to zbyt łatwe, ograniczone i nie chcę żeby tak to wyglądało. Chcę nauczyć się tego jak wywołać funkcje kiedy random wyrzuca ten sam numer więcej niż 1 ( w tym wypadku dokładnie 3 razy). Na pewno przyda mi się to w przyszłych realizacjach które mam w dalszych planach.
0 głosów
odpowiedź 5 lutego 2017 przez lapa19904 Stary wyjadacz (11,560 p.)
Za odpowiedzi dziękuje, wszyscy były bardzo pomocne. 3 x 6 in row było niezwykle rzadkie więc zmieniłem zasadę na taką gdzie 2 x 6 in row zeruje nam punkty.

Zrobiłem var pamiętający poprzedni rzut (lub 2) i jeśli poprzedni rzut był taki sam jak aktualny na kostce (6) to punkty się zerowały. Wydaję się dość proste jednak kosztowało mnie to sporo czasu. Błąd jaki popełniałem to było zamknięcie tego var lastRoll w funkcji zamiast wrzucić go na globalu. Mimo lekkiej frustracji myślę że była to dla mnie dobra lekcja Scope chain-a ;)

Jeszcze raz wielkie dzięki, grę wrzucę na forum już niedługo.

Podobne pytania

0 głosów
1 odpowiedź 173 wizyt
pytanie zadane 11 stycznia 2020 w JavaScript przez Raivik Nowicjusz (150 p.)
0 głosów
1 odpowiedź 4,775 wizyt
+1 głos
2 odpowiedzi 616 wizyt
pytanie zadane 14 października 2021 w JavaScript przez Admak Początkujący (340 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 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!

...