PROBLEMA Java e il gioco scopa

DarkGast

Nuovo Utente
45
0
Ciao a tutti ragazzi,
spero innanzitutto di aver scritto nella sezione giusta.Ho un problema in progetto di java,dove stiamo programmando il gioco scopa.
Riassumendo il tutto:
Abbiamo creato una classe per "settare" i valori,i nomi e dare le carte
Abbiamo creato poi una arraylist con tutte le carte
Infine abbiamo usato un generatore casuale per dare il numero di una carte che sará poi successivamente mostrata in un jlabel.Il nostro problema sta proprio qua.Il generatore da il numero che pero spesso e volentieri viene ripetuto piu volte,quindi avevamo pensato ad un metodo per bloccare o azzerare l´oggetto nella arraylist,ma non ha funzionato.Ora stiamo provando ad usare un boolean per "segnare" le carte gia usate da quelle non ancora usate,ma gli errori al posto di diminuire continuano ad aumentare.
Spero che mi possiate aiutare e che abbia spiegato bene,in tal caso posso pure mettere gli screen del codice.
Grazie a tutti quelli che risponderanno
 

fedi98

Nuovo Utente
121
8
Non so se ho capito bene, ma il problema è che non riuscite a dare le carte casualmente?
Nel caso penso che basti creare un numero random tra 0 e 1 e moltiplicarlo per la lunghezza del vostro arraylist, dare quella carta e rimuoverla dalla lista, così la prossima volta avrete una carta in meno e di sicuro non la potete dare a più giocatori
 

DarkGast

Nuovo Utente
45
0
Non so se ho capito bene, ma il problema è che non riuscite a dare le carte casualmente?
Nel caso penso che basti creare un numero random tra 0 e 1 e moltiplicarlo per la lunghezza del vostro arraylist, dare quella carta e rimuoverla dalla lista, così la prossima volta avrete una carta in meno e di sicuro non la potete dare a più giocatori

Ti ringrazio innanzitutto per la risposta.Il problema non é generare il numero random,ma far si che il numero che viene generato non venga ripetuto.Sostanzialmente viene creato prima il numero random,poi associato all'oggetto nella arraylist,e poi viene mostrata l'immagine di quell'oggetto in un jlabel.Dopodiché pero viene generato un altro numero per la 2^ carta e si ripete tutto per 3 carte a giocatore+4 carte sul tavolo,che vengono molte volte create con lo stesso numero dato dal generatore random.Grazie ancora per la risposta
 

fedi98

Nuovo Utente
121
8
Continuo a non capire. Ripeto il problema è che non riuscite a dare le carte perchè esse si ripetono? Nel caso la soluzione che ho fornito è corretta: se togli la carta dalla lista questa non si ripete di sicuro.
 

DarkGast

Nuovo Utente
45
0
Scusa,avevo letto maleAd ogni modo si,la soluzione é quella che dici tu.Avevo provato giorni fa,ma non sono riuscito a programmarlo senza errori.Potresti gentilmente dirmi cosa e come dovrei scriverlo?Grazie in anticipo
 

fedi98

Nuovo Utente
121
8
te lo dico a parole:
1. generi il numero random (classe random)
2. lo moltiplichi per la lunghezza della lista (adesso è il tuo indice)
3. prelevi l' elemento dalla lista e fai quello che devi farci
4. rimuovi l' elemento dalla lista

con un ciclo fai così per tutte le carte
 
  • Mi piace
Reazioni: DarkGast

DarkGast

Nuovo Utente
45
0
Scusa il ritardo,ho capito la soluzione ma...sono veramente niubbo nel programmare..vediamo cosi:
Creo una nuova classe (nel file della classe principale o in un file separato?)
Nella classe scrivo :
public int random
random casuale = new Random();
random = random.nextInt ( ); (dentro le partentesi che numero dovrei mettere per far si che sia tra 0 e 1??)

lo moltiplico:
random = random*40; (giusto?)

prelevare l´elemento...come?

rimuoverlo:

random = remove.random (giusto?)

Per farlo per tutte le carte come lo dovrei fare (ciclo sarebbe con if e while?)

Scusa ancora per la niubbaggine ma sono veramente ad un livello basso di conoscenza sia della programmazione che di java:sisi:
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Scusa il ritardo,ho capito la soluzione ma...sono veramente niubbo nel programmare..vediamo cosi:
Creo una nuova classe (nel file della classe principale o in un file separato?)
Nella classe scrivo :
public int random
random casuale = new Random();
random = random.nextInt ( ); (dentro le partentesi che numero dovrei mettere per far si che sia tra 0 e 1??)

lo moltiplico:
random = random*40; (giusto?)

prelevare l´elemento...come?

rimuoverlo:

random = remove.random (giusto?)

Per farlo per tutte le carte come lo dovrei fare (ciclo sarebbe con if e while?)

Scusa ancora per la niubbaggine ma sono veramente ad un livello basso di conoscenza sia della programmazione che di java:sisi:

