Wątek przeniesiony 2015-01-18 08:10 z Java przez bogdans.

Symulator hazardzisty - dlaczego po uruchomieniu programu wyświetla się komunikat?

2015-01-18 01:44
0

Witam,
chcę napisać program, którego opis działania znajduje się w komentarzu na początku poniższego kodu. Po próbie uruchomienia kodu wyświetla się komunikat: "Exception in thread "main" java.lang.Error: Unresolved compilation problem: sumaWygranych cannot be resolved to a variable". Proszę o wyjaśnienie, dlaczego program nie działa w pożądany sposób.

import java.util.Random;

public class hazardzista {
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub

//Hazardzista płaci 5 PLN i rzuca dwiema kośćmi do gry (6 oczek).
//Jeśli suma jest parzysta, przegrywa postawione pieniądze. 
//Jeśli nieparzysta, wyciąga jedną z kart: As, 3, 5, 7, 9. 
//Zostaje mu wypłacona kwota stanowiąca odpowiednik wartości karty 
//powiększonej o 5 PLN (as liczony za 1). W przypadku wyciągnięcia innej 
//karty niż podane powyżej, gracz również przegrywa. Napisać program 
//symulujące 20 rozgrywek takiej gry i wyświetli średnią kwotę wygrywaną 
//przez hazardzistę.

Random r = new Random(); 

int licznik;
int kwotaWpłacona = 5;  
int wygrana;

/* Figury i ich reprezentacja liczbowa: 
as - 1
walet - 11
dama - 12
król - 13
*/

{

do
{
    int pierwszyRzut = r.nextInt(6)+1;
    int drugiRzut = r.nextInt(6)+1;
    int losowanaKarta = r.nextInt(13)+1;
    int sumaWygranych;

if ( (pierwszyRzut + drugiRzut) % 2 == 0) 
    wygrana = 0;
else 
 if(losowanaKarta % 2 == 0)
    wygrana = 0;
 else
    if(losowanaKarta == 1)
        wygrana= losowanaKarta + 5;
     else
            if(losowanaKarta == 3)
                wygrana= losowanaKarta + 5;
             else
                    if(losowanaKarta == 5)
                        wygrana= losowanaKarta + 5;
                     else
                            if(losowanaKarta == 7)
                                wygrana= losowanaKarta + 5;
                             else
                                    if(losowanaKarta == 9)
                                        wygrana= losowanaKarta + 5;

sumaWygranych += wygrana;
licznik++;
}
while (licznik <19);
}
int sredniaWygrana;
sredniaWygrana = sumaWygranych/20;
System.out.println("Średnia wygrana:" + sredniaWygrana);
}
}

Pozostało 580 znaków

2015-01-18 01:54
0

Program nie działa, bo totalnie nieczytelne wcięcia nie pozwalają odnaleźć błędów.

Przy normalnych wcięciach byłoby widać, że sumaWygranych jest deklarowana w pętli do while, a ta linijka

sredniaWygrana = sumaWygranych/20;

jest poza tą pętlą, więc już nie widzi tej zmiennej.

Pozostało 580 znaków

2015-01-18 12:04
0

zadeklaruj sume wygranych poza blokiem do. poczytaj o podstawach i podziel sobie na klasy ten kod , bo to WTF jakis


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
edytowany 1x, ostatnio: karolinaa, 2015-01-18 12:12

Pozostało 580 znaków

2015-01-18 12:10
1

W tym przypadku (z góry znana ilość kroków) lepsza jest pętla for. A to drabinka if'ów z identycznym kodem głośno domaga się refaktoryzacji.
Jedna z możliwych refaktoryzacji:

 if(losowanaKarta % 2 == 0 || losowanaKarta > 9)
     wygrana = 0;
 else
     wygrana = losowanaKarta + 5;

Imho. wzór

sredniaWygrana = sumaWygranych/20;

jest niepoprawny. Należy wybrać jedno z dwóch rozwiązań:

  • dzielić przez ilość wygranych (a nie przez ilość gier),
  • jeśli hazardzista przegra, to odejmować 5 od sumaWygranych.

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 3x, ostatnio: bogdans, 2015-01-18 12:32

Pozostało 580 znaków

2015-01-18 14:27
0

@bogdans
Zastosowałam zaproponowaną przez Ciebie refaktoryzację. Natomiast wydaje mi się, że

sredniaWygrana = sumaWygranych/20;

jest poprawne. Przykładowo, średnia z przegrana+przegrana+przegrana+4, ma być 1, a nie 4 (w przypadku 4 rozgrywek, a nie 20). Porażki również mają być uwzględniane przy liczeniu średniej.

W tej chwili jestem na takim etapie:

import java.util.Random;

public class hazardzista {
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub

/*Hazardzista płaci 5 PLN i rzuca dwiema kośćmi do gry (6 oczek). Jeśli suma jest parzysta, przegrywa 
postawione pieniądze. Jeśli nieparzysta, wyciąga jedną z kart: As, 3, 5, 7, 9. Zostaje mu wypłacona
 kwota stanowiąca odpowiednik wartości karty powiększonej o 5 PLN (as liczony za 1). W przypadku 
wyciągnięcia innej karty niż podane powyżej, gracz również przegrywa. Napisać program symulujące
 20 rozgrywek takiej gry i wyświetli średnią kwotę wygrywaną przez hazardzistę. */

Random r = new Random(); 

int kwotaWpłacona = 5;  
int licznik = 1;
int liczbaRozgrywek = 20;
int wygrana;
int sumaWygranych;
int średniaWygrana;

/* Figury i ich reprezentacja liczbowa: 
as - 1
walet - 11
dama - 12
król - 13
*/

do
{
    int pierwszyRzut = r.nextInt(6)+1;
    int drugiRzut = r.nextInt(6)+1;
    int losowanaKarta = r.nextInt(13)+1;

if ( (pierwszyRzut + drugiRzut) % 2 == 0) wygrana = 0;
else 
    if(losowanaKarta % 2 == 0 || losowanaKarta > 9) wygrana = 0;
    else wygrana = losowanaKarta + 5;

sumaWygranych += wygrana;
średniaWygrana = sumaWygranych/20;
licznik++;

}
while (licznik < (liczbaRozgrywek - 1));

System.out.println("Średnia wygrana:" + średniaWygrana);
}
} 

i po próbie uruchomienia programu wyświetla się komunikat: "The local variable sumaWygranych may not have been initialized". Czy ktoś ma pomysł dlaczego? Kiedy przenoszę sumę wygranych do do...while dalej pojawia sie ten komunikat.

edytowany 2x, ostatnio: karol11111, 2015-01-18 14:28

Pozostało 580 znaków

2015-01-18 14:34

Dlatego, że tej zmiennej nie zainicjowałeś.

int sumaWygranych = 0;

Wg mnie średnia z przegrana+przegrana+przegrana+4 powinna wynosić albo 4 (jeżeli przegrane ignorujemy), albo -11/4 = -3,75 (jeśli uwzględniamy wszystkie gry).


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 2x, ostatnio: bogdans, 2015-01-18 14:38

Pozostało 580 znaków

2015-01-18 16:24
0

Fakt, dziękuję, podziałało. Ale mam jeszcze jedno pytanie. W programie musimy zweryfikować poprawność danych wprowadzonych przez użytkownika. Jedyny pomysł jaki przyszedł mi do głowy, to sprawdzenie, czy wpłacił odpowiednią kwotę, aby zagrać 20 gier. I kod zmodyfikowałam do postaci:

import java.util.Random;
import java.util.Scanner;

public class hazardzista {
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub

/*Hazardzista płaci 5 PLN i rzuca dwiema kośćmi do gry (6 oczek). Jeśli suma jest parzysta, przegrywa postawione pieniądze. 
Jeśli nieparzysta, wyciąga jedną z kart: As, 3, 5, 7, 9. Zostaje mu wypłacona kwota stanowiąca odpowiednik wartości karty 
powiększonej o 5 PLN (as liczony za 1). W przypadku wyciągnięcia innej karty niż podane powyżej, gracz również przegrywa. 
Napisać program symulujące 20 rozgrywek takiej gry i wyświetli średnią kwotę wygrywaną przez hazardzistę. */

Random r = new Random(); 

int kwotaWpłacona;
int licznik = 1;
int liczbaRozgrywek = 20;
int wygrana;
int sumaWygranych = 0;
double średniaWygrana;

Scanner gracz = new Scanner (System.in);

System.out.println("Dzień dobry!");
System.out.println("Wpłać wpisowe za 20 gier:");
kwotaWpłacona = gracz.nextInt();

if (kwotaWpłacona == 100) continue; 
else System.out.println("Nie można rozpocząć gry!"); break;

/* Figury i ich reprezentacja liczbowa: 
as - 1
walet - 11
dama - 12
król - 13
*/

do
{
    int pierwszyRzut = r.nextInt(6)+1;
    int drugiRzut = r.nextInt(6)+1;
    int losowanaKarta = r.nextInt(13)+1;

if ( (pierwszyRzut + drugiRzut) % 2 == 0) wygrana = 0;
else 
    if(losowanaKarta % 2 == 0 || losowanaKarta > 9) wygrana = 0;
    else wygrana = losowanaKarta + 5;

sumaWygranych += wygrana;
średniaWygrana = sumaWygranych/20;
licznik++;

}
while (licznik < (liczbaRozgrywek - 1));

System.out.println("Średnia wygrana:" + średniaWygrana);

    }
}

Po próbie uruchomienia wyskakuje komunikat:
"continue cannot be used outside of a loop
break cannot be used outside of a loop or a switch".
Gdzie w takim razie powinnam umieścić te dwie linijki kodu? Chciałabym, aby w przypadku wprowadzenia złej kwoty przez użytkownika, cały program zakończył się.

Pozostało 580 znaków

2015-01-18 16:36
0
if (kwotaWpłacona != 100)
{
    System.out.println("Nie można rozpocząć gry!");
    System.exit(0);
}

Dlaczego nie dopuszczasz żeby hazardzista wpłacił więcej niż 100?


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 2x, ostatnio: bogdans, 2015-01-18 22:23

Pozostało 580 znaków

2015-01-18 21:56
0

Bo musiałabym mu zwrócić resztę :) a że mój poziom w Javie jest zerowy, nie chcę sobie dodatkowo sprawy komplikować :)

Bardzo dziękuję ze wszystkie podpowiedzi.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0