Generator rzutów kośćmi

Generator rzutów kośćmi
sojkin
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Polska, Chorzów
  • Postów:10
0

Próbuję stworzyć generator rzutów koścmi. Chce aby rzuty były zapisane w macierzy gdzie wiersze to ilość rzutów, ilość kolumn jest równa ilości kości a ich wartość to wartość rzutu. Wypociłem cos takiego:

Kopiuj
import java.util.Random;


public class Rzucaj {

	public static void main(String[] args) {
		
		
Random generator = new Random();
		
		int ilosc_rzutow = 2;
		int ilosc_scian = 6;
		int ilosc_kosci = 4;		
		int[][] rzuty = new int[ilosc_rzutow][ilosc_kosci];
		
		
		for(int i = 0; i == ilosc_rzutow; i++){
			for(int j = 0; j == ilosc_kosci; j++ ){
				rzuty[i][j] = generator.nextInt(ilosc_scian);
			};
		};
		
		for(int i = 0; i == ilosc_rzutow; i++){
			for(int j = 0; j == ilosc_kosci; j++ ){
				System.out.println(rzuty[i][j]); 
			};
		};
	}

}

niestety wynik nie jest wypisywany w konsoli. Co zrobiłem źle?

edytowany 1x, ostatnio: sojkin
PO
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 7 lat
1
Kopiuj
for(int i = 0; i == ilosc_rzutow; i++)

Najpierw pomyśl, czy powyższy warunek w pętli będzie kiedykolwiek spełniony.

sojkin
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Polska, Chorzów
  • Postów:10
0

Dziękuje,

for(int i = 0; i < ilosc_rzutow; i++)

ten warunek rozwiązał problem.

poprawiony kod

Kopiuj
import java.util.Random;


public class Rzucaj {

	public static void main(String[] args) {
		
		
Random generator = new Random();
		
		int ilosc_rzutow = 4;
		int ilosc_scian = 6;
		int ilosc_kosci = 11;		
		int[][] rzuty = new int[ilosc_rzutow][ilosc_kosci];
		
		
		for(int i = 0; i < ilosc_rzutow; i++){
			for(int j = 0; j < ilosc_kosci; j++ ){
				rzuty[i][j] = generator.nextInt(ilosc_scian-1)+1;
			};
			
		};
		
		for(int i = 0; i < ilosc_rzutow; i++){
			for(int j = 0; j < ilosc_kosci; j++ ){
				System.out.print(rzuty[i][j] + "\t"); 
			};
			System.out.println("\n");
		};
	}

}
edytowany 2x, ostatnio: sojkin
Shalom
A te średniki za } to co? Programowanie nie polega na stawianiu losowych symboli w nadziei że się skompiluje i zadziała. Potrafisz powiedzieć czemu postawiłeś tam średniki?
Koziołek
A zamknij kostkę w osobnej klasie...
Gjorni
@Shalom jak to co? O.O Rzucaj.main().for();
sojkin
jestem bardzo początkujacy i nie bylem pewien własnie czy średniki mają być czy nie. Dzieki. Co do zamknięcia kostki w osobnej klasie to nie rozumiem jak to zrobic. Mam w niej zapisywać wartości rzutów z macierzy?
Koziołek
Zamknięcie w osobnej klasie uprości kod.
sojkin
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Polska, Chorzów
  • Postów:10
0

z zamknięciem kostki w osobnej klasie to chodziło o cos takiego?

Kopiuj
import java.util.Random;


public class Kostka {
	
	
	public int rzut(int ilosc_scian){
	Random kostka = new Random();
		
	return kostka.nextInt(ilosc_scian-1)+1;
	
	}
	
}



public class Rzucaj {

	public static void main(String[] args) {
		
Kostka kostka = new Kostka();
		
		int ilosc_rzutow = 4;
		int ilosc_scian = 6;
		int ilosc_kosci = 11;		
		int[][] rzuty = new int[ilosc_rzutow][ilosc_kosci];
		
		
		for(int i = 0; i < ilosc_rzutow; i++){
			for(int j = 0; j < ilosc_kosci; j++ ){
				rzuty[i][j] = kostka.rzut(ilosc_scian);
			};
			
		};
		
		for(int i = 0; i < ilosc_rzutow; i++){
			for(int j = 0; j < ilosc_kosci; j++ ){
				System.out.print(rzuty[i][j] + ";"); 
			};
			System.out.println("\n");
		};
	}

}
edytowany 1x, ostatnio: sojkin
bakeraw2
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 5 lat
  • Postów:400
0

A może spróbuj to zrobić w ten sposób:

Kopiuj
import java.util.Random;

public class Kostka {

    public int[][] rzucKostka(int ileKosci, int ileRzutow, int ileScian) {
        Random random = new Random();
        int[][] rzuty = new int[ileKosci][ileRzutow];

        for (int i = 0; i < ileKosci; i++) {
            for (int j = 0; j < ileRzutow; j++) {
                rzuty[i][j] = random.nextInt(ileScian) + 1;
            }
        }

        return rzuty;
    }
}
Kopiuj
public class Main {
    public static void main(String[] args) {
        Kostka kostka = new Kostka();
        int[][] rzuty = kostka.rzucKostka(2, 3, 6);

        System.out.println(Arrays.deepToString(rzuty));
    }
}
spartanPAGE
Powtarzanie nazw? nowa Kostka(ilość ścian), wylosowana = Kostka.rzuć()
Koziołek
kostka nie wie ile ma ścian, ale wie ile razy była rzucana... yyyy....
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:13 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
0

No to moja propozycja (z wykorzystanie Guava, ale to szczegół):

Kopiuj
class Dice {

    private final int walls;

    private final Random gen;

    public Dice(int walls) {
        this.walls = walls;
        this.gen = new Random();
    }

    public int roll() {
        return 1 + gen.nextInt(walls);
    }
}

kostka wie ile ma ścian i ma własny generator, co przynajmniej w teorii zapewnia niezależność kostek.

Kopiuj
public static void main(String[] args) {                                                              
    List<Dice> dices = Lists.newArrayList(new Dice(6), new Dice(6)); // 2k6                           
    for (int i = 0; i < 3; i++) { // 3 rzuty                                                          
        Collection<Integer> rollResult = Collections2.transform(dices, new Function<Dice, Integer>() {
            @Nullable                                                                                 
            @Override                                                                                 
            public Integer apply(@Nullable Dice input) {                                              
                return input.roll();                                                                  
            }                                                                                         
        });                                                                                           
        System.out.println(String.format("W rzucie %s wypadło: %s", i, rollResult.toString()));       
    }                                                                                                 
}

tworzymy NkX niezależnych kostek i rzucamy Z razy.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

@Koziołek można i bez guavy ;)

Kopiuj
        List<Dice> dices = Arrays.asList(new Dice(6), new Dice(6));
        for (int i = 0; i < 3; i++) {
            Stream<Integer> rollResult = dices.stream().map(Dice::roll);
            String stringResult = rollResult.map(Object::toString).collect(Collectors.joining(", "));
            System.out.println(String.format("W rzucie %s wypadło: %s", i, stringResult));
        }

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Koziołek
Nie mam tu javy 8 :)
sojkin
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Polska, Chorzów
  • Postów:10
0
Koziołek napisał(a):

No to moja propozycja (z wykorzystanie Guava, ale to szczegół):

Kopiuj
class Dice {

    private final int walls;

    private final Random gen;

    public Dice(int walls) {
        this.walls = walls;
        this.gen = new Random();
    }

    public int roll() {
        return 1 + gen.nextInt(walls);
    }
}

kostka wie ile ma ścian i ma własny generator, co przynajmniej w teorii zapewnia niezależność kostek.

Kopiuj
public static void main(String[] args) {                                                              
    List<Dice> dices = Lists.newArrayList(new Dice(6), new Dice(6)); // 2k6                           
    for (int i = 0; i < 3; i++) { // 3 rzuty                                                          
        Collection<Integer> rollResult = Collections2.transform(dices, new Function<Dice, Integer>() {
            @Nullable                                                                                 
            @Override                                                                                 
            public Integer apply(@Nullable Dice input) {                                              
                return input.roll();                                                                  
            }                                                                                         
        });                                                                                           
        System.out.println(String.format("W rzucie %s wypadło: %s", i, rollResult.toString()));       
    }                                                                                                 
}

tworzymy NkX niezależnych kostek i rzucamy Z razy.

tylko w tym wypadku nie moge dynamicznie stworzyc macierzy z dowolna iloscia kostek. Docelowo chce podac ile chce zrobic rzutów, jakimi kośćmi w jakiej ilości. Wszystko ma byc wyświetlone w macierzy gdzie kazdy rzut bedzie miał swój index.

Czy ten kod który wstawiłem jest zły? Tak jak juz wczesniej pisałem, jestem bardzo poczatkujacy i nie zauważam jest niuansów w rożnicy pomiedzy moja klasa Kostka a klasa Dice. Moja klasa zwraca wartość przy wywołaniu metody tymczasem klasa Dice zwraca ją czy jej stworzeniu?

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:13 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Akurat dynamiczne tworzenie nie jest aż takie trudne.

Kopiuj
public List<Dice> pickDices(int nbrOf, int walls){
    List<Dice> dices = new ArrayList<Dice>(nbrOf);
    for(int i =0; i< nbrOf; i++){                 
        dices.add(new Dice(walls));               
    }                                             
    return dices;                                 
}

Klasa Dice zwraca wartośc po wywołaniu metody roll. Co do założeń z numerowaniem rzutów to nie jest to problem. Po prostu osobny mechanizm korzystajacy z klasy Dice i zapisujący wyniki. Separacja zadań i odpowiedzialności. Poszukaj informacji o SRP ( http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/ ) wtedy postaraj się podzielić swój kod na takie segmenty, które mają jedno konkretne zadanie.

Zresztą jak ogarnę się po dzisiejszym spotkaniu z Uncle Bobem to poszukam mojego starego dice parsera.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.