Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Minesweeper
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
Zildyan
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 28. 07. 2008. (13:41:39)
Postovi: (20)16
Sarma = la pohva - posuda
= 3 - 3

PostPostano: 19:16 uto, 5. 5. 2009    Naslov: Citirajte i odgovorite

evo proba san rijesiti ovu igricu i moram priznati da me malo namucila..ako se itko bavio ovim istim zadatkom neka proba malo procitati moj kod (koji je dodatno kompliciran jer ja inace kompliciram sve moguce :)) imam jednu gresku koja puno ne utjece na igricu, ali znaci nisam jos gotov, no svaki put moram ispocetka citati kod jer ne znam di san pa mi se neda to ispravljati...here we go...

[code:1]



#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

int m, n;

int provjera(int A[][100], int B[][100], int m, int n, int a, int b);

int random(int a){
int x;
x = rand() % a;
return x;
}

void ispis(int A[][100], int B[][100], int m, int n,int *brojac1){
int i, j, brojac2=0, e;
printf(" ");
printf(" 1. ");
for(j=2;j<=n;j++) printf("%d. ", j);
printf("\n");
printf(" ");
for(j=1;j<=n;j++) printf("-----");printf("-");
printf("\n |");
for(j=1;j<=n;j++) printf(" ");
printf(" |");
for(i=0;i<m;i++)
for(j=0;j<n;j++) if(B[i][j]!=0 && B[i][j]!=99) ++brojac2;
if(brojac2==*brojac1){
for(i=0;i<m;i++)
for(j=0;j<n;j++){
if(j==0) printf("\n %d.| ", i+1);
if(j==n-1){
if(A[i][j]==-2) printf("* |");
else printf("- |");
}
else{
if(A[i][j]==-2) printf("* ");
else printf("- ");
}
if(j==n-1){
printf("\n |");
for(e=1;e<=n;e++) printf(" ");
printf(" |");
}
}
printf("\n ");
for(i=1;i<=n;i++) printf("-----"); printf("-");
printf("\nCESTITAM USPIO SI!!!\n\n");
system("pause");
exit(-1);
}
else {
for(i=0;i<m;i++)
for(j=0;j<n;j++){
if(j==0) printf("\n %d.| ", i+1);
if(j==n-1){
if(B[i][j]==98){ printf("X |"); }
else{
if(B[i][j]<=-100 || B[i][j]==100) {
printf("- |");
}
else {
printf("%d |", B[i][j]);
}
}
}
else{
if(B[i][j]==98){ printf("X "); }
else{
if(B[i][j]<=-100 || B[i][j]==100) {
printf("- ");
}
else {
printf("%d ", B[i][j]);
}
}
}
if(j==n-1){
printf("\n |");
for(e=1;e<=n;e++) printf(" ");
printf(" |");
}
}
}
printf("\n ");
for(i=1;i<=n;i++) printf("-----"); printf("-");
return;
}


void oslobodi(int A[][100], int B[][100], int m, int n, int a, int b){
int i, j, s;
static int p=-100;
for(i=a-1;i<=a+1;i++)
for(j=b-1;j<=b+1;j++){
if(i-1<0 || j-1<0 || i-1==m || j-1==n) continue;
if(i==a && j==b) B[i-1][j-1]=100;
if(i==a && j==b) continue;
if(B[i-1][j-1]==0) B[i-1][j-1]=p;
}
--p;
for(i=a-1;i<=a+1;i++)
for(j=b-1;j<=b+1;j++){
if(B[i-1][j-1]==p+1){
if(i-1<0 || j-1<0 || i-1==m || j-1==n) continue;
if(i==a && j==b) continue;
B[i-1][j-1]=-200;
s=provjera(A, B, m, n, i, j);
if(s>0) B[i-1][j-1]=s;
if(s==0) oslobodi(A, B, m, n, i, j);
}
}
return;
}

int provjera(int A[][100], int B[][100], int m, int n, int a, int b){
int i, j, cnt=0;
for(i=a-1;i<=a+1;i++)
for(j=b-1;j<=b+1;j++){
if(i==a && j==b) continue;
if(i-1<0 || j-1<0 || i-1==m || j-1==n) continue;
if(B[i-1][j-1]==0)
if(A[i-1][j-1]==-2) ++cnt;
}
return cnt;
}



int main(void){
int i , j, a, b, A[100][100], s, e, f;
double g;
int B[100][100];
int brojac1=0, brojac3=0;
srand ((unsigned) time(NULL));
printf(" MINESWEEPER\n\nUpisite velicinu ploce koju zelite igrati:\n");
printf("upisite visinu ploce:"); scanf("%d", &m);
printf("upisite duzinu ploce:"); scanf("%d", &n);
printf("upisite tezinu igre u postocima(>=40):"); scanf("%lf", &g);
printf("\n\n");
g=m*n*(g/100);
for(i=0;i<m;i++)
for(j=0;j<n;j++){
A[i][j]=-1*random(3);
while(A[i][j]==0) A[i][j]=-1*random(3);
if(A[i][j]==-2 && brojac3<=g) ++brojac3;
if(A[i][j]==-1) ++brojac1;
if(brojac3>g && A[i][j]==-2){
A[i][j]=-1;
++brojac1;
}
B[i][j]=0;
}
printf(" ");
printf(" 1. ");
for(j=2;j<=n;j++) printf("%d. ", j);
printf("\n");
printf(" ");
for(j=1;j<=n;j++) printf("-----");printf("-");
printf("\n |");
for(j=1;j<=n;j++) printf(" ");
printf(" |");
for(i=0;i<m;i++)
for(j=0;j<n;j++){
if(j==0) printf("\n %d.| ", i+1);
if(j==n-1) printf("%d |", B[i][j]);
else printf("%d ", B[i][j]);
if(j==n-1){
printf("\n |");
for(e=1;e<=n;e++) printf(" ");
printf(" |");
}
}
printf("\n ");
for(e=1;e<=n;e++) printf("-----"); printf("-");
--brojac3;
while(1){
if(brojac3>0){
printf("\n\n(preostalo:%d) zelite li upotrijebiti X-eve (0-NE, 1-DA):", brojac3);
scanf("%d", &f);
}
else f=0;
if(f==0 || f==1) {
printf("\nupisite koordinate polja kojeg zelite otvoriti:\n");
printf("upisite visinu polja:"); scanf("%d", &a);
printf("upisite duzinu polja:"); scanf("%d", &b);
printf("\n\n");
if(a>m || b>n || B[a-1][b-1]!=0){
printf("\nupisali ste neispravne koordinate!!!\n\n");
continue;
}
if(f==1){
--brojac3;
B[a-1][b-1]=98;
ispis(A, B, m, n, &brojac1);
continue;
}
if(A[a-1][b-1]==-2){
printf(" ");
printf(" 1. ");
for(j=2;j<=n;j++) printf("%d. ", j);
printf("\n");
printf(" ");
for(j=1;j<=n;j++) printf("-----"); printf("-");
printf("\n |");
for(j=1;j<=n;j++) printf(" ");
printf(" |");
for(i=0;i<m;i++)
for(j=0;j<n;j++){
if(j==0) printf("\n %d.| ", i+1);
if(j==n-1){
if(A[i][j]==-2) printf("* |");
else printf("- |");
}
else{
if(A[i][j]==-2) printf("* ");
else printf("- ");
}
if(j==n-1){
printf("\n |");
for(e=1;e<=n;e++) printf(" ");
printf(" |");
}
}
printf("\n ");
for(e=1;e<=n;e++) printf("-----"); printf("-");
printf("\n\n");
printf("BOOOOOOOOOOOOOOOOOOOOOOOOMMMMMMMMMMM!!! You suck! :D\n\n");
system("pause");
exit(-1);
}
s=provjera(A, B, m, n, a, b);
if(s>0) B[a-1][b-1]=s;
if(s==0) oslobodi(A, B, m, n, a, b);
ispis(A, B, m, n, &brojac1);
}
else continue;
}
system("pause");
return 0;
}

[/code:1]

P.S. znam da se vjerojatno moze puno jednostavnije rijesiti ali vec sam rekao da kompliciram ;)

[size=9][color=#999999]Added after 2 hours 34 minutes:[/color][/size]

e i ako mi moze ko reci di se more skiniti onaj graphic.h header file za grafiku u C/C++ jer, pokusa san nesto malo sam, ali mi ocito fali ovaj file..ako ko zna?
evo proba san rijesiti ovu igricu i moram priznati da me malo namucila..ako se itko bavio ovim istim zadatkom neka proba malo procitati moj kod (koji je dodatno kompliciran jer ja inace kompliciram sve moguce Smile) imam jednu gresku koja puno ne utjece na igricu, ali znaci nisam jos gotov, no svaki put moram ispocetka citati kod jer ne znam di san pa mi se neda to ispravljati...here we go...

Kod:



   
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

int m, n;

int provjera(int A[][100], int B[][100], int m, int n, int a, int b);

int random(int a){
int x;
x = rand() % a;
return x;
}

void ispis(int A[][100], int B[][100], int m, int n,int *brojac1){
   int i, j, brojac2=0, e;
          printf("      ");
          printf(" 1.   ");
          for(j=2;j<=n;j++) printf("%d.   ", j);
          printf("\n");
          printf("     ");
          for(j=1;j<=n;j++) printf("-----");printf("-");
          printf("\n    |");
          for(j=1;j<=n;j++) printf("     ");
          printf(" |");
          for(i=0;i<m;i++)
          for(j=0;j<n;j++) if(B[i][j]!=0 && B[i][j]!=99) ++brojac2;       
          if(brojac2==*brojac1){
                 for(i=0;i<m;i++)
                 for(j=0;j<n;j++){
                 if(j==0) printf("\n  %d.|  ", i+1);
                 if(j==n-1){
                 if(A[i][j]==-2) printf("*   |");
                 else printf("-   |");
                 }
                 else{
                 if(A[i][j]==-2) printf("*    ");
                 else printf("-    ");
                 }
                 if(j==n-1){
                 printf("\n    |");
                 for(e=1;e<=n;e++) printf("     ");
                 printf(" |");     
                 }
                 }   
                 printf("\n     ");
                 for(i=1;i<=n;i++) printf("-----"); printf("-");   
                 printf("\nCESTITAM USPIO SI!!!\n\n");
                 system("pause");
                 exit(-1);
                 }
          else {
          for(i=0;i<m;i++)
          for(j=0;j<n;j++){
          if(j==0) printf("\n  %d.|  ", i+1);
          if(j==n-1){
          if(B[i][j]==98){ printf("X   |"); }
          else{
          if(B[i][j]<=-100 || B[i][j]==100) {
                           printf("-   |");
                           }
          else {
               printf("%d   |", B[i][j]);
               }
               }
               }
          else{
          if(B[i][j]==98){ printf("X    "); }
          else{
              if(B[i][j]<=-100 || B[i][j]==100) {
                           printf("-    ");
                           }
          else {
               printf("%d    ", B[i][j]);
               }
               }
               }
          if(j==n-1){
          printf("\n    |");
          for(e=1;e<=n;e++) printf("     ");
          printf(" |");     
          }
               }
               }
          printf("\n     ");
          for(i=1;i<=n;i++) printf("-----"); printf("-");
          return;
          }
               
               
void oslobodi(int A[][100], int B[][100], int m, int n, int a, int b){
     int i, j, s;
     static int p=-100;                       
                 for(i=a-1;i<=a+1;i++)
                 for(j=b-1;j<=b+1;j++){
                 if(i-1<0 || j-1<0 || i-1==m || j-1==n) continue;
                 if(i==a && j==b) B[i-1][j-1]=100;
                 if(i==a && j==b) continue;
                 if(B[i-1][j-1]==0) B[i-1][j-1]=p;
                 }
                 --p;
                 for(i=a-1;i<=a+1;i++)
                 for(j=b-1;j<=b+1;j++){
                 if(B[i-1][j-1]==p+1){
                 if(i-1<0 || j-1<0 || i-1==m || j-1==n) continue;
                 if(i==a && j==b) continue;
                 B[i-1][j-1]=-200;
                 s=provjera(A, B, m, n, i, j);
    if(s>0) B[i-1][j-1]=s;
    if(s==0) oslobodi(A, B, m, n, i, j);
    }
    }
    return;
    }     
                                           
int provjera(int A[][100], int B[][100], int m, int n, int a, int b){
    int i, j, cnt=0;                           
                 for(i=a-1;i<=a+1;i++)
                 for(j=b-1;j<=b+1;j++){
                 if(i==a && j==b) continue;
                 if(i-1<0 || j-1<0 || i-1==m || j-1==n) continue;
                 if(B[i-1][j-1]==0)
                 if(A[i-1][j-1]==-2) ++cnt;
                 }                 
     return cnt;
     }
     

                 
int main(void){
    int i , j, a, b, A[100][100], s, e, f;
    double g;
    int B[100][100];
    int brojac1=0, brojac3=0;
    srand ((unsigned) time(NULL));
    printf("        MINESWEEPER\n\nUpisite velicinu ploce koju zelite igrati:\n");
    printf("upisite visinu ploce:"); scanf("%d", &m);
    printf("upisite duzinu ploce:"); scanf("%d", &n);
    printf("upisite tezinu igre u postocima(>=40):"); scanf("%lf", &g);
    printf("\n\n");
    g=m*n*(g/100);
    for(i=0;i<m;i++)
    for(j=0;j<n;j++){
    A[i][j]=-1*random(3);
    while(A[i][j]==0) A[i][j]=-1*random(3);
    if(A[i][j]==-2 && brojac3<=g) ++brojac3;
    if(A[i][j]==-1) ++brojac1;
    if(brojac3>g && A[i][j]==-2){
                  A[i][j]=-1;
                  ++brojac1;
                  }
    B[i][j]=0;
    }
    printf("      ");
    printf(" 1.   ");
    for(j=2;j<=n;j++) printf("%d.   ", j);
    printf("\n");
    printf("     ");
    for(j=1;j<=n;j++) printf("-----");printf("-");
    printf("\n    |");
    for(j=1;j<=n;j++) printf("     ");
    printf(" |");
    for(i=0;i<m;i++)
    for(j=0;j<n;j++){
    if(j==0) printf("\n  %d.|  ", i+1);
    if(j==n-1) printf("%d   |", B[i][j]);
    else printf("%d    ", B[i][j]);
    if(j==n-1){
    printf("\n    |");
    for(e=1;e<=n;e++) printf("     ");
    printf(" |");     
    }
    }
    printf("\n     ");
    for(e=1;e<=n;e++) printf("-----"); printf("-");
    --brojac3;
    while(1){
    if(brojac3>0){
    printf("\n\n(preostalo:%d) zelite li upotrijebiti X-eve (0-NE, 1-DA):", brojac3);
    scanf("%d", &f);
    }
    else f=0;
    if(f==0 || f==1) {
    printf("\nupisite koordinate polja kojeg zelite otvoriti:\n");
    printf("upisite visinu polja:"); scanf("%d", &a);
    printf("upisite duzinu polja:"); scanf("%d", &b);
    printf("\n\n");
    if(a>m || b>n || B[a-1][b-1]!=0){
           printf("\nupisali ste neispravne koordinate!!!\n\n");
           continue;
           }
    if(f==1){
             --brojac3;
             B[a-1][b-1]=98;
             ispis(A, B, m, n, &brojac1);
             continue;
             }
    if(A[a-1][b-1]==-2){
          printf("      ");
          printf(" 1.   ");
          for(j=2;j<=n;j++) printf("%d.   ", j);
          printf("\n");
          printf("     ");
          for(j=1;j<=n;j++) printf("-----"); printf("-");
          printf("\n    |");
          for(j=1;j<=n;j++) printf("     ");
          printf(" |");
          for(i=0;i<m;i++)
          for(j=0;j<n;j++){
               if(j==0) printf("\n  %d.|  ", i+1);
               if(j==n-1){
               if(A[i][j]==-2) printf("*   |");
               else printf("-   |");
               }
               else{
               if(A[i][j]==-2) printf("*    ");
               else printf("-    ");
               }
               if(j==n-1){
               printf("\n    |");
               for(e=1;e<=n;e++) printf("     ");
               printf(" |");
               }
               }
               printf("\n     ");
               for(e=1;e<=n;e++) printf("-----"); printf("-");
          printf("\n\n");
          printf("BOOOOOOOOOOOOOOOOOOOOOOOOMMMMMMMMMMM!!! You suck! :D\n\n");
          system("pause");
          exit(-1);
          }
    s=provjera(A, B, m, n, a, b);
    if(s>0) B[a-1][b-1]=s;
    if(s==0) oslobodi(A, B, m, n, a, b);
    ispis(A, B, m, n, &brojac1);
    }
    else continue;
}
system("pause");
return 0;
}



P.S. znam da se vjerojatno moze puno jednostavnije rijesiti ali vec sam rekao da kompliciram Wink

Added after 2 hours 34 minutes:

e i ako mi moze ko reci di se more skiniti onaj graphic.h header file za grafiku u C/C++ jer, pokusa san nesto malo sam, ali mi ocito fali ovaj file..ako ko zna?


[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
markotron
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 26. 10. 2008. (12:07:29)
Postovi: (95)16
Spol: kućni ljubimac
Sarma = la pohva - posuda
= 28 - 28
Lokacija: Umag

PostPostano: 23:25 uto, 5. 5. 2009    Naslov: Citirajte i odgovorite

Malo ti je ne citak kod pa mi se nije dalo citat. Nisam isprobavao dal tvoje radi ili ne. :D

Zato sam napisao svoju verziju.

Nedostaci:
Ne može se obilježiti mina, te nisam provjeravao dali je mina vec na tom mjestu kad funkcija rand određuje poziciju mine, odnosno moze se desiti da dvije mine budu na istom mjestu, tj. broj mina se smanji... bio sam ljen to napravit.. ali to je trivić :D

Prednosti:
Vrhunsko graficko sucelje, i neponovljiva zabava :D

evo, pejstajte kod u vas Dev-cpp i uvjerite se sami ;)


[code:1]

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

short **minskoPoljeG;
int brojRedakaG, brojStupacaG, brojMinaG, doPobjedeG, otvorenaPoljaG;
clock_t pocetak, kraj;

void IspisiPolje ( int svrha )
{
int i, j;
system ( "CLS" );
printf ( " " );

if ( !svrha )
{
for ( i = 0; i < brojRedakaG; ++i )
printf ( "%3d", i+1 );
printf ( "\n\n" );
for ( i = 0; i < brojRedakaG; ++i )
{
printf ( "%3d ", i+1 );
for ( j = 0; j < brojStupacaG; ++j )
if ( minskoPoljeG[i][j] >= -1 && minskoPoljeG[i][j] <= 8 )
printf ( "%3c", '#' );
else if ( minskoPoljeG[i][j] == -2 )
printf ( "%3c", '.' );
else
printf ( "%3d", minskoPoljeG[i][j] % 10 );
printf ( "\n" );
}
}

if ( svrha )
{
for ( i = 0; i < brojRedakaG; ++i )
printf ( "%3d", i+1 );
printf ( "\n\n" );
for ( i = 0; i < brojRedakaG; ++i )
{
printf ( "%3d ", i+1 );
for ( j = 0; j < brojStupacaG; ++j )
if ( minskoPoljeG[i][j] >= 1 && minskoPoljeG[i][j] <= 8 )
printf ( "%3d", minskoPoljeG[i][j] );
else if ( minskoPoljeG[i][j] == -1 )
printf ( "%3c", '*' );
else if ( minskoPoljeG[i][j] == -2 || minskoPoljeG[i][j] == 0 )
printf ( "%3c", '.' );
else
printf ( "%3d", minskoPoljeG[i][j] % 10 );
printf ( "\n" );
}
if ( svrha == 1 )
printf ( "\nSORRY, IZGUBIO SI! POKUSAJ PONOVO!\n" );
else
{
kraj = clock();
printf ( "\n\nBRAVO! POBIJEDIO SI!!!\n" );
printf ( "Proteklo vrijeme je %ld sekundi.\n", (kraj-pocetak)/CLOCKS_PER_SEC );
}
system ( "PAUSE" );
exit( 1 );
}
}

void OslobodiPolja ( int red, int stupac )
{
if ( red < 0 || stupac < 0 || red == brojRedakaG || stupac == brojStupacaG )
return;

if ( minskoPoljeG[red][stupac] >= 11 && minskoPoljeG[red][stupac] <= 18 )
return;

if ( minskoPoljeG[red][stupac] == -2 )
return;

if ( minskoPoljeG[red][stupac] >= 1 && minskoPoljeG[red][stupac] <= 8 )
{
minskoPoljeG[red][stupac] += 10;
otvorenaPoljaG++;
return;
}
if ( minskoPoljeG[red][stupac] == -1 )
return;

if ( !minskoPoljeG[red][stupac] )
{
minskoPoljeG[red][stupac] = -2;
otvorenaPoljaG++;

OslobodiPolja( red+1, stupac );
OslobodiPolja( red-1, stupac );
OslobodiPolja( red, stupac+1 );
OslobodiPolja( red, stupac-1 );
OslobodiPolja( red+1, stupac+1 );
OslobodiPolja( red+1, stupac-1 );
OslobodiPolja( red-1, stupac+1 );
OslobodiPolja( red-1, stupac-1 );
}
}

void Provjera ( int red, int stupac )
{
if ( minskoPoljeG[red][stupac] == -1 )
IspisiPolje ( 1 );
else
OslobodiPolja( red, stupac );
}


void GenerirajPolje ( void )
{

int randRed, randStupac, i, j;
srand ( time(0) );

for ( i = 0; i < brojMinaG; ++i )
{
randRed = rand() % brojRedakaG;
randStupac = rand() % brojStupacaG;

minskoPoljeG[randRed][randStupac] = -1;
}

// PREBROJAVANJE MINA ********** POSTAVLJA VRIJEDNOSTI MATRICE

for ( i = 0; i < brojRedakaG; ++i )
for ( j = 0; j < brojStupacaG; ++j )
if ( minskoPoljeG[i][j] != -1 )
{
int brojacMina = 0;

if ( i+1 < brojRedakaG && minskoPoljeG[i+1][j] == -1 ) brojacMina++;
if ( j+1 < brojStupacaG && minskoPoljeG[i][j+1] == -1 ) brojacMina++;
if ( i > 0 && minskoPoljeG[i-1][j] == -1 ) brojacMina++;
if ( j > 0 && minskoPoljeG[i][j-1] == -1 ) brojacMina++;

if ( j+1 < brojStupacaG && i+1 < brojRedakaG && minskoPoljeG[i+1][j+1] == -1 ) brojacMina++;
if ( j > 0 && i+1 < brojRedakaG && minskoPoljeG[i+1][j-1] == -1 ) brojacMina++;
if ( j+1 < brojStupacaG && i > 0 && minskoPoljeG[i-1][j+1] == -1 ) brojacMina++;
if ( j > 0 && i > 0 && minskoPoljeG[i-1][j-1] == -1 ) brojacMina++;

minskoPoljeG[i][j] = brojacMina;
doPobjedeG++;
}
}

int main ( void )
{
int i;


printf ( "Unesite broj redaka: " );
scanf ( "%u", &brojRedakaG );
printf ( "Unesite broj stupaca: " );
scanf ( "%u", &brojStupacaG );
printf ( "Unesite broj mina (broj mina neka bude manji od 3/4 polja): " );
scanf ( "%u", &brojMinaG );

if ( brojMinaG > brojStupacaG * brojRedakaG * 3 / 4 )
{
printf ( "Ima previse mina! \n" );
system ( "PAUSE" );
return 1;
}

// ALOKACIJA MEMORIJE ZA MINSKO POLJE

minskoPoljeG = (short**)malloc ( brojRedakaG * sizeof(short*) );

for ( i = 0; i < brojRedakaG; ++i )
minskoPoljeG[i] = (short*)calloc ( brojStupacaG, sizeof(short) );

GenerirajPolje();

pocetak = clock();

while ( otvorenaPoljaG < doPobjedeG )
{
int red, stupac;
IspisiPolje( 0 );
printf ( "\nUnesite koordinate: " );
scanf ( "%u%u", &red, &stupac );
if ( red <= brojRedakaG && stupac <= brojStupacaG )
Provjera ( red-1, stupac-1 );
}

IspisiPolje( 2 );
return 0;
}


[/code:1]

Savjeti su dobrodosli.. mozda cemo jednog dana konkurirat Blizard-u :D

Pozdrav
Malo ti je ne citak kod pa mi se nije dalo citat. Nisam isprobavao dal tvoje radi ili ne. Very Happy

Zato sam napisao svoju verziju.

Nedostaci:
Ne može se obilježiti mina, te nisam provjeravao dali je mina vec na tom mjestu kad funkcija rand određuje poziciju mine, odnosno moze se desiti da dvije mine budu na istom mjestu, tj. broj mina se smanji... bio sam ljen to napravit.. ali to je trivić Very Happy

Prednosti:
Vrhunsko graficko sucelje, i neponovljiva zabava Very Happy

evo, pejstajte kod u vas Dev-cpp i uvjerite se sami Wink


Kod:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

short **minskoPoljeG;
int brojRedakaG, brojStupacaG, brojMinaG, doPobjedeG, otvorenaPoljaG;
clock_t pocetak, kraj;

void IspisiPolje ( int svrha )
{
    int i, j;
    system ( "CLS" );
    printf ( "    " );
   
    if ( !svrha )
    {
        for ( i = 0; i < brojRedakaG; ++i )
            printf ( "%3d", i+1 );
        printf ( "\n\n" );   
        for ( i = 0; i < brojRedakaG; ++i )
        {   
            printf ( "%3d ", i+1 );
            for ( j = 0; j < brojStupacaG; ++j )
                if ( minskoPoljeG[i][j] >= -1 && minskoPoljeG[i][j] <= 8 )
                    printf ( "%3c", '#' );
                else if ( minskoPoljeG[i][j] == -2 )
                    printf ( "%3c", '.' );
                else 
                    printf ( "%3d", minskoPoljeG[i][j] % 10  );
            printf ( "\n" );
        }
    }
   
    if ( svrha )
    {
        for ( i = 0; i < brojRedakaG; ++i )
            printf ( "%3d", i+1 );
        printf ( "\n\n" );   
        for ( i = 0; i < brojRedakaG; ++i )
        {   
            printf ( "%3d ", i+1 );
            for ( j = 0; j < brojStupacaG; ++j )
                if ( minskoPoljeG[i][j] >= 1 && minskoPoljeG[i][j] <= 8 )
                    printf ( "%3d", minskoPoljeG[i][j] );
                else if ( minskoPoljeG[i][j] == -1 )
                    printf ( "%3c", '*' );
                else if ( minskoPoljeG[i][j] == -2 || minskoPoljeG[i][j] == 0 )
                    printf ( "%3c", '.' );
                else 
                    printf ( "%3d", minskoPoljeG[i][j] % 10  );
            printf ( "\n" );
        }
        if ( svrha == 1 )
            printf ( "\nSORRY, IZGUBIO SI! POKUSAJ PONOVO!\n" );
        else
        {
            kraj = clock();
            printf ( "\n\nBRAVO! POBIJEDIO SI!!!\n" );
            printf ( "Proteklo vrijeme je %ld sekundi.\n", (kraj-pocetak)/CLOCKS_PER_SEC );
        }
        system ( "PAUSE" );
        exit( 1 );
    }
}

void OslobodiPolja ( int red, int stupac )
{
    if ( red < 0 || stupac < 0 || red == brojRedakaG || stupac == brojStupacaG )
        return;
   
    if ( minskoPoljeG[red][stupac] >= 11 && minskoPoljeG[red][stupac] <= 18 )
        return;
   
    if ( minskoPoljeG[red][stupac] == -2 )
        return;
   
    if ( minskoPoljeG[red][stupac] >= 1 && minskoPoljeG[red][stupac] <= 8 )
    {   
        minskoPoljeG[red][stupac] += 10;
        otvorenaPoljaG++;
        return;
    }
    if ( minskoPoljeG[red][stupac] == -1 )
        return;
       
    if ( !minskoPoljeG[red][stupac] )
    {   
        minskoPoljeG[red][stupac] = -2;
        otvorenaPoljaG++;
       
        OslobodiPolja( red+1, stupac );
        OslobodiPolja( red-1, stupac );
        OslobodiPolja( red, stupac+1 );
        OslobodiPolja( red, stupac-1 );
        OslobodiPolja( red+1, stupac+1 );
        OslobodiPolja( red+1, stupac-1 );
        OslobodiPolja( red-1, stupac+1 );
        OslobodiPolja( red-1, stupac-1 );
    }
}

void Provjera ( int red, int stupac )
{
    if ( minskoPoljeG[red][stupac] == -1 )
        IspisiPolje ( 1 );
    else
        OslobodiPolja( red, stupac );   
}


void GenerirajPolje ( void )
{
   
    int randRed, randStupac, i, j;
    srand ( time(0) );
   
    for ( i = 0; i < brojMinaG; ++i )
    {
        randRed = rand() % brojRedakaG;
        randStupac = rand() % brojStupacaG;
   
        minskoPoljeG[randRed][randStupac] = -1;
    }
   
    // PREBROJAVANJE MINA ********** POSTAVLJA VRIJEDNOSTI MATRICE
   
    for ( i = 0; i < brojRedakaG; ++i )   
        for ( j = 0; j < brojStupacaG; ++j )
            if ( minskoPoljeG[i][j] != -1 )
            {
                int brojacMina = 0;
                   
                if ( i+1 < brojRedakaG && minskoPoljeG[i+1][j] == -1 ) brojacMina++;
                if ( j+1 < brojStupacaG && minskoPoljeG[i][j+1] == -1 ) brojacMina++;
                if ( i > 0 && minskoPoljeG[i-1][j] == -1 ) brojacMina++;
                if ( j > 0 && minskoPoljeG[i][j-1] == -1 ) brojacMina++;
               
                if ( j+1 < brojStupacaG && i+1 < brojRedakaG && minskoPoljeG[i+1][j+1] == -1 ) brojacMina++;
                if ( j > 0 && i+1 < brojRedakaG && minskoPoljeG[i+1][j-1] == -1 ) brojacMina++;
                if ( j+1 < brojStupacaG && i > 0 && minskoPoljeG[i-1][j+1] == -1 ) brojacMina++;
                if ( j > 0 && i > 0 && minskoPoljeG[i-1][j-1] == -1 ) brojacMina++;
               
                minskoPoljeG[i][j] = brojacMina;
                doPobjedeG++;   
            }       
}

int main ( void )
{
    int i;

   
    printf ( "Unesite broj redaka: " );
    scanf ( "%u", &brojRedakaG );
    printf ( "Unesite broj stupaca: " );
    scanf ( "%u", &brojStupacaG );
    printf ( "Unesite broj mina (broj mina neka bude manji od 3/4 polja): " );
    scanf ( "%u", &brojMinaG );
   
    if ( brojMinaG > brojStupacaG * brojRedakaG * 3 / 4 )
    {
        printf ( "Ima previse mina! \n" );
        system ( "PAUSE" );
        return 1;
    }
   
    // ALOKACIJA MEMORIJE ZA MINSKO POLJE
   
    minskoPoljeG = (short**)malloc ( brojRedakaG * sizeof(short*) );
   
    for ( i = 0; i < brojRedakaG; ++i )
        minskoPoljeG[i] = (short*)calloc ( brojStupacaG, sizeof(short) );
   
    GenerirajPolje();
   
    pocetak = clock();           
   
    while ( otvorenaPoljaG < doPobjedeG )
    {
        int red, stupac;
        IspisiPolje( 0 );
        printf ( "\nUnesite koordinate: " );
        scanf ( "%u%u", &red, &stupac );
        if ( red <= brojRedakaG && stupac <= brojStupacaG )
            Provjera ( red-1, stupac-1 );
    }
   
    IspisiPolje( 2 );
    return 0;
}




Savjeti su dobrodosli.. mozda cemo jednog dana konkurirat Blizard-u Very Happy

Pozdrav



_________________
reductio ad absurdum
[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
ambrozije
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 29. 09. 2008. (19:18:04)
Postovi: (2C)16
Sarma = la pohva - posuda
= 8 - 3

PostPostano: 14:13 sri, 6. 5. 2009    Naslov: Citirajte i odgovorite

igrao sam :)
igrao sam Smile


[Vrh]
Korisnički profil Pošaljite privatnu poruku
markotron
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 26. 10. 2008. (12:07:29)
Postovi: (95)16
Spol: kućni ljubimac
Sarma = la pohva - posuda
= 28 - 28
Lokacija: Umag

PostPostano: 14:39 sri, 6. 5. 2009    Naslov: Citirajte i odgovorite

I? Jesi uzivao :D

BTW. Zildyan, krivo ti otvara polja. Dosta utjece na igru. :D
I? Jesi uzivao Very Happy

BTW. Zildyan, krivo ti otvara polja. Dosta utjece na igru. Very Happy



_________________
reductio ad absurdum
[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
maxic
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 10. 02. 2009. (20:11:13)
Postovi: (45)16
Sarma = la pohva - posuda
19 = 23 - 4

PostPostano: 16:11 sri, 6. 5. 2009    Naslov: Citirajte i odgovorite

svak čast markotron

ovo je prvi put da sam vidio da C služi nečemu
svak čast markotron

ovo je prvi put da sam vidio da C služi nečemu


[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
barbarag
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 27. 03. 2008. (14:54:10)
Postovi: (29)16
Sarma = la pohva - posuda
= 4 - 2

PostPostano: 16:25 sri, 6. 5. 2009    Naslov: Citirajte i odgovorite

[quote="maxic"]

ovo je prvi put da sam vidio da C služi nečemu[/quote]

potpisujem :bat:
maxic (napisa):


ovo je prvi put da sam vidio da C služi nečemu


potpisujem Sismis



_________________
uvijek postoje iznimke!
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Bubba
Forumaš s poteškoćama u pisanju
Forumaš s poteškoćama u pisanju


Pridružen/a: 17. 11. 2006. (18:09:12)
Postovi: (53)16
Spol: muško
Sarma = la pohva - posuda
10 = 27 - 17

PostPostano: 16:26 sri, 6. 5. 2009    Naslov: Citirajte i odgovorite

[quote="maxic"]ovo je prvi put da sam vidio da C služi nečemu[/quote]Huh, kako ces se tek osjecati kad na C-u okrenes prvih $10k? ;)

No, sto mislis da ovo prije sto si gledao a "nije sluzilo nicemu" nije iskoristeno u ovome sto "sluzi necemu"? :)

[i]Edit: [/i]Bacih oko malo na kod, evo i koji komentar.

@oboje
* kod vam je vizualno ruzan. Ajde, lako sto je nekom drugom ruzan, ali ne vjerujem da je ni vama intuitivan i lako citljiv. Koristite uvlake, budite dosljedni i pokusajte komentirati bitnije dijelove - mozda ce i vama dobro doci nakon x vremena negledanja u kod.
* obzirom da se radi o "ozbiljnijem" programu, razmislite o provjerama [i]scanf();[/i] i [i]malloc();[/i] funkcija (imate primjer [url=http://degiorgi.math.hr/forum/viewtopic.php?p=115115#115115]ovdje[/url], a pogledajte sto vracaju [i]scanf();[/i] i [i]malloc();[/i])

@Zildyan
* koristi dinamicku alokaciju. Lako je. :)
* includeao si [i]conio.h[/i] koji je DOS specificna biblioteka i nema veze s ANSI C-om kojeg koristite na kolegiju (a i opcenito je manje vise bezveze), a sto je najbolje od svega, uopce je ne koristis?
* ako vec moras trositi [i]system();[/i], koristi ga s [i]#ifdef[/i] preprocesorom. Program ti izgleda ruzno kompajliran na non-windows racunalima.

@ markotron
* koristis [i]malloc();[/i] a nisi oslobodio zauzetu memoriju ([i]free();[/i]).
* imas neki poseban razlog zasto koristis calloc kod deklariranja druge dimenzije polja?
* pogledaj ovaj dio koda:
[code:1]minskoPoljeG = (short**)malloc ( brojRedakaG * sizeof(short*) );
for ( i = 0; i < brojRedakaG; ++i )
minskoPoljeG[i] = (short*)calloc ( brojStupacaG, sizeof(short) ); [/code:1]
pokusaj ga koncipirati ovako:
[code:1]minskoPoljeG = malloc ( brojRedakaG * sizeof *minskoPoljeG );
for ( i = 0; i < brojRedakaG; ++i )
minskoPoljeG[i] = malloc ( brojStupacaG, sizeof *minskoPoljeG[i];[/code:1]
[list]-> sizeof [i]tip podatka[/i] i sizeof *[i]varijabla[/i] ce ti u nacelu dati istu stvar, ali dobivas u dva pogleda
a) ako hoces promijeniti tip varijable iz short u nesto drugo (u tvom konkretnom slucaju), potrebno je samo promijeniti deklaraciju
b) mices cast malloca, koji je potreban u rijetkim i nezgodnim situacijama u C-u. Takodjer, u nekim C90 specificnim slucajevima na arhitekturama gdje je [i]'int'[/i] jednako velik kao i [i]'void*'[/i], castom ces ugasiti diagnostiku sto bi moglo dovesti do gadnih problema u daljnjem programiranju i debugiranju[/list:u]Eto, HTH,

Bubba
maxic (napisa):
ovo je prvi put da sam vidio da C služi nečemu
Huh, kako ces se tek osjecati kad na C-u okrenes prvih $10k? Wink

No, sto mislis da ovo prije sto si gledao a "nije sluzilo nicemu" nije iskoristeno u ovome sto "sluzi necemu"? Smile

Edit: Bacih oko malo na kod, evo i koji komentar.

@oboje
* kod vam je vizualno ruzan. Ajde, lako sto je nekom drugom ruzan, ali ne vjerujem da je ni vama intuitivan i lako citljiv. Koristite uvlake, budite dosljedni i pokusajte komentirati bitnije dijelove - mozda ce i vama dobro doci nakon x vremena negledanja u kod.
* obzirom da se radi o "ozbiljnijem" programu, razmislite o provjerama scanf(); i malloc(); funkcija (imate primjer ovdje, a pogledajte sto vracaju scanf(); i malloc();)

@Zildyan
* koristi dinamicku alokaciju. Lako je. Smile
* includeao si conio.h koji je DOS specificna biblioteka i nema veze s ANSI C-om kojeg koristite na kolegiju (a i opcenito je manje vise bezveze), a sto je najbolje od svega, uopce je ne koristis?
* ako vec moras trositi system();, koristi ga s #ifdef preprocesorom. Program ti izgleda ruzno kompajliran na non-windows racunalima.

@ markotron
* koristis malloc(); a nisi oslobodio zauzetu memoriju (free();).
* imas neki poseban razlog zasto koristis calloc kod deklariranja druge dimenzije polja?
* pogledaj ovaj dio koda:
Kod:
minskoPoljeG = (short**)malloc ( brojRedakaG * sizeof(short*) );
for ( i = 0; i < brojRedakaG; ++i )
     minskoPoljeG[i] = (short*)calloc ( brojStupacaG, sizeof(short) );

pokusaj ga koncipirati ovako:
Kod:
minskoPoljeG = malloc ( brojRedakaG * sizeof *minskoPoljeG  );
for ( i = 0; i < brojRedakaG; ++i )
     minskoPoljeG[i] = malloc ( brojStupacaG, sizeof *minskoPoljeG[i];

    → sizeof tip podatka i sizeof *varijabla ce ti u nacelu dati istu stvar, ali dobivas u dva pogleda
    a) ako hoces promijeniti tip varijable iz short u nesto drugo (u tvom konkretnom slucaju), potrebno je samo promijeniti deklaraciju
    b) mices cast malloca, koji je potreban u rijetkim i nezgodnim situacijama u C-u. Takodjer, u nekim C90 specificnim slucajevima na arhitekturama gdje je 'int' jednako velik kao i 'void*', castom ces ugasiti diagnostiku sto bi moglo dovesti do gadnih problema u daljnjem programiranju i debugiranju
Eto, HTH,

Bubba



_________________
Biolozi misle da su kemičari. Kemičari misle da su fizičari. Fizičari misle da su bogovi. A Bog misli da je matematičar...
§ http://math2.ath.cx §
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
markotron
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 26. 10. 2008. (12:07:29)
Postovi: (95)16
Spol: kućni ljubimac
Sarma = la pohva - posuda
= 28 - 28
Lokacija: Umag

PostPostano: 17:49 sri, 6. 5. 2009    Naslov: Citirajte i odgovorite

Priznajem.. kod mi je ruzan, i to dosta.. Ali, razlog je tome, dugacka imena varijabli, te dugacki if-ovi. Sto su, nazalost, ovdje neizbjezni.

Primjeti, da mi je svaki dio koda tocno uvucen kako treba (jednim tabom) svaka viticasta zagrada je u svom redu (sto je po meni preglednije u suceljima koji nemaju mogucnost sakrivanja takvih blokova), te zagrede pisem ovako: ( a > b ), dakle sa razmacima, sto (po mome misljenju) doprinosi citljivosti koda.

Dodatno: svaka varijabla pocinje malim slovom, te ukoliko se ime sastoji od vise rijeci rijeci su spojene ali nova rijec pocinje velikim slovom. Funkcije pocinju velikim slovom ( tako se dodatno razlikuju od varijabli ). I jos mi svaka globalna varijabla zavrsava slovom G, tako se razlikuju od lokalnih u samom kodu. Komentare pisem, ali ne pretjerano, jer su mi imena varijabli dovoljno sugestivna, kao i imena funkcija.

Znam da je jako dobra navika koristiti free() funkciju, ali meni polje alocirano dinamicki, treba do kraja programa, dakle do return 0 ili exit( 1 ) polje mi je potrebno (radi ispisa), pa nije tako strasno sto nisam korisio free(), ali priznajem... zaboravio sam :D

Korisim calloc da bi mi se matrica napunila nulama, jer i ovako je polje vecinom napunjeno nulama. (znam da bi mi se i ovako i onako napunilo nulama, no to nisam znao kad sam poceo radit program, a kako sam tek na vjezbama nacuio dinamicki alocirat memoriju, kao i koristiti funkciju sizeof, nisam upucen u to je li calloc sporija, stovise, receno je da su identitcne osim nula.)

Evo, cak prvi put vidim da se sizeof moze koristiti u ovakvoj sintaksi.
Al nije mi najjasnije koja je razlika. Pa ako ti se da malo bolje pojasnit bit ce mi drago.

A program mi pak nije dovoljno ozbiljan, za provjeru scanf funkcija :D
malloc sam mogao, ali sam izostavio. #ifdef ne znam koristiti, a ne znam ni cemu sluzi :D

Inace hvala na savjetima :D

Pozdrav.
Priznajem.. kod mi je ruzan, i to dosta.. Ali, razlog je tome, dugacka imena varijabli, te dugacki if-ovi. Sto su, nazalost, ovdje neizbjezni.

Primjeti, da mi je svaki dio koda tocno uvucen kako treba (jednim tabom) svaka viticasta zagrada je u svom redu (sto je po meni preglednije u suceljima koji nemaju mogucnost sakrivanja takvih blokova), te zagrede pisem ovako: ( a > b ), dakle sa razmacima, sto (po mome misljenju) doprinosi citljivosti koda.

Dodatno: svaka varijabla pocinje malim slovom, te ukoliko se ime sastoji od vise rijeci rijeci su spojene ali nova rijec pocinje velikim slovom. Funkcije pocinju velikim slovom ( tako se dodatno razlikuju od varijabli ). I jos mi svaka globalna varijabla zavrsava slovom G, tako se razlikuju od lokalnih u samom kodu. Komentare pisem, ali ne pretjerano, jer su mi imena varijabli dovoljno sugestivna, kao i imena funkcija.

Znam da je jako dobra navika koristiti free() funkciju, ali meni polje alocirano dinamicki, treba do kraja programa, dakle do return 0 ili exit( 1 ) polje mi je potrebno (radi ispisa), pa nije tako strasno sto nisam korisio free(), ali priznajem... zaboravio sam Very Happy

Korisim calloc da bi mi se matrica napunila nulama, jer i ovako je polje vecinom napunjeno nulama. (znam da bi mi se i ovako i onako napunilo nulama, no to nisam znao kad sam poceo radit program, a kako sam tek na vjezbama nacuio dinamicki alocirat memoriju, kao i koristiti funkciju sizeof, nisam upucen u to je li calloc sporija, stovise, receno je da su identitcne osim nula.)

Evo, cak prvi put vidim da se sizeof moze koristiti u ovakvoj sintaksi.
Al nije mi najjasnije koja je razlika. Pa ako ti se da malo bolje pojasnit bit ce mi drago.

A program mi pak nije dovoljno ozbiljan, za provjeru scanf funkcija Very Happy
malloc sam mogao, ali sam izostavio. #ifdef ne znam koristiti, a ne znam ni cemu sluzi Very Happy

Inace hvala na savjetima Very Happy

Pozdrav.



_________________
reductio ad absurdum
[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
Zildyan
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 28. 07. 2008. (13:41:39)
Postovi: (20)16
Sarma = la pohva - posuda
= 3 - 3

PostPostano: 22:17 sri, 6. 5. 2009    Naslov: Citirajte i odgovorite

znam da sam pogrisija negdi sa rekurzijom...morat cu opet malo promuckati glavom...nije mi se dalo...problem je bio sto nisam stavio algoritam na papir..pa sam non stop dodavao nove ideje, mjenjao koncept, radio sve napamet...tako da je kod ispao katastrofa...e i conio sam ukljucio iz neznanja, jer sam na netu trazio primjer funkcije rand (jer se u vjezbama samo spominje) pa je u tom kodu bila bio inkludan conio...alokaciju nisam koristio cisto zato jer sam mislio da nije potrebno pisati 3,4 reda vise :lol: malo san lin...ali sredit cu to sutra jer san sad umoran pa stavim... e i svaka cast markotron...morat cu prouciti i tvoj kod malo, da malo naucim ;)
znam da sam pogrisija negdi sa rekurzijom...morat cu opet malo promuckati glavom...nije mi se dalo...problem je bio sto nisam stavio algoritam na papir..pa sam non stop dodavao nove ideje, mjenjao koncept, radio sve napamet...tako da je kod ispao katastrofa...e i conio sam ukljucio iz neznanja, jer sam na netu trazio primjer funkcije rand (jer se u vjezbama samo spominje) pa je u tom kodu bila bio inkludan conio...alokaciju nisam koristio cisto zato jer sam mislio da nije potrebno pisati 3,4 reda vise Laughing malo san lin...ali sredit cu to sutra jer san sad umoran pa stavim... e i svaka cast markotron...morat cu prouciti i tvoj kod malo, da malo naucim Wink


[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan