• 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")

VPS Starter Arubacloud
0 głosów
1,987 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ź 172 wizyt
pytanie zadane 11 stycznia 2020 w JavaScript przez Raivik Nowicjusz (150 p.)
0 głosów
1 odpowiedź 4,749 wizyt
+1 głos
2 odpowiedzi 585 wizyt
pytanie zadane 14 października 2021 w JavaScript przez Admak Początkujący (340 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...