Le risposte alle tue domande stanno tutte nella documentazione ufficiale di Java, usala!
Per l'ultima domanda, basta un ciclo while(arraylist.size() != 0) e a ogni ciclo: generi numero casuale, prelevi ci fai quello che devi fare e lo togli dall'arraylist ( tutti i metodi da usare sono nella documentazione)
 
  • Mi piace
Reazioni: DarkGast

DarkGast

Nuovo Utente
45
0
Grazie innanzitutto delle risposta.Avete fatto bene a dirmi della documentazione perché sinceramente fino a prima d´ora non l´ho mai utilizzata.
Detto questo vediamo se ho capito

random casuale= new random;
casuale = (int)Math.random() * 100;
poi lo associo con un jlabel
e lo tolgo con remove (casuale.remove?)

per il ciclo non ho capito bene dove dovrei metterlo,cioé mi dice che ogni volta che la array é vuota crea l´arraylist ma non significherebbe che sarebbe cosí all´infinito?
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Guando l'array è vuoto e ti richiede di riempirlo, è come se stessi facendo una nuova partita. Quindi direi che ti basta chiedere se la vuole fare, se si ricominci, sennò esci dal ciclo e chiudi il programma
 

DarkGast

Nuovo Utente
45
0
OK adesso ho capito cosa intendi.Ancora una domanda:mi conviene usare match.random o random.nextInt?per rimuovere l'oggetto (con remove no?) dall'array devo farlo nella classe dove ho l'array o in quella principale?
Grazie ancora dell'aiuto e delle spiegazioni che mi avete dato
 
M

Mursey

Ospite
OK adesso ho capito cosa intendi.Ancora una domanda:mi conviene usare match.random o random.nextInt?per rimuovere l'oggetto (con remove no?) dall'array devo farlo nella classe dove ho l'array o in quella principale?
Grazie ancora dell'aiuto e delle spiegazioni che mi avete dato
L'elemento va rimosso dall'arraylist.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,900
11,551
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Suggerisco un'alternativa migliore: usa un semplice array (non un ArrayList) di oggetti di tipo carta da gioco, l'array rappresenta un mazzo
riempi il mazzo con le carte in modo ordinato:
nella posizione 0 l'asso di denari (o un altro seme che ti piace),
nella posizione 1 il 2 di denari...nella posizione 9 il 10 di denari
fai lo stesso con gli altri semi
alla fine hai un mazzo perfettamente ordinato

adesso devi "mischiare" il mazzo:
per "mischiare" 2 carte ti basta generare 2 numeri interi compresi tra 0 e 39 (gli indici dell'array), per esempio la prima volta generi 5 e 30;
scambia gli oggetti puntati da questi indici: in questo modo avrai (per esempio) che all'indice 5 (precedentemente occupato dal 6 di denari) ci metti l'indice 30 (l'asso di bastoni se bastoni è l'ultimo seme); viceversa, all'indice 30 va a finire il 6 di denari.
Se fai un ciclo da un centinaio (o più) di generazioni random di coppie di interi e, ad ogni passo, esegui lo scambio delle carte ai rispettivi indici, alla fine del ciclo avrai un array di carte competamente (pseudo) casuale; in questo modo non è più un problema se verrà generato più volte lo stesso intero pseudocasuale perché ogni volta la carta puntata scambierà la posizione con un'altra carta (d'altra parte è quasi compeltamente impossibile che generi 2 volte di seguito la stessa coppia casuale di interi).
Alla fine di questo procedimento hai una mazzo mischiato come nella realtà.

Cosa si fa dopo nella realtà?
prima si mischia un mazzo e poi le carte vengono distribuite in ordine, ed è quello che fai tu:
dai le carte tre a 3 nello stesso ordine in cui sono nel mazzo mischiato!
per esempio se giochi in 2 dai le carte di indice 0,1,2 al primo giocatore, poi dai le carte di indice 3,4,5 al secondo giocatore
poi metti le 4 carte per terra (indici 6,7,8,9)
a questo punto hai bisogno di una variabile intera che "ricorda" a quale indice sei arrivato:
dopo la prima mano al giocatore-1 dai le carte di indice 10,11,12 e la giocatore 2 quelle di indice 13,14,15

Se fai come ti ho suggerito non avrai più problemi di generazione della stessa carta, eviti l'operazione di eliminazione di carte da un ArrayList e il mazzo mischiato si può anche riusare senza essere per forza creato ordinato.
 
Ultima modifica:
  • Mi piace
Reazioni: DarkGast e Mursey

DarkGast

Nuovo Utente
45
0
@BAT00cent : Allora credo di aver sbagliato ad usare il termine adeguato,visto che io ho esattamente una classe con un array in cui le carte sono disposte proprio come dici tu:sisi:
Detto questo il mazzo quindi dovrei averlo giá.Per mischiare genero un numero random (random.nextInt) che salvo in due variabili differenti.Il primo numero lo metto in una variabile temporanea,prendo il secondo e lo metto nell´array del primo e dopo prendo quello nella variabile temporanea e la metto nell´array della seconda.
Creo una variabile che mi fa da contatore,cosicché quando arriva a 39 non generi piu numeri.Tutto questo pero deve essere fatto nella classe dell´array.Ho capito bene no?
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili