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

0 głosów
533 wizyt
pytanie zadane 2 lutego 2017 w JavaScript, jQuery, AJAX przez lapa19904 Dyskutant (7,510 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,990 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 (44,940 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,760 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,230 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 Dyskutant (7,510 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 Dyskutant (7,510 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ź 598 wizyt
0 głosów
1 odpowiedź 79 wizyt
+1 głos
5 odpowiedzi 2,401 wizyt
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

65,642 zapytań

112,267 odpowiedzi

236,888 komentarzy

46,639 pasjonatów

Przeglądających: 146
Pasjonatów: 9 Gości: 137

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...