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

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

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);
}
}

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.

0

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

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.
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.

1

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).

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ę.

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?

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.

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