PROBLEMA [C] Gioco del tris: creazione algoritmo per la mossa del computer

markice92

Nuovo Utente
45
0
Ciao a tutti ragazzi, come da titolo sto programmando il gioco del tris in C ma non riesco a fare un algoritmo per quanto riguarda la mossa che deve fare il pc. In sostanza si tratta di un inserimento random del valore che è stato assegnato al pc nell'array di interi bidimensionale ( ossia la griglia di gioco ). Ho assegnato alla X il valore 1 e alla O il valore 2. Ho provato in vari modi ma niente...
Qualcuno di voi potrebbe aiutarmi? Grazie come sempre in anticipo!
 
M

Mursey

Ospite
Ciao a tutti ragazzi, come da titolo sto programmando il gioco del tris in C ma non riesco a fare un algoritmo per quanto riguarda la mossa che deve fare il pc. In sostanza si tratta di un inserimento random del valore che è stato assegnato al pc nell'array di interi bidimensionale ( ossia la griglia di gioco ). Ho assegnato alla X il valore 1 e alla O il valore 2. Ho provato in vari modi ma niente...
Qualcuno di voi potrebbe aiutarmi? Grazie come sempre in anticipo!

Posta un esempio di codice.

Devi estrarre una casella a caso tra quelle libere.
Ad esempio se la situazione e' :

0 0 0
0 1 0
0 0 0

Devi estrarre un numero da 1 a 9 eliminando il 5 che ' gia' occupato,
in quella posizione metterai il 2 e via cosi'.
 

markice92

Nuovo Utente
45
0
Posta un esempio di codice.

Devi estrarre una casella a caso tra quelle libere.
Ad esempio se la situazione e' :

0 0 0
0 1 0
0 0 0

Devi estrarre un numero da 1 a 9 eliminando il 5 che ' gia' occupato,
in quella posizione metterai il 2 e via cosi'.

Questo è il codice che ho scritto fino ad ora
 

Allegati

  • tris2.txt
    1.4 KB · Visualizzazioni: 711

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Soluzione 1

Una soluzione semplice potrebbe essere, come dice Mursey, quella di generare un numero da 1 a 9 (non capisco perchè lo generi utilizzando l'elemento della matrice in posizione i,j, che oltretutto non setti), che utilizzerai come indice della matrice.

Poi estrai l'indice della riga e l'indice della colonna. La tua matrice altro non è che un'insieme di celle affiancate. Quindi per ipotesi, se il numero generato è 4 la posizione della matrice sarà:
4 / 3 = 1 riga
(4%3)-1 = 1 colonna

1/1 = 1 riga
1%1 = 0 colonna

5/3 = 1 riga
(5%3)-1 = 1 colonna

La sottrazione di una unità la fai solo se la colonna è diversa da 0.

Dovrebbe funzionare.

Soluzione 2

Generi riga e colonna separatamente, ma l'indice sarà da 1 a 3.

Soluzione 3
Crei un array con gli elementi da 1 a 9 generati random (per essere sicuro di non ripeterli ed evitare controlli, potresti inserirli linearmente e poi utilizzare un algoritmo per mischiarli Shuffle array in C - Stack Overflow ). Ora dovrai solo accedere all'array per ottenere il singolo elemento (puoi usare ad esempio una variabile globale che tiene traccia dell'indice usato in precedenza).

Queste sono tutte soluzioni semplici, e ce ne saranno altre. In tutti i casi però tieni presente che gli indici che estrai potresti già averli utilizzati... di conseguenza se la cella non è vuota, devi generarne un altro.
 
  • Mi piace
Reazioni: Mursey
M

Mursey

Ospite
In tutti i casi però tieni presente che gli indici che estrai potresti già averli utilizzati... di conseguenza se la cella non è vuota, devi generarne un altro.

Esatto.
Un modo pulito sarebbe estrarre il numero solo per le celle libere :

0 0 0
0 1 0
0 0 0

In questo caso estrai un numero da 1 a 8 e poi consideri solo le celle che hanno valore 0

Se esce 7 diventa :

0 0 0
0 1 0
0 2 0

Quindi adesso estrai da 1 a 7 e cosi' via...


Certo che il tris e' gia' un gioco dove non vince nessuno, se poi il computer gioca pure a caso non c'e' nessun gusto ;)
Come studio va bene ma sarebbe meglio pensare ad un vero algoritmo di gioco !
 

markice92

Nuovo Utente
45
0
Soluzione 1

Una soluzione semplice potrebbe essere, come dice Mursey, quella di generare un numero da 1 a 9 (non capisco perchè lo generi utilizzando l'elemento della matrice in posizione i,j, che oltretutto non setti), che utilizzerai come indice della matrice.

Poi estrai l'indice della riga e l'indice della colonna. La tua matrice altro non è che un'insieme di celle affiancate. Quindi per ipotesi, se il numero generato è 4 la posizione della matrice sarà:
4 / 3 = 1 riga
(4%3)-1 = 1 colonna

1/1 = 1 riga
1%1 = 0 colonna

5/3 = 1 riga
(5%3)-1 = 1 colonna

La sottrazione di una unità la fai solo se la colonna è diversa da 0.

Dovrebbe funzionare.

Soluzione 2

Generi riga e colonna separatamente, ma l'indice sarà da 1 a 3.

Soluzione 3
Crei un array con gli elementi da 1 a 9 generati random (per essere sicuro di non ripeterli ed evitare controlli, potresti inserirli linearmente e poi utilizzare un algoritmo per mischiarli Shuffle array in C - Stack Overflow ). Ora dovrai solo accedere all'array per ottenere il singolo elemento (puoi usare ad esempio una variabile globale che tiene traccia dell'indice usato in precedenza).

Queste sono tutte soluzioni semplici, e ce ne saranno altre. In tutti i casi però tieni presente che gli indici che estrai potresti già averli utilizzati... di conseguenza se la cella non è vuota, devi generarne un altro.
Ok, ho usato il primo metodo e funziona, grazie veramente tanto! Adesso però sorge un'altro quesito XD Se la cella scelta dal computer è occupata dal mio segno deve ripetere il procedimento... Come faccio a dirglielo??
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Prego! ;)

Utilizzi un while.
Codice:
do {
  // Generi il numero...
  int r = // ottieni riga...
  int c = // ottieni colonna...

while(matrice[r][c] != 0);

ripete se è diverso da 0, quindi ripete se la cella è occupata (non solo dal pc, ma anche da te).
 
M

Mursey

Ospite
Ok, ho usato il primo metodo e funziona, grazie veramente tanto! Adesso però sorge un'altro quesito XD Se la cella scelta dal computer è occupata dal mio segno deve ripetere il procedimento... Come faccio a dirglielo??

Se seguivi il mio suggerimento non c'era bisogno.
 

markice92

Nuovo Utente
45
0
Prego! ;)

Utilizzi un while.
Codice:
do {
  // Generi il numero...
  int r = // ottieni riga...
  int c = // ottieni colonna...

while(matrice[r][c] != 0);

ripete se è diverso da 0, quindi ripete se la cella è occupata (non solo dal pc, ma anche da te).
Grazie ancora, a tutti e due, grandi ragazzi! ;)
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili