Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    99

    [C] aiuto con prato fiorito?

    Ciao di nuovo, sto realizzando un prato fiorito per svago, su windows, e praticamente è quasi finito ma mancano alcuni accorgimenti. adesso mi sto scervellando sulle caselle che non hanno nessuna bomba accanto, in pratica se si clicca su una casella con lo zero dovrebbero aprirsi tutte le caselle adiacenti fino a che non si incontra una casella con un numero diverso da zero (in tutte le direzioni), solo che non riesco a inventarmi un modo per farlo.. si potrebbe fare con una funzione ricorsiva ma nemmeno lì mi viene in mente qualche modo per realizzarla
    Ecco qua il codice, (diviso in due parti per comodità personale), spero che sia abbastanza comprensibile,
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<conio3.h>
    #include"headersPF.h"
    int printM(int M[16][16], int stato);
    int move(int M[16][16]);
    int a=0,b=0;
    int P[16][16]={0};
    int main(void)
    {
    	srand(time(NULL));
    	int M[16][16]={0};
    	randomize(M);
    	complete(M);
    	printM(M,0);
    	while(move(M)!=1);
    	return 0;
    }
    int printM(int M[16][16], int stato)
    {
    	clrscr();
    	int i,j,q=0;
    	for(i=0;i<16;i++){
    		for(j=0;j<16;j++){
    			if(i==a&&j==b){
    				if(stato==1){
    					/*if(M[i][j]==0){
    						???????
    					}*/
    					M[i][j]!=9 ? printf("%d ",M[i][j]) : printf("%c%c",254,254);
    					if(M[i][j]==9) q=1;
    					P[i][j]=1;
    				}
    				else printf("%c%c",219, 219);
    			}
    			else if(P[i][j]!=1) printf("%c%c",178,178);
    			else if(P[i][j]==1){
    				colors(M[i][j]);
    				printf("%d ",M[i][j]);
    				setcolor(WHITE,BLACK);
    			}
    		}
    		printf("\n");
    	}
    	if(q==1) return 1;
    	else return 0;
    }
    int move(int M[16][16])
    {
    	int stato=0;
    	if (getch() == 32) stato=1;
    	else{
    		switch (getch()) { 
    			case 72: a--; 
    				break; 
    			case 75: b--; 
    				break; 
    			case 77: b++; 
    				break; 
    			case 80: a++; 
    				break;
    		}
    	}
    	if(printM(M, stato)==1){
    		addio();
    		return 1;
    	}
    	else return 0;
    }
    codice:
    void randomize(int M[16][16])
    {
    	int i,j,k;
    	for(k=0;k<40;k++){
    		i=rand()%16;
    		j=rand()%16;
    		M[i][j]!=9 ? M[i][j]=9 : k--;
    	}
    }
    void complete(int M[16][16])
    {
    	int i,j;
    	for(i=0;i<16;i++){
    		for(j=0;j<16;j++){
    			if(M[i][j]!=9) M[i][j]=count(M,i,j);
    		}
    	}
    }
    int count(int M[16][16], int i, int j)
    {
    	int c=0;
    	if(i!=0 && j!=0 && M[i-1][j-1]==9) c++;
    	if(i!=0 && M[i-1][j]==9) c++;
    	if(i!=0 && j!=15 && M[i-1][j+1]==9) c++;
    	if(j!=0 && M[i][j-1]==9) c++;
    	if(j!=15 && M[i][j+1]==9) c++;
    	if(i!=15 && j!=0 && M[i+1][j-1]==9) c++;
    	if(i!=15 && M[i+1][j]==9) c++;
    	if(i!=15 && j!=15 && M[i+1][j+1]==9) c++;
    	return c;
    }
    void colors(int i)
    {
    	switch(i){
    		case 0: setcolor(BLACK,WHITE);
    			break;
    		case 1: setcolor(LIGHTBLUE,BLACK);
    			break;
    		case 2: setcolor(LIGHTGREEN,BLACK);
    			break;
    		case 3: setcolor(MAGENTA,BLACK);
    			break;
    		case 4: setcolor(YELLOW,BLACK);
    			break;
    		case 5: setcolor(PINK,BLACK);
    			break;
    		case 6: setcolor(PINK,BLACK);
    			break;
    		case 7: setcolor(PINK,BLACK);
    			break;
    		case 8: setcolor(PINK,BLACK);
    			break;
    		case 9: setcolor(LIGHTGREEN,LIGHTRED);
    			break;
    		default: setcolor(WHITE,BLACK);
    			break;
    	}
    }
    void addio()
    {
    	printf("\n\nHAI PERSO!\n\n");
    }
    Grazie molte a chi mi da qualche consiglio

    P.S.: conio3.h è una libreria esterna a tutto, scaricata dal web e modificata un po per farla funzionare, se serve incollo anche quella

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    99
    Ho trovato una soluzione: un algoritmo ricorsivo che controlla tutte le caselle attorno allo zero e a sua volta di nuovo e avanti così finchè non trova un numero!
    codice:
    void zero(int M[16][16],int i, int j)
    {
    	if(M[i][j]!=0){
    		P[i][j]=1;
    	}
    	else if(M[i][j]==0){
    		P[i][j]=1;
    		if(j!=0&&P[i][j-1]==0) zero(M,i,j-1);
    		if(i!=0&&j!=0&&P[i-1][j-1]==0) zero(M,i-1,j-1);
    		if(i!=0&&P[i-1][j]==0) zero(M,i-1,j);
    		if(i!=0&&j!=15&&P[i-1][j+1]==0) zero(M,i-1,j+1);
    		if(j!=15&&P[i][j+1]==0) zero(M,i,j+1);
    		if(i!=15&&j!=15&&P[i+1][j+1]==0) zero(M,i+1,j+1);
    		if(i!=15&&P[i+1][j]==0) zero(M,i+1,j);
    		if(i!=15&&j!=0&&P[i+1][j-1]==0) zero(M,i+1,j-1);
    	}
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.