Quiz w zgadywanie flagi państwa

0

Próbuję napisać swoją pierwszą aplikację. Ma ona polegać na wybraniu odpowiedniej flagi do nazwy państwa która wyświetli się na ekranie (jeszcze tej funkcji nie napisałem). Problem polega na tym, że wylosowane liczby odpowiadające konkretnym flagom zawsze wskazują 2 miejsca spośród 4. Nie wiem jak doprowadzić do tego, żeby losowała się odpowiednia liczba z podanego zakresu.

package com.example.flagi;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    //zmienne
    int images[] = new int[195];
    int j = 0;
    int correctFlag = 0;
    Random random = new Random();
    Set<Integer> set = new LinkedHashSet<>();
    List<String> names = new ArrayList<>();
    List<Integer> list = new ArrayList<>();

    @Override
    public void onClick(View v) {
        ImageView imageView = findViewById(R.id.image1);
        ImageView imageView2 = findViewById(R.id.image2);
        ImageView imageView3 = findViewById(R.id.image3);
        ImageView imageView4 = findViewById(R.id.image4);


        correctFlag = random.nextInt((j+4)-(j+2))+(j+2);
        if (v.getId() == R.id.btn1) {
            System.out.println("Random numbers with no duplicates = " + list);
            System.out.println("Random number = " + set);

        //wyswietlanie oraz zakonczenie wyswietlania
            if(j == 192){
                Toast.makeText(this, "To koniec", Toast.LENGTH_SHORT).show();
                findViewById(R.id.btn1).setEnabled(false);
            }else {
                imageView.setImageResource(images[list.get(j)]);
                imageView2.setImageResource(images[list.get(j + 1)]);
                imageView3.setImageResource(images[list.get(j + 2)]);
                imageView4.setImageResource(images[list.get(j + 3)]);
                j += 4;
            }
            System.out.println("Poprawna flaga"+correctFlag);
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn1 = findViewById(R.id.btn1);
        btn1.setOnClickListener(this);

    //pobranie resourceId obrazów png
        for (int i = 1; i <= 195; i++) {
            int resId = getResources().getIdentifier("a" + i, "drawable", getPackageName());
            images[i-1] = resId;
        }

    //Pobranie nazw z pliku do listy names
        try (BufferedReader br = new BufferedReader(new FileReader("names.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                names.add(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (String name : names) {
            System.out.println(name);
        }
    //Losowanie kolejnosci flag
        while (set.size() < 194) {
            set.add(random.nextInt(194)+1);
        }
        correctFlag = random.nextInt((j+4)-(j+2))+(j+2);
        System.out.println("Poprawna flaga"+correctFlag);
        list.addAll(set);
    }

    
    public void number1(View view) {
        if (j == correctFlag){
            Toast.makeText(this, "Brawo! Zgadles", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "Sprobuj jeszcze raz", Toast.LENGTH_SHORT).show();
        }
    }
    public void number2(View view) {
        if (j-1 == correctFlag){
            Toast.makeText(this, "Brawo! Zgadles", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "Sprobuj jeszcze raz", Toast.LENGTH_SHORT).show();
        }
    }
    public void number3(View view) {
        if (j-2 == correctFlag){
            Toast.makeText(this, "Brawo! Zgadles", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "Sprobuj jeszcze raz", Toast.LENGTH_SHORT).show();
        }
    }
    public void number4(View view) {
        if (j-3 == correctFlag){
            Toast.makeText(this, "Brawo! Zgadles", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "Sprobuj jeszcze raz", Toast.LENGTH_SHORT).show();
        }
    }
}
0
orlik102 napisał(a):

Problem polega na tym, że wylosowane liczby odpowiadające konkretnym flagom zawsze wskazują 2 miejsca spośród 4. Nie wiem jak doprowadzić do tego, żeby losowała się odpowiednia liczba z podanego zakresu.

A jaki jest "właściwy zakres" ? Jaki ma zwiazek ze 194 czy innymi liczbami ?
Nie każ nam z kodu GUI zgadywac intencji, jak sobie wyobrażasz algorytmikę.

A wątpliwości w/s czegoś podobnego jak losowanie bym rozstrzygnął sobie w prostym teście konsolowym.

I NAUCZ SIĘ DEBUGERA a nie drukuj

0

@orlik102:

Co mam na nie:

  • magiczne liczby
  • brak nawet próby wychwycenia powtarzalnych elementów, jakiegoś stablicowania czy podobnie. Jak będziesz losował z 30 flag, wkleisz kod 30 razy ?
  • drukowanie (zamiast debugera) na System.out
  • random.nextInt((j+4)-(j+2))+(j+2); ... co poeta miał na myśli ?
  • nazwy zmiennych które niczego nie wyjaśniają (ok 3/4)

Kod, który żle wygląda - z zasady ma błędy, bo tak być musi (tym bardziej gwarantowane, gdy taki kod będzie zmieniany i rozwijany)

0
ZrobieDobrze napisał(a):

@orlik102:

Co mam na nie:

  • magiczne liczby
  • brak nawet próby wychwycenia powtarzalnych elementów, jakiegoś stablicowania czy podobnie. Jak będziesz losował z 30 flag, wkleisz kod 30 razy ?
  • drukowanie (zamiast debugera) na System.out
  • random.nextInt((j+4)-(j+2))+(j+2); ... co poeta miał na myśli ?

Kod, który żle wygląda - z zasady ma błędy, bo tak być musi (tym bardziej gwarantowane, gdy taki kod będzie zmieniany i rozwijany)

czym są magiczne liczby?

Jeśli chodzi o powtarzalność podczas porównywania na końcu kodu, nie znam sposobu na lepsze rozwiązanie

random.nextInt((j+4)-(j+2))+(j+2); - znalazłem taki wzór w internecie na losowanie z zakresu a zakres ma być od j do j+4 co znaczy tyle, że zakres ma sie cały czas zwiększać a wylosowana liczba ma pasować do danej flagi w setImageResource, aby potem wylosowana liczba pasowała do wartości j danej flagi.

0

"znalazłem taki wzór w internecie na losowanie z zakresu a zakres ma być od j do j+4 "
To może lepiej
random.nextInt(j,j+4);
A nie lepiej uzyć mapy?

0
bbzzyyczczeek napisał(a):

"znalazłem taki wzór w internecie na losowanie z zakresu a zakres ma być od j do j+4 "
To może lepiej
random.nextInt(j,j+4);
A nie lepiej uzyć mapy?

po takim zapisie mam taki błąd:

Cannot resolve method 'nextInt(int, int)'
0

Może tak.
random.nextInt(j)+4;

0
bbzzyyczczeek napisał(a):

Może tak.
random.nextInt(j)+4;

aplikacja wtedy się kraszuje i wyłącza

0
orlik102 napisał(a):
bbzzyyczczeek napisał(a):

Może tak.
random.nextInt(j)+4;

aplikacja wtedy się kraszuje i wyłącza

leci jakiś wyjątek, MOŻNA mniemać że index oveflow,a le tylko ty to wiesz
Nikt, ale to NIKT ci nie odpowie, jak wyosowana liczba skutkuje w tym kodzie, jak sie ma do 194 czy innych magicznych liczb itd ...

a) debuger w rękę i zobaczyć co się losuje, i jakie są dalsze losy
b) kodować czyściej

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