Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Zildyan Forumaš(ica)

Pridružen/a: 28. 07. 2008. (13:41:39) Postovi: (20)16
|
Postano: 19:16 uto, 5. 5. 2009 Naslov: |
|
|
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 ) 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
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] |
|
markotron Forumaš(ica)

Pridružen/a: 26. 10. 2008. (12:07:29) Postovi: (95)16
Spol: 
Lokacija: Umag
|
Postano: 23:25 uto, 5. 5. 2009 Naslov: |
|
|
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.
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ć
Prednosti:
Vrhunsko graficko sucelje, i neponovljiva zabava
evo, pejstajte kod u vas Dev-cpp i uvjerite se sami
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
Pozdrav
_________________ reductio ad absurdum
|
|
[Vrh] |
|
ambrozije Forumaš(ica)

Pridružen/a: 29. 09. 2008. (19:18:04) Postovi: (2C)16
|
|
[Vrh] |
|
markotron Forumaš(ica)

Pridružen/a: 26. 10. 2008. (12:07:29) Postovi: (95)16
Spol: 
Lokacija: Umag
|
|
[Vrh] |
|
maxic Forumaš(ica)

Pridružen/a: 10. 02. 2009. (20:11:13) Postovi: (45)16
|
|
[Vrh] |
|
barbarag Forumaš(ica)

Pridružen/a: 27. 03. 2008. (14:54:10) Postovi: (29)16
|
|
[Vrh] |
|
Bubba Forumaš s poteškoćama u pisanju


Pridružen/a: 17. 11. 2006. (18:09:12) Postovi: (53)16
Spol: 
|
Postano: 16:26 sri, 6. 5. 2009 Naslov: |
|
|
[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?
No, sto mislis da ovo prije sto si gledao a "nije sluzilo nicemu" nije iskoristeno u ovome sto "sluzi necemu"?
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.
* 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] |
|
markotron Forumaš(ica)

Pridružen/a: 26. 10. 2008. (12:07:29) Postovi: (95)16
Spol: 
Lokacija: Umag
|
Postano: 17:49 sri, 6. 5. 2009 Naslov: |
|
|
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
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
malloc sam mogao, ali sam izostavio. #ifdef ne znam koristiti, a ne znam ni cemu sluzi
Inace hvala na savjetima
Pozdrav.
_________________ reductio ad absurdum
|
|
[Vrh] |
|
Zildyan Forumaš(ica)

Pridružen/a: 28. 07. 2008. (13:41:39) Postovi: (20)16
|
Postano: 22:17 sri, 6. 5. 2009 Naslov: |
|
|
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 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
|
|
[Vrh] |
|
|