Nippolo ha scritto:
Tempo fa mi cimentai anch'io nel gioco del 15, questo il codice tradotto in C:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#define DEFAULT_COLOUR 7
#define RED 12
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
void set_colour(int colour)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colour);
}
int get_input()
{
while(getch() != 224);
return getch();
}
void scambia_valori(unsigned int *a, unsigned int *b)
{
unsigned int temp = *a;
*a = *b;
*b = temp;
}
void mischia(unsigned int *v)
{
for(unsigned int i = 14; i; --i)
{
scambia_valori(v + rand() % (i + 1), v + i);
}
}
int impossibile(unsigned int *v)
{
unsigned int cont = 0;
for(unsigned int i = 0; i < 15; ++i)
{
for(unsigned int j = i + 1; j < 15; cont += v[i] > v[j], ++j);
}
return(cont % 2);
}
void inizializza(unsigned int *v)
{
mischia(v);
if(impossibile(v))
{
scambia_valori(v + 13, v + 14);
}
}
int controlla_vittoria(unsigned int *v)
{
unsigned int i;
for(i = 0; v[i] == i + 1; ++i);
return(i == 15);
}
int mossa_giocatore(unsigned int v[4][4], unsigned int *i_0, unsigned int *j_0)
{
unsigned int I_0 = *i_0;
unsigned int J_0 = *j_0;
while(1)
{
int input = get_input();
if(input == UP && *i_0)
{
--*i_0;
break;
}
else if(input == DOWN && *i_0 != 3)
{
++*i_0;
break;
}
else if(input == LEFT && *j_0)
{
--*j_0;
break;
}
else if(input == RIGHT && *j_0 != 3)
{
++*j_0;
break;
}
}
scambia_valori(&v[*i_0][*j_0], &v[I_0][J_0]);
}
void mostra_griglia(unsigned int v[4][4])
{
for(unsigned int i = 0; i < 4; ++i)
{
for(unsigned int j = 0; j < 4; ++j)
{
if(!v[i][j])
{
set_colour(RED);
}
printf(" %02u\t", v[i][j]);
set_colour(DEFAULT_COLOUR);
}
printf("\n\n");
}
printf("\n");
}
int main()
{
srand(time(0));
unsigned int m[4][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 0}};
unsigned int i_0 = 3;
unsigned int j_0 = 3;
unsigned int mosse = 0;
inizializza(*m);
while(1)
{
system("CLS");
printf("\n ORDINARE I NUMERI DA 1 A 15 CON LO SPAZIO VUOTO (00) IN BASSO A DESTRA\n\n\n\n");
mostra_griglia(m);
if(controlla_vittoria(*m))
{
break;
}
mossa_giocatore(m, &i_0, &j_0);
++mosse;
}
printf("HAI VINTO IN %u MOSSE!\n", mosse);
}
Si gioca con i tasti freccia della tastiera.
Più che altro volevo mostrarti l'impostazione logica del programma, per esempio mescolando in questo modo la probabilità associata a ciascuna permutazione risulta uniforme.
Ho visto velocemente, direi che di cose me ne hai mostrate molte, per esempio la matrice a due dimensioni, facilita alcune cose...
EDIT: che strano giocare con le frecce
Quando ho scritto il programma in C, ho rivangato ricordi di un vecchio codice minimale che avevo scritto in VB.Net:
http://www.pierotofy.it/pages/extras/forum/viewtopic.php?forum_id=&project_id=&id=1062815&page=4, codice ridotto di "15 il Gioco", sempre in VB.Net, con le tessere che scorrono veramente anche multiple:
http://www.pierotofy.it/pages/projects/files.php?id=66
c'è anche l'eseguibile ...\Gioco_del_15_5_NET\bin\Release\15 il gioco Fifteen.exe
Si può giocare con puzzle fino a 10x10... 99 tessere
Con il puzzle 4x4 soluzioni anche personalizzabili e salvabili
Come già ti avevo accennato mescolavo il puzzle veramente via software, non so se ci rimetterò mano, ora che so come mescolare senza perdere la parità delle coppie.
In Linux che conoscenze hai? come si sostituisce windows.h